From ca4c74e07ce9969980e15ead59fda6e08e50d776 Mon Sep 17 00:00:00 2001 From: Mark Borgerding Date: Wed, 29 Oct 2003 04:29:01 +0000 Subject: [PATCH] Woops, one should not test with input of all zeros --- Makefile | 2 +- kiss_fft.c | 4 +-- test/Makefile | 63 ++++++++++++++++++++++--------------------- test/rand_fft_data.py | 26 ++++++++++++++++++ test/testkiss.m | 8 +----- tools/Makefile | 63 ++++++++++++++++++++++--------------------- 6 files changed, 96 insertions(+), 70 deletions(-) create mode 100755 test/rand_fft_data.py diff --git a/Makefile b/Makefile index aacff98..a840e8d 100644 --- a/Makefile +++ b/Makefile @@ -7,5 +7,5 @@ tarball: clean clean: cd sample_code && make clean - rm -f kiss_fft.tar.gz *~ *.pyc kiss_fft.zip + rm -f kiss_fft.tar.gz *~ *.pyc kiss_fft.zip fft.py diff --git a/kiss_fft.c b/kiss_fft.c index bd8fc98..4272e65 100644 --- a/kiss_fft.c +++ b/kiss_fft.c @@ -269,8 +269,8 @@ void * kiss_fft_alloc(int nfft,int inverse_fft) } while (nfft>1) { - /* If you add a new radix, don't forget to put it here */ - const int primes[] = {4,2,-1}; + /* If you want a new radix, don't forget to put it here */ + const int primes[] = {4,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,-1}; int p=nfft; i=0; while ( primes[i] != -1 ) { diff --git a/test/Makefile b/test/Makefile index 118597f..15bd87a 100644 --- a/test/Makefile +++ b/test/Makefile @@ -3,7 +3,6 @@ ifeq "$(NFFT)" "" NFFT=1024 endif -ALLUTILS=kfft kffts kfftd ifeq "$(NUMFFTS)" "" NUMFFTS=10000 @@ -13,50 +12,54 @@ UTILSRC=../kiss_fft.c fftutil.c CFLAGS=-Wall -O3 -lm -I.. -ansi -pedantic -all: $(ALLUTILS) +ifeq "$(DATATYPE)" "" + DATATYPE=float +endif +UTIL=fftutil_$(DATATYPE) -kfft: $(UTILSRC) - echo $(FUNCDECL) - gcc -o $@ $(CFLAGS) $(UTILSRC) -kffts: $(UTILSRC) - gcc -o $@ $(CFLAGS) -DFIXED_POINT $(UTILSRC) -kfftd: $(UTILSRC) - gcc -o $@ $(CFLAGS) -Dkiss_fft_scalar=double $(UTILSRC) -time: all - @echo +all: $(UTIL) + +ifeq "$(DATATYPE)" "short" + TYPEFLAGS=-DFIXED_POINT -Dkiss_fft_scalar=short +else + TYPEFLAGS=-Dkiss_fft_scalar=$(DATATYPE) +endif + +$(UTIL): $(UTILSRC) + gcc -o $@ $(CFLAGS) $(TYPEFLAGS) $(UTILSRC) + +RANDDAT=rand_$(DATATYPE)_$(NUMFFTS)_$(NFFT).dat +$(RANDDAT): + ./rand_fft_data.py -n $(NUMFFTS) -N $(NFFT) -t $(DATATYPE) > $(RANDDAT) + +time: all $(RANDDAT) + @echo @echo -n "#### timing $(NUMFFTS) x $(NFFT) point FFTs. "; factor $(NFFT) - @echo "#### DOUBLE" - @time -f 'Elapsed:%E user:%U sys:%S' \ - sh -c 'dd if=/dev/zero bs=$$((16*$(NFFT))) count=$(NUMFFTS) 2>/dev/null |./kfftd>/dev/null' - @echo "#### FLOAT" - @time -f 'Elapsed:%E user:%U sys:%S' \ - sh -c 'dd if=/dev/zero bs=$$((8*$(NFFT))) count=$(NUMFFTS) 2>/dev/null |./kfft>/dev/null' - @echo "#### SHORT" - @time -f 'Elapsed:%E user:%U sys:%S' \ - sh -c 'dd if=/dev/zero bs=$$((4*$(NFFT))) count=$(NUMFFTS) 2>/dev/null |./kffts>/dev/null' - + @if [ -x ~/fftw/st ] && [ $(DATATYPE) == "double" ]; then \ + echo "#### FFTW FFT $(DATATYPE)"; \ + time ~/fftw/st -n $(NFFT) < $(RANDDAT) > /dev/null;\ + fi + @echo "#### KISS FFT $(DATATYPE)" + @time ./$(UTIL) -n $(NFFT) < $(RANDDAT) > /dev/null + @rm $(RANDDAT) POW2=256 512 1024 2048 POW3=243 729 2187 mtime: all - @for n in $(POW2) ;do \ + @for n in $(POW2) $(POW3) ;do \ export NFFT=$$n;make time; \ done snr: all @which octave @echo - @echo "### testing SNR for $(NFFT) point FFTs" - @echo "#### DOUBLE" - @echo "testkiss($(NFFT),'double',1,1/$(NFFT));" | octave -q - @echo "#### FLOAT" - @echo "testkiss($(NFFT),'float',1,1/$(NFFT));" | octave -q - @echo "#### SHORT" - @echo "testkiss($(NFFT),'short',$(NFFT),$(NFFT));" | octave -q + @echo "### testing SNR for $(NFFT) point FFTs" + @echo "#### $(DATATYPE)" + @echo "testkiss($(NFFT),'$(DATATYPE)',1,1/$(NFFT));" | octave -q test: snr time clean: - rm -f $(ALLUTILS) *.dat *~ + rm -f *.dat *~ fftutil_* diff --git a/test/rand_fft_data.py b/test/rand_fft_data.py new file mode 100755 index 0000000..60e9627 --- /dev/null +++ b/test/rand_fft_data.py @@ -0,0 +1,26 @@ +#!/usr/local/bin/python2.3 + +import sys +import random +import struct + +def main(): + from getopt import getopt + opts,args = getopt(sys.argv[1:],'n:N:t:l:h:') + opts=dict(opts) + nbufs = int( opts.get('-n','10000') ) + nfft = int( opts.get('-N','1024') ) + type = opts.get('-t','f') + lo = float(opts.get('-l','-32768') ) + hi = float(opts.get('-h','32767') ) + + format = {'float':'f','short':'h','double':'d'}[type] + + nums = [ random.uniform(lo,hi) for i in range(nfft*2) ] + buf = struct.pack( '%d%s' % ( len( nums ) , format ) , *nums ) + + for i in range(nbufs): + sys.stdout.write( buf ) + +if __name__ == '__main__': + main() diff --git a/test/testkiss.m b/test/testkiss.m index cc7bbc6..fc86c17 100755 --- a/test/testkiss.m +++ b/test/testkiss.m @@ -8,13 +8,7 @@ endif if nargin<4, scale_f2t=1 endif -if strcmp(prec,'short'), - kfft='./kffts'; -elseif strcmp(prec,'double') - kfft='./kfftd'; -else - kfft='./kfft'; -endif +kfft= sprintf('./fftutil_%s',prec); siglen = nfft; sig=floor(32767*rand(1,siglen)) + j*floor(32767*rand(1,siglen)); diff --git a/tools/Makefile b/tools/Makefile index 118597f..15bd87a 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -3,7 +3,6 @@ ifeq "$(NFFT)" "" NFFT=1024 endif -ALLUTILS=kfft kffts kfftd ifeq "$(NUMFFTS)" "" NUMFFTS=10000 @@ -13,50 +12,54 @@ UTILSRC=../kiss_fft.c fftutil.c CFLAGS=-Wall -O3 -lm -I.. -ansi -pedantic -all: $(ALLUTILS) +ifeq "$(DATATYPE)" "" + DATATYPE=float +endif +UTIL=fftutil_$(DATATYPE) -kfft: $(UTILSRC) - echo $(FUNCDECL) - gcc -o $@ $(CFLAGS) $(UTILSRC) -kffts: $(UTILSRC) - gcc -o $@ $(CFLAGS) -DFIXED_POINT $(UTILSRC) -kfftd: $(UTILSRC) - gcc -o $@ $(CFLAGS) -Dkiss_fft_scalar=double $(UTILSRC) -time: all - @echo +all: $(UTIL) + +ifeq "$(DATATYPE)" "short" + TYPEFLAGS=-DFIXED_POINT -Dkiss_fft_scalar=short +else + TYPEFLAGS=-Dkiss_fft_scalar=$(DATATYPE) +endif + +$(UTIL): $(UTILSRC) + gcc -o $@ $(CFLAGS) $(TYPEFLAGS) $(UTILSRC) + +RANDDAT=rand_$(DATATYPE)_$(NUMFFTS)_$(NFFT).dat +$(RANDDAT): + ./rand_fft_data.py -n $(NUMFFTS) -N $(NFFT) -t $(DATATYPE) > $(RANDDAT) + +time: all $(RANDDAT) + @echo @echo -n "#### timing $(NUMFFTS) x $(NFFT) point FFTs. "; factor $(NFFT) - @echo "#### DOUBLE" - @time -f 'Elapsed:%E user:%U sys:%S' \ - sh -c 'dd if=/dev/zero bs=$$((16*$(NFFT))) count=$(NUMFFTS) 2>/dev/null |./kfftd>/dev/null' - @echo "#### FLOAT" - @time -f 'Elapsed:%E user:%U sys:%S' \ - sh -c 'dd if=/dev/zero bs=$$((8*$(NFFT))) count=$(NUMFFTS) 2>/dev/null |./kfft>/dev/null' - @echo "#### SHORT" - @time -f 'Elapsed:%E user:%U sys:%S' \ - sh -c 'dd if=/dev/zero bs=$$((4*$(NFFT))) count=$(NUMFFTS) 2>/dev/null |./kffts>/dev/null' - + @if [ -x ~/fftw/st ] && [ $(DATATYPE) == "double" ]; then \ + echo "#### FFTW FFT $(DATATYPE)"; \ + time ~/fftw/st -n $(NFFT) < $(RANDDAT) > /dev/null;\ + fi + @echo "#### KISS FFT $(DATATYPE)" + @time ./$(UTIL) -n $(NFFT) < $(RANDDAT) > /dev/null + @rm $(RANDDAT) POW2=256 512 1024 2048 POW3=243 729 2187 mtime: all - @for n in $(POW2) ;do \ + @for n in $(POW2) $(POW3) ;do \ export NFFT=$$n;make time; \ done snr: all @which octave @echo - @echo "### testing SNR for $(NFFT) point FFTs" - @echo "#### DOUBLE" - @echo "testkiss($(NFFT),'double',1,1/$(NFFT));" | octave -q - @echo "#### FLOAT" - @echo "testkiss($(NFFT),'float',1,1/$(NFFT));" | octave -q - @echo "#### SHORT" - @echo "testkiss($(NFFT),'short',$(NFFT),$(NFFT));" | octave -q + @echo "### testing SNR for $(NFFT) point FFTs" + @echo "#### $(DATATYPE)" + @echo "testkiss($(NFFT),'$(DATATYPE)',1,1/$(NFFT));" | octave -q test: snr time clean: - rm -f $(ALLUTILS) *.dat *~ + rm -f *.dat *~ fftutil_*