mirror of
https://github.com/mborgerding/kissfft.git
synced 2025-05-27 21:20:27 -04:00
80 lines
2.9 KiB
Plaintext
80 lines
2.9 KiB
Plaintext
KISS FFT - A power-of-two Fast Fourier Transform based up on the principle,
|
|
"Keep It Simple, Stupid."
|
|
|
|
There are many great fft libraries already around. Kiss FFT is not trying
|
|
to be better than any of them. It only attempts to be a reasonably efficient,
|
|
moderately useful FFT that can use fixed or floating data types and can be
|
|
incorporated into someone's C program in a few minutes with trivial licensing.
|
|
|
|
USAGE:
|
|
|
|
The basic usage is:
|
|
|
|
void * cfg = kiss_fft_alloc( nfft ,inverse_fft );
|
|
while ...
|
|
...
|
|
kiss_fft( cfg , cx_buf_in_out );
|
|
...
|
|
free(cfg);
|
|
|
|
Declarations are in "kiss_fft.h", along with a brief description of the
|
|
two functions you'll need to use. Code definitions are in kiss_fft.c, along
|
|
with sample usage code.
|
|
|
|
|
|
The code can be easily recompiled to work with 16bit fixed point data,
|
|
or various floating point types. The default is float.
|
|
|
|
|
|
BACKGROUND:
|
|
|
|
I started coding this because I couldn't find a fixed point FFT that didn't
|
|
use assembly code. I started with floating point numbers so I could get the
|
|
theory straight before working on fixed point issues. In the end, I had a
|
|
little bit of code that could be recompiled easily to do ffts with short, float,
|
|
or double (other types should be easy too).
|
|
|
|
Once I got my FFT working, I wanted to get some performance numbers against
|
|
a well respected and highly optimized fft library. I don't want to criticize
|
|
this great library, so let's call it FFT_BRANDX.
|
|
During this process, I learned:
|
|
|
|
1. FFT_BRANDX has 500 times as many lines of code as Kiss
|
|
(and that's just the C code).
|
|
2. It took me an embarrassingly long time to get FFT_BRANDX working.
|
|
3. FFT_BRANDX is almost 3 times faster than Kiss
|
|
|
|
It is wonderful that free, highly optimized libraries like FFT_BRANDX exist.
|
|
But such libraries carry a huge burden of complexity necessary to extract every
|
|
last bit of performance.
|
|
|
|
Sometimes simpler is better, even if it's not better.
|
|
|
|
PERFORMANCE:
|
|
(on Athlon XP 2100+, with gcc 2.96, optimization O3, float data type)
|
|
|
|
Kiss performed 1000 1024-pt ffts in 136 ms. This translates to 7.5 Msamples/s.
|
|
Just for comparison, it took md5sum 160 ms to process the same amount of data
|
|
|
|
DO NOT:
|
|
... use Kiss if you need the absolute fastest fft in the world
|
|
... use Kiss if you need mixed radix FFTs
|
|
... ask me to add features that will bloat the code
|
|
|
|
UNDER THE HOOD:
|
|
|
|
Kiss uses a complex-only, frequency decimation, radix 2, in-place FFT. Bit reversed
|
|
addressing is corrected as the last step in the transform. No scaling is done.
|
|
|
|
LICENSE:
|
|
BSD, see COPYING for details.
|
|
|
|
TODO:
|
|
Make the fixed point scaling and bit shifts more easily configurable.
|
|
Document/revisit the input/output fft scaling
|
|
See if the fixed point code can be optimized a little without adding complexity.
|
|
|
|
AUTHOR:
|
|
Mark Borgerding
|
|
mark@borgerding.net
|