diff --git a/fft.py b/fft.py index cdc3907..7f7b3ad 100644 --- a/fft.py +++ b/fft.py @@ -64,12 +64,15 @@ def real_fft( f,inv ): ims = f[1::2] fp = [ complex(r,i) for r,i in zip(res,ims) ] + print 'fft input ', fp Fp = fft( fp ,0 ) + print 'fft output ', Fp F = [] for k in range(N): F1k = Fp[k] + Fp[-k].conjugate() F2k = -j*(Fp[k] - Fp[-k].conjugate()) + print 'F2k[%d]=%s' % (k,F2k) F.append( ( F1k + e ** ( -j*pi*k/N ) * F2k ) * .5 ) diff --git a/test/Makefile b/test/Makefile index 45c7b3a..217d6c5 100644 --- a/test/Makefile +++ b/test/Makefile @@ -11,10 +11,11 @@ ifeq "$(DATATYPE)" "" endif UTIL=fftutil_$(DATATYPE) +TESTREAL=tr_$(DATATYPE) BENCHKISS=bm_kiss_$(DATATYPE) BENCHFFTW=bm_fftw_$(DATATYPE) -all: $(UTIL) $(BENCHKISS) +all: $(UTIL) $(BENCHKISS) $(TESTREAL) ifeq "$(DATATYPE)" "short" TYPEFLAGS=-DFIXED_POINT -Dkiss_fft_scalar=short @@ -29,6 +30,9 @@ CFLAGS=-Wall -O3 -ansi -pedantic -march=pentiumpro -ffast-math -fomit-frame-poin $(UTIL): ../kiss_fft.c ../kiss_fft2d.c fftutil.c gcc -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) ../kiss_fft.c ../kiss_fft2d.c fftutil.c -lm +$(TESTREAL): ../kiss_fft.c ../kiss_fftr.c test_real.c + gcc -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ + $(BENCHKISS): benchkiss.c ../kiss_fft.c pstats.c gcc -o $@ $(CFLAGS) -I.. benchkiss.c $(TYPEFLAGS) ../kiss_fft.c pstats.c -lm diff --git a/test/mk_test.py b/test/mk_test.py index 32ed4af..c8a98ac 100755 --- a/test/mk_test.py +++ b/test/mk_test.py @@ -20,13 +20,23 @@ def c_format(v,round=0): s= ','.join( [ '{%.60f ,%.60f }' %(c.real,c.imag) for c in v ] ) return re.sub(r'\.?0+ ',' ',s) -def test_vec( n,inverse ): +def test_cpx( n,inverse ,short): v = randvec(n,1) + scale = 1 + if inverse: tvecout = FFT.inverse_fft(v) - tvecout = [ c * len(v) for c in tvecout ] + if short: + scale = 1 + else: + scale = len(v) else: tvecout = FFT.fft(v) + if short: + scale = 1.0/len(v) + + tvecout = [ c * scale for c in tvecout ] + s="""#define NFFT %d""" % len(v) + """ { @@ -75,7 +85,13 @@ double snr_compare( kiss_fft_cpx * test_vec_out,kiss_fft_cpx * testbuf, int n) return s def main(): - fftsizes = sys.argv[1:] + + from getopt import getopt + opts,args = getopt(sys.argv[1:],'s') + opts = dict(opts) + short = int( opts.has_key('-s') ) + + fftsizes = args if not fftsizes: fftsizes = [ 1800 ] print '#include "kiss_fft.h"' @@ -83,8 +99,8 @@ def main(): print "int main() {" for n in fftsizes: n = int(n) - print test_vec(n,0) - print test_vec(n,1) + print test_cpx(n,0,short) + print test_cpx(n,1,short) print """ return 0; } diff --git a/test/test_real.c b/test/test_real.c new file mode 100644 index 0000000..fed8dc5 --- /dev/null +++ b/test/test_real.c @@ -0,0 +1,75 @@ +#include "kiss_fft.h" + + +void * kiss_fftr_alloc(int nfft,int inverse_fft); +void kiss_fftr(const void * cfg,const kiss_fft_scalar *fin,kiss_fft_cpx *fout); + +double snr_compare( kiss_fft_cpx * vec1,kiss_fft_cpx * vec2, int n) +{ + int k; + double sigpow,noisepow,err,snr,scale=0; + sigpow = noisepow = .000000000000000000000000000001; + + for (k=0;kr,c->i); +} + +int main() +{ + int i; + kiss_fft_cpx cin[NFFT]; + kiss_fft_scalar sin[NFFT] = {0.309655,0.815653,0.768570,0.591841,0.404767,0.637617,0.007803,0.012665}; + kiss_fft_cpx cout[NFFT]; + kiss_fft_cpx sout[NFFT]; + + const void * kiss_fft_state; + const void * kiss_fftr_state; + int inverse = 0; + + kiss_fft_state = kiss_fft_alloc(NFFT,inverse); + kiss_fftr_state = kiss_fftr_alloc(NFFT,inverse); + + for (i=0;i