mirror of
https://github.com/mborgerding/kissfft.git
synced 2025-07-18 21:14:24 -04:00
Initial revision
This commit is contained in:
79
README
Normal file
79
README
Normal file
@ -0,0 +1,79 @@
|
||||
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
|
Reference in New Issue
Block a user