mk_test.py
上传用户:ozl2332
上传日期:2009-12-28
资源大小:38k
文件大小:3k
源码类别:

语音压缩

开发平台:

C/C++

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