Chris@184
|
1 #!/usr/bin/env python
|
Chris@184
|
2
|
Chris@184
|
3 import FFT
|
Chris@184
|
4 import sys
|
Chris@184
|
5 import random
|
Chris@184
|
6 import re
|
Chris@184
|
7 j=complex(0,1)
|
Chris@184
|
8
|
Chris@184
|
9 def randvec(n,iscomplex):
|
Chris@184
|
10 if iscomplex:
|
Chris@184
|
11 return [
|
Chris@184
|
12 int(random.uniform(-32768,32767) ) + j*int(random.uniform(-32768,32767) )
|
Chris@184
|
13 for i in range(n) ]
|
Chris@184
|
14 else:
|
Chris@184
|
15 return [ int(random.uniform(-32768,32767) ) for i in range(n) ]
|
Chris@184
|
16
|
Chris@184
|
17 def c_format(v,round=0):
|
Chris@184
|
18 if round:
|
Chris@184
|
19 return ','.join( [ '{%d,%d}' %(int(c.real),int(c.imag) ) for c in v ] )
|
Chris@184
|
20 else:
|
Chris@184
|
21 s= ','.join( [ '{%.60f ,%.60f }' %(c.real,c.imag) for c in v ] )
|
Chris@184
|
22 return re.sub(r'\.?0+ ',' ',s)
|
Chris@184
|
23
|
Chris@184
|
24 def test_cpx( n,inverse ,short):
|
Chris@184
|
25 v = randvec(n,1)
|
Chris@184
|
26 scale = 1
|
Chris@184
|
27 if short:
|
Chris@184
|
28 minsnr=30
|
Chris@184
|
29 else:
|
Chris@184
|
30 minsnr=100
|
Chris@184
|
31
|
Chris@184
|
32 if inverse:
|
Chris@184
|
33 tvecout = FFT.inverse_fft(v)
|
Chris@184
|
34 if short:
|
Chris@184
|
35 scale = 1
|
Chris@184
|
36 else:
|
Chris@184
|
37 scale = len(v)
|
Chris@184
|
38 else:
|
Chris@184
|
39 tvecout = FFT.fft(v)
|
Chris@184
|
40 if short:
|
Chris@184
|
41 scale = 1.0/len(v)
|
Chris@184
|
42
|
Chris@184
|
43 tvecout = [ c * scale for c in tvecout ]
|
Chris@184
|
44
|
Chris@184
|
45
|
Chris@184
|
46 s="""#define NFFT %d""" % len(v) + """
|
Chris@184
|
47 {
|
Chris@184
|
48 double snr;
|
Chris@184
|
49 kiss_fft_cpx test_vec_in[NFFT] = { """ + c_format(v) + """};
|
Chris@184
|
50 kiss_fft_cpx test_vec_out[NFFT] = {""" + c_format( tvecout ) + """};
|
Chris@184
|
51 kiss_fft_cpx testbuf[NFFT];
|
Chris@184
|
52 void * cfg = kiss_fft_alloc(NFFT,%d,0,0);""" % inverse + """
|
Chris@184
|
53
|
Chris@184
|
54 kiss_fft(cfg,test_vec_in,testbuf);
|
Chris@184
|
55 snr = snr_compare(test_vec_out,testbuf,NFFT);
|
Chris@184
|
56 printf("DATATYPE=" xstr(kiss_fft_scalar) ", FFT n=%d, inverse=%d, snr = %g dB\\n",NFFT,""" + str(inverse) + """,snr);
|
Chris@184
|
57 if (snr<""" + str(minsnr) + """)
|
Chris@184
|
58 exit_code++;
|
Chris@184
|
59 free(cfg);
|
Chris@184
|
60 }
|
Chris@184
|
61 #undef NFFT
|
Chris@184
|
62 """
|
Chris@184
|
63 return s
|
Chris@184
|
64
|
Chris@184
|
65 def compare_func():
|
Chris@184
|
66 s="""
|
Chris@184
|
67 #define xstr(s) str(s)
|
Chris@184
|
68 #define str(s) #s
|
Chris@184
|
69 double snr_compare( kiss_fft_cpx * test_vec_out,kiss_fft_cpx * testbuf, int n)
|
Chris@184
|
70 {
|
Chris@184
|
71 int k;
|
Chris@184
|
72 double sigpow,noisepow,err,snr,scale=0;
|
Chris@184
|
73 kiss_fft_cpx err;
|
Chris@184
|
74 sigpow = noisepow = .000000000000000000000000000001;
|
Chris@184
|
75
|
Chris@184
|
76 for (k=0;k<n;++k) {
|
Chris@184
|
77 sigpow += test_vec_out[k].r * test_vec_out[k].r +
|
Chris@184
|
78 test_vec_out[k].i * test_vec_out[k].i;
|
Chris@184
|
79 C_SUB(err,test_vec_out[k],testbuf[k].r);
|
Chris@184
|
80 noisepow += err.r * err.r + err.i + err.i;
|
Chris@184
|
81
|
Chris@184
|
82 if (test_vec_out[k].r)
|
Chris@184
|
83 scale += testbuf[k].r / test_vec_out[k].r;
|
Chris@184
|
84 }
|
Chris@184
|
85 snr = 10*log10( sigpow / noisepow );
|
Chris@184
|
86 scale /= n;
|
Chris@184
|
87 if (snr<10)
|
Chris@184
|
88 printf( "\\npoor snr, try a scaling factor %f\\n" , scale );
|
Chris@184
|
89 return snr;
|
Chris@184
|
90 }
|
Chris@184
|
91 """
|
Chris@184
|
92 return s
|
Chris@184
|
93
|
Chris@184
|
94 def main():
|
Chris@184
|
95
|
Chris@184
|
96 from getopt import getopt
|
Chris@184
|
97 opts,args = getopt(sys.argv[1:],'s')
|
Chris@184
|
98 opts = dict(opts)
|
Chris@184
|
99 short = int( opts.has_key('-s') )
|
Chris@184
|
100
|
Chris@184
|
101 fftsizes = args
|
Chris@184
|
102 if not fftsizes:
|
Chris@184
|
103 fftsizes = [ 1800 ]
|
Chris@184
|
104 print '#include "kiss_fft.h"'
|
Chris@184
|
105 print compare_func()
|
Chris@184
|
106 print "int main() { int exit_code=0;\n"
|
Chris@184
|
107 for n in fftsizes:
|
Chris@184
|
108 n = int(n)
|
Chris@184
|
109 print test_cpx(n,0,short)
|
Chris@184
|
110 print test_cpx(n,1,short)
|
Chris@184
|
111 print """
|
Chris@184
|
112 return exit_code;
|
Chris@184
|
113 }
|
Chris@184
|
114 """
|
Chris@184
|
115
|
Chris@184
|
116 if __name__ == "__main__":
|
Chris@184
|
117 main()
|