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

语音压缩

开发平台:

C/C++

  1. #!/usr/bin/env python2.3
  2. import math
  3. import sys
  4. import os
  5. import random
  6. import struct
  7. import popen2
  8. import getopt
  9. import Numeric
  10. import FFT
  11. pi=math.pi
  12. e=math.e
  13. j=complex(0,1)
  14. doreal=0
  15. datatype = os.environ.get('DATATYPE','float')
  16. util = '../tools/fft'
  17. fmt='f'
  18. minsnr=90
  19. if datatype == 'double':
  20.     util = '../tools/fft_double'
  21.     fmt='d'
  22. elif datatype=='short':
  23.     util = '../tools/fft_short'
  24.     fmt='h'
  25.     minsnr=10
  26. def dopack(x,cpx=1):
  27.     x = Numeric.reshape( x, ( Numeric.size(x),) )
  28.     if cpx:
  29.         s = ''.join( [ struct.pack(fmt*2,c.real,c.imag) for c in x ] )
  30.     else:
  31.         s = ''.join( [ struct.pack(fmt,c) for c in x ] )
  32.     return s
  33. def dounpack(x,cpx):
  34.     uf = fmt * ( len(x) / struct.calcsize(fmt) )
  35.     s = struct.unpack(uf,x)
  36.     if cpx:
  37.         return Numeric.array(s[::2]) + Numeric.array( s[1::2] )*j
  38.     else:
  39.         return Numeric.array(s )
  40. def make_random(dims=[1]):
  41.     res = []
  42.     for i in range(dims[0]):
  43.         if len(dims)==1:
  44.             r=random.uniform(-1,1)
  45.             if doreal:
  46.                 res.append( r )
  47.             else:
  48.                 i=random.uniform(-1,1)
  49.                 res.append( complex(r,i) )
  50.         else:
  51.             res.append( make_random( dims[1:] ) )
  52.     return Numeric.array(res)
  53. def flatten(x):
  54.     ntotal = Numeric.product(Numeric.shape(x))
  55.     return Numeric.reshape(x,(ntotal,))
  56. def randmat( ndims ):
  57.     dims=[]
  58.     for i in range( ndims ):
  59.         curdim = int( random.uniform(2,4) )
  60.         dims.append( curdim )
  61.     return make_random(dims )
  62. def test_fft(ndims):
  63.     if ndims == 1:
  64.         nfft = int(random.uniform(50,520))
  65.         if doreal:
  66.             nfft = int(nfft/2)*2
  67.         x = Numeric.array(make_random( [ nfft ] ) )
  68.     else:
  69.         x=randmat( ndims )
  70.     print 'dimensions=%s' % str( Numeric.shape(x) ),
  71.     if doreal:
  72.         xver = FFT.real_fftnd(x)
  73.     else:
  74.         xver = FFT.fftnd(x)
  75.     
  76.     x2=dofft(x)
  77.     err = xver - x2
  78.     errf = flatten(err)
  79.     xverf = flatten(xver)
  80.     errpow = Numeric.vdot(errf,errf)+1e-10
  81.     sigpow = Numeric.vdot(xverf,xverf)+1e-10
  82.     snr = 10*math.log10(abs(sigpow/errpow) )
  83.     print 'SNR (compared to NumPy) : %.1fdB' % float(snr)
  84.     if snr<minsnr:
  85.         print 'xver=',xver
  86.         print 'x2=',x2
  87.         print 'err',err
  88.         sys.exit(1)
  89.  
  90. def dofft(x):
  91.     dims=list( Numeric.shape(x) )
  92.     x = flatten(x)
  93.     iscomp = (type(x[0]) == complex)
  94.     scale=1
  95.     if datatype=='short':
  96.         x = 32767 * x
  97.         scale = len(x) / 32767.0
  98.     cmd='%s -n ' % util
  99.     cmd += ','.join([str(d) for d in dims])
  100.     if doreal:
  101.         cmd += ' -R '
  102.     p = popen2.Popen3(cmd )
  103.     p.tochild.write( dopack( x , iscomp ) )
  104.     p.tochild.close()
  105.     res = dounpack( p.fromchild.read() , 1 )
  106.     if doreal:
  107.         dims[-1] = int( dims[-1]/2 ) + 1
  108.     res = scale * res
  109.     p.wait()
  110.     return Numeric.reshape(res,dims)
  111. def main():
  112.     opts,args = getopt.getopt(sys.argv[1:],'r')
  113.     opts=dict(opts)
  114.     global doreal
  115.     doreal = opts.has_key('-r')
  116.     if doreal:
  117.         print 'Note: Real optimization not yet done for odd length ffts and multi-D'
  118.         test_fft(1)
  119.     else:
  120.         for dim in range(1,9):
  121.             test_fft( dim )
  122.         print 'We crossed the 8th dimension.  Buckaroo would be proud'
  123. if __name__ == "__main__":
  124.     main()