c@409: #!/usr/bin/env python c@409: c@409: import FFT c@409: import sys c@409: import random c@409: import re c@409: j=complex(0,1) c@409: c@409: def randvec(n,iscomplex): c@409: if iscomplex: c@409: return [ c@409: int(random.uniform(-32768,32767) ) + j*int(random.uniform(-32768,32767) ) c@409: for i in range(n) ] c@409: else: c@409: return [ int(random.uniform(-32768,32767) ) for i in range(n) ] c@409: c@409: def c_format(v,round=0): c@409: if round: c@409: return ','.join( [ '{%d,%d}' %(int(c.real),int(c.imag) ) for c in v ] ) c@409: else: c@409: s= ','.join( [ '{%.60f ,%.60f }' %(c.real,c.imag) for c in v ] ) c@409: return re.sub(r'\.?0+ ',' ',s) c@409: c@409: def test_cpx( n,inverse ,short): c@409: v = randvec(n,1) c@409: scale = 1 c@409: if short: c@409: minsnr=30 c@409: else: c@409: minsnr=100 c@409: c@409: if inverse: c@409: tvecout = FFT.inverse_fft(v) c@409: if short: c@409: scale = 1 c@409: else: c@409: scale = len(v) c@409: else: c@409: tvecout = FFT.fft(v) c@409: if short: c@409: scale = 1.0/len(v) c@409: c@409: tvecout = [ c * scale for c in tvecout ] c@409: c@409: c@409: s="""#define NFFT %d""" % len(v) + """ c@409: { c@409: double snr; c@409: kiss_fft_cpx test_vec_in[NFFT] = { """ + c_format(v) + """}; c@409: kiss_fft_cpx test_vec_out[NFFT] = {""" + c_format( tvecout ) + """}; c@409: kiss_fft_cpx testbuf[NFFT]; c@409: void * cfg = kiss_fft_alloc(NFFT,%d,0,0);""" % inverse + """ c@409: c@409: kiss_fft(cfg,test_vec_in,testbuf); c@409: snr = snr_compare(test_vec_out,testbuf,NFFT); c@409: printf("DATATYPE=" xstr(kiss_fft_scalar) ", FFT n=%d, inverse=%d, snr = %g dB\\n",NFFT,""" + str(inverse) + """,snr); c@409: if (snr<""" + str(minsnr) + """) c@409: exit_code++; c@409: free(cfg); c@409: } c@409: #undef NFFT c@409: """ c@409: return s c@409: c@409: def compare_func(): c@409: s=""" c@409: #define xstr(s) str(s) c@409: #define str(s) #s c@409: double snr_compare( kiss_fft_cpx * test_vec_out,kiss_fft_cpx * testbuf, int n) c@409: { c@409: int k; c@409: double sigpow,noisepow,err,snr,scale=0; c@409: kiss_fft_cpx err; c@409: sigpow = noisepow = .000000000000000000000000000001; c@409: c@409: for (k=0;k