annotate src/ext/kissfft/test/mk_test.py @ 196:da283326bcd3 tip master

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