annotate constant-q-cpp/src/ext/kissfft/test/mk_test.py @ 372:af71cbdab621 tip

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