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