diff --git a/Makefile b/Makefile index ee8f99e..02e8b8c 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ message: - @echo "Nothing to make here. Move on down to sample_code for ... you guessed it! Sample Code!" + @echo "Nothing to make here. Move on down to sample_code for ... " + @echo "real FFTs, 2-d FFTs and you guessed it! Sample Code!" tarball: clean find | grep -i -v cvs | zip kiss_fft.zip -@ diff --git a/_kiss_fft_guts.h b/_kiss_fft_guts.h index 6e24f89..df61c2d 100644 --- a/_kiss_fft_guts.h +++ b/_kiss_fft_guts.h @@ -93,7 +93,5 @@ void kf_work( ); /* a debugging function */ -static void pcpx( kiss_fft_cpx * c) -{ - fprintf(stderr,"%g + %gi\n",(double)(c->r),(double)(c->i) ); -} +#define pcpx(c)\ + fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) diff --git a/kiss_fft.h b/kiss_fft.h index 86b881f..266e944 100644 --- a/kiss_fft.h +++ b/kiss_fft.h @@ -6,11 +6,17 @@ #include #include +/* + ATTENTION! + If you would like a real-only FFT, see sample_code/kiss_fftr.c and .h + If you would like a 2-dimensional FFT, see sample_code/kiss_fft2d.c and .h + */ #ifdef FIXED_POINT # define kiss_fft_scalar short #else # ifndef kiss_fft_scalar +/* default is float */ # define kiss_fft_scalar float # endif #endif @@ -57,28 +63,8 @@ void* kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); void kiss_fft(const void * cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); -/* allocate a 2-dimensional FFT - the data should be stored rowwise, - in other words, an array made up of row[0], then row[1], etc - */ -void * kiss_fft2d_alloc(int nrows,int ncols,int inverse_fft,void * mem,size_t * lenmem); -void kiss_fft2d(const void* cfg_from_alloc , const kiss_fft_cpx *fin,kiss_fft_cpx *fout ); - -/* Real optimized version can save about 45% cpu time vs. complex fft of a real seq. - */ -void * kiss_fftr_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem); -void kiss_fftr(const void * cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata); -void kiss_fftri(const void * cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata); - -/* 2d Real optimized version - */ -void * kiss_fftr2d_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem); -void kiss_fftr2d(const void * cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata); -void kiss_fftr2di(const void * cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata); - - - -/* when done with the cfg for a given fft size and direction, simply free it*/ +/* If kiss_fft_alloc allocated a buffer, it is one contiguous + buffer and can be simply free()d when no longer needed*/ #define kiss_fft_free free #endif diff --git a/test/Makefile b/test/Makefile index 3844755..c0471e7 100644 --- a/test/Makefile +++ b/test/Makefile @@ -4,7 +4,6 @@ endif ifeq "$(NUMFFTS)" "" NUMFFTS=10000 endif -NROWS=30 ifeq "$(DATATYPE)" "" DATATYPE=float @@ -32,7 +31,7 @@ CFLAGS=-Wall -O3 $(SELFTEST): ../kiss_fft.c $(SELFTESTSRC) $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ -$(TESTREAL): ../kiss_fft.c ../kiss_fftr.c test_real.c +$(TESTREAL): ../kiss_fft.c kiss_fftr.c test_real.c $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ $(BENCHKISS): benchkiss.c ../kiss_fft.c pstats.c @@ -41,30 +40,24 @@ $(BENCHKISS): benchkiss.c ../kiss_fft.c pstats.c $(BENCHFFTW): benchfftw.c pstats.c @$(CC) -o $@ $(CFLAGS) -DDATATYPE$(DATATYPE) benchfftw.c pstats.c -lm -lfftw3f -lfftw3 -L /usr/local/lib/ || echo "FFTW not available for comparison" -POW2=256 512 1024 2048 4096 8192 -POW3=243 729 2187 -POW5=25 125 625 3125 - -mtime: all - @for n in $(POW2) $(POW3) $(POW5) ;do \ - echo ============================;\ - ./$(BENCHKISS) -x $(NUMFFTS) -n $$n;\ - [ -x ./$(BENCHFFTW) ] && ./$(BENCHFFTW) -x $(NUMFFTS) -n $$n || true ; \ - done - -test: all $(TESTREAL) - @echo "======SELF TEST" +test: all + @echo "======SELF TEST $(DATATYPE)" @./$(SELFTEST) - @echo "======REAL FFT TEST" + @echo "======REAL FFT TEST $(DATATYPE)" @./$(TESTREAL) - @echo "======TIMING TEST" + @echo "======TIMING TEST $(DATATYPE)" @./$(BENCHKISS) -x $(NUMFFTS) -n $(NFFT) @[ -x ./$(BENCHFFTW) ] && ./$(BENCHFFTW) -x $(NUMFFTS) -n $(NFFT) ||true +testall: + @(export DATATYPE=double && make test ) + @(export DATATYPE=float && make test ) + @(export DATATYPE=short && make test ) + selftest.c: ./mk_test.py 10 12 14 > selftest.c selftest_short.c: ./mk_test.py -s 10 12 14 > selftest_short.c clean: - rm -f *~ bm_* st_* tr_* *.dat + rm -f *~ bm_* st_* tr_* diff --git a/kiss_fft2d.c b/test/kiss_fft2d.c similarity index 100% rename from kiss_fft2d.c rename to test/kiss_fft2d.c diff --git a/test/kiss_fft2d.h b/test/kiss_fft2d.h new file mode 100644 index 0000000..f72d0b4 --- /dev/null +++ b/test/kiss_fft2d.h @@ -0,0 +1,12 @@ +#ifndef KISS_FFT2D_H +#define KISS_FFT2D_H +#include "kiss_fft.h" + +/* allocate a 2-dimensional FFT + the data should be stored rowwise, + in other words, an array made up of row[0], then row[1], etc + */ +void * kiss_fft2d_alloc(int nrows,int ncols,int inverse_fft,void * mem,size_t * lenmem); +void kiss_fft2d(const void* cfg_from_alloc , const kiss_fft_cpx *fin,kiss_fft_cpx *fout ); + +#endif diff --git a/test/selftest.c b/test/selftest.c new file mode 100644 index 0000000..513e46e --- /dev/null +++ b/test/selftest.c @@ -0,0 +1,136 @@ +#include "kiss_fft.h" + +#define xstr(s) str(s) +#define str(s) #s +double snr_compare( kiss_fft_cpx * test_vec_out,kiss_fft_cpx * testbuf, int n) +{ + int k; + double sigpow,noisepow,err,snr,scale=0; + sigpow = noisepow = .000000000000000000000000000001; + + for (k=0;k #include diff --git a/tools/Makefile b/tools/Makefile index 3844755..c0471e7 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -4,7 +4,6 @@ endif ifeq "$(NUMFFTS)" "" NUMFFTS=10000 endif -NROWS=30 ifeq "$(DATATYPE)" "" DATATYPE=float @@ -32,7 +31,7 @@ CFLAGS=-Wall -O3 $(SELFTEST): ../kiss_fft.c $(SELFTESTSRC) $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ -$(TESTREAL): ../kiss_fft.c ../kiss_fftr.c test_real.c +$(TESTREAL): ../kiss_fft.c kiss_fftr.c test_real.c $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ $(BENCHKISS): benchkiss.c ../kiss_fft.c pstats.c @@ -41,30 +40,24 @@ $(BENCHKISS): benchkiss.c ../kiss_fft.c pstats.c $(BENCHFFTW): benchfftw.c pstats.c @$(CC) -o $@ $(CFLAGS) -DDATATYPE$(DATATYPE) benchfftw.c pstats.c -lm -lfftw3f -lfftw3 -L /usr/local/lib/ || echo "FFTW not available for comparison" -POW2=256 512 1024 2048 4096 8192 -POW3=243 729 2187 -POW5=25 125 625 3125 - -mtime: all - @for n in $(POW2) $(POW3) $(POW5) ;do \ - echo ============================;\ - ./$(BENCHKISS) -x $(NUMFFTS) -n $$n;\ - [ -x ./$(BENCHFFTW) ] && ./$(BENCHFFTW) -x $(NUMFFTS) -n $$n || true ; \ - done - -test: all $(TESTREAL) - @echo "======SELF TEST" +test: all + @echo "======SELF TEST $(DATATYPE)" @./$(SELFTEST) - @echo "======REAL FFT TEST" + @echo "======REAL FFT TEST $(DATATYPE)" @./$(TESTREAL) - @echo "======TIMING TEST" + @echo "======TIMING TEST $(DATATYPE)" @./$(BENCHKISS) -x $(NUMFFTS) -n $(NFFT) @[ -x ./$(BENCHFFTW) ] && ./$(BENCHFFTW) -x $(NUMFFTS) -n $(NFFT) ||true +testall: + @(export DATATYPE=double && make test ) + @(export DATATYPE=float && make test ) + @(export DATATYPE=short && make test ) + selftest.c: ./mk_test.py 10 12 14 > selftest.c selftest_short.c: ./mk_test.py -s 10 12 14 > selftest_short.c clean: - rm -f *~ bm_* st_* tr_* *.dat + rm -f *~ bm_* st_* tr_* diff --git a/tools/fftutil.c b/tools/fftutil.c index ac37192..42d0e69 100644 --- a/tools/fftutil.c +++ b/tools/fftutil.c @@ -20,12 +20,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND #include "kiss_fft.h" -#ifndef NFFT -# define NFFT 1024 -#endif - - - void fft_file(FILE * fin,FILE * fout,int nfft,int nrows,int isinverse,int useascii,int times) { int i; diff --git a/kiss_fftr.c b/tools/kiss_fftr.c similarity index 100% rename from kiss_fftr.c rename to tools/kiss_fftr.c diff --git a/tools/kiss_fftr.h b/tools/kiss_fftr.h new file mode 100644 index 0000000..2aec163 --- /dev/null +++ b/tools/kiss_fftr.h @@ -0,0 +1,12 @@ +#ifndef KISS_FTR_H +#define KISS_FTR_H + +#include "kiss_fft.h" + +/* Real optimized version can save about 45% cpu time vs. complex fft of a real seq. + */ +void * kiss_fftr_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem); +void kiss_fftr(const void * cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata); +void kiss_fftri(const void * cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata); + +#endif