Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/berndporr/kiss-fft
A compact FFT library in C with an Android JNI wrapper
https://github.com/berndporr/kiss-fft
android android-library c complex fft fft-library jni jni-android jni-wrapper kiss-fft-library
Last synced: 4 days ago
JSON representation
A compact FFT library in C with an Android JNI wrapper
- Host: GitHub
- URL: https://github.com/berndporr/kiss-fft
- Owner: berndporr
- License: bsd-3-clause
- Created: 2017-12-22T21:21:40.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2021-04-29T22:46:01.000Z (over 3 years ago)
- Last Synced: 2024-07-30T16:53:51.104Z (4 months ago)
- Topics: android, android-library, c, complex, fft, fft-library, jni, jni-android, jni-wrapper, kiss-fft-library
- Language: C++
- Homepage:
- Size: 1.54 MB
- Stars: 81
- Watchers: 5
- Forks: 11
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG
- License: LICENSE
Awesome Lists containing this project
README
# KISS FFT
KISS FFT - A mixed-radix Fast Fourier Transform in C with an Android
JNI wrapper.## In C
### Complex to Complex FFT and IFFT
The basic usage for 1-d complex FFT is:
```
#include "kiss_fft.h"kiss_fft_cfg cfg = kiss_fft_alloc( nfft, is_inverse_fft );
kiss_fft_cpx *cx_in = new kiss_fft_cpx[nfft];
kiss_fft_cpx *cx_out = new kiss_fft_cpx[nfft];
// put kth sample in cx_in[k].r and cx_in[k].i
kiss_fft( cfg , cx_in , cx_out );
// transformed. DC is in cx_out[0].r and cx_out[0].i
free(cfg);
delete[] cx_in;
delete[] cx_out;
```
* `nfft` is the number of samples in both time- and frequency domain
* `is_inverse` is 0 for the forward transform and 1 for the inverse
* `cx_in` and `cx_out` are arrays of `nfft` samples
* Frequency domain: `cx_out[0]` is the DC bin of the FFT and `cx_out[nfft/2]`
is the Nyquist bin (if exists).
* Files: `kiss_fft.h`, `kiss_fft.cpp` and `_kiss_fft_guts.h`.### Real valued FFT
A real valued optimized FFT which takes real valued signals as its input is implemtned in `kiss_fftr.h` and `kiss_fftr.cpp`. It returns the positive half-spectrum: (nfft/2+1) complex frequency bins.
#### Real signal to complex frequencies transform
```
#include "kiss_fftr.h"kiss_fftr_cfg cfg = kiss_fftr_alloc(nfft, 0);
double *cx_in = new kiss_fft_scalar[nfft];
kiss_fft_cpx *cx_out = new kiss_fft_cpx[nfft/2+1];// put `nfft` samples in cx_in[k]
kiss_fftr(cfg, cx_in, cx_out);
// Process the spectrum `cx_out` here: We have `nfft/2+1` (!) samples.
free(cfg);
delete[] cx_in;
delete[] cx_out;
```#### Complex frequencies to real signal transform
```
#include "kiss_fftr.h"kiss_fftr_cfg cfg = kiss_fftr_alloc(nfft, 1);
kiss_fft_cpx *cx_in = new kiss_fft_cpx[nfft/2+1];
double *cx_out = new kiss_fft_scalar[nfft];// put kth frequency sample in cx_in[k] up to index `nfft/2`.
// No need to populate the mirror.kiss_fftr(cfg, cx_in, cx_out);
// Process signal `cx_out` here. It has again `nfft` samples
// and is real valued.
free(cfg);
delete[] cx_in;
delete[] cx_out;
```### Installation / Usage
The library is so small that you can directly include the sources in your
project or you can pre-package it as a static library and then link it
into your project. Create the static library (with the help of cmake):
```
cmake .
make
make install
```
which is installed in the usual places (e.g. `/usr/local/lib` and
`/usr/local/include`) and is called `libkiss-fft.a`.## Android
Super-fast native FFTs under Android.### Compilation
Open this project in Android studio and run "Build". Depending
on the config you'll generate a debug version of the kiss-fft
library or a release version.### Installation
The Android library is in `jnifft/build/outputs/`.
Just import it into your Android project with "New-Module-Android Library" and add
the dependency with
```
compile project(":jnifft-release")
```### Complex to Complex transform
```
kissFastFourierTransformer = new KISSFastFourierTransformer();
Complex[] outdata = kissFastFourierTransformer.transform(indata, TransformType.FORWARD);
```
which transforms from Complex to Complex as defined in the apache Commons.
The constant `TransformType` is also defined in apache Commons which determines
if it's a forward or inverse transform. It can be used as a direct
replacement of the apache commons FFT function.There are also convenience functions as implemented in the apache commons library for double and Double which perform the conversion to Complex in C++. The function for the primitive type double is slightly faster than the one with Double.
### Real to Complex and Complex to Real transform
For real valued sequences there are two optimised functions which
directly perform the FFT on the raw `double` buffer without any
conversion to `Complex`. For such real valued sequences this runs at least
twice as fast as the Complex FFT functions above.
The complex frequency sequence of the real sequence of length N has the length
N/2+1 and then expands back to length N by the inverse transform:
```
public Complex[] transformRealOptimisedForward(double[] v)
public double[] transformRealOptimisedInverse(Complex[] v)
```### Unit tests (Android vs C)
Run `FFTTest` and `FFTRTest` which compare the results to that from the
apache commons FFT functions and perform an ifft(fft) test to
check for rounding errors.## Attribution
This is a fork, stripped down and further debugged version of the original kiss-fft library by Mark Borgerding .