annotate constant-q-cpp/src/ext/kissfft/test/compfft.py @ 372:af71cbdab621 tip

Update bqvec code
author Chris Cannam
date Tue, 19 Nov 2019 10:13:32 +0000
parents 5d0a2ebb4d17
children
rev   line source
Chris@366 1 #!/usr/bin/env python
Chris@366 2
Chris@366 3 # use FFTPACK as a baseline
Chris@366 4 import FFT
Chris@366 5 from Numeric import *
Chris@366 6 import math
Chris@366 7 import random
Chris@366 8 import sys
Chris@366 9 import struct
Chris@366 10 import fft
Chris@366 11
Chris@366 12 pi=math.pi
Chris@366 13 e=math.e
Chris@366 14 j=complex(0,1)
Chris@366 15 lims=(-32768,32767)
Chris@366 16
Chris@366 17 def randbuf(n,cpx=1):
Chris@366 18 res = array( [ random.uniform( lims[0],lims[1] ) for i in range(n) ] )
Chris@366 19 if cpx:
Chris@366 20 res = res + j*randbuf(n,0)
Chris@366 21 return res
Chris@366 22
Chris@366 23 def main():
Chris@366 24 from getopt import getopt
Chris@366 25 import popen2
Chris@366 26 opts,args = getopt( sys.argv[1:],'u:n:Rt:' )
Chris@366 27 opts=dict(opts)
Chris@366 28 exitcode=0
Chris@366 29
Chris@366 30 util = opts.get('-u','./kf_float')
Chris@366 31
Chris@366 32 try:
Chris@366 33 dims = [ int(d) for d in opts['-n'].split(',')]
Chris@366 34 cpx = opts.get('-R') is None
Chris@366 35 fmt=opts.get('-t','f')
Chris@366 36 except KeyError:
Chris@366 37 sys.stderr.write("""
Chris@366 38 usage: compfft.py
Chris@366 39 -n d1[,d2,d3...] : FFT dimension(s)
Chris@366 40 -u utilname : see sample_code/fftutil.c, default = ./kf_float
Chris@366 41 -R : real-optimized version\n""")
Chris@366 42 sys.exit(1)
Chris@366 43
Chris@366 44 x = fft.make_random( dims )
Chris@366 45
Chris@366 46 cmd = '%s -n %s ' % ( util, ','.join([ str(d) for d in dims]) )
Chris@366 47 if cpx:
Chris@366 48 xout = FFT.fftnd(x)
Chris@366 49 xout = reshape(xout,(size(xout),))
Chris@366 50 else:
Chris@366 51 cmd += '-R '
Chris@366 52 xout = FFT.real_fft(x)
Chris@366 53
Chris@366 54 proc = popen2.Popen3( cmd , bufsize=len(x) )
Chris@366 55
Chris@366 56 proc.tochild.write( dopack( x , fmt ,cpx ) )
Chris@366 57 proc.tochild.close()
Chris@366 58 xoutcomp = dounpack( proc.fromchild.read( ) , fmt ,1 )
Chris@366 59 #xoutcomp = reshape( xoutcomp , dims )
Chris@366 60
Chris@366 61 sig = xout * conjugate(xout)
Chris@366 62 sigpow = sum( sig )
Chris@366 63
Chris@366 64 diff = xout-xoutcomp
Chris@366 65 noisepow = sum( diff * conjugate(diff) )
Chris@366 66
Chris@366 67 snr = 10 * math.log10(abs( sigpow / noisepow ) )
Chris@366 68 if snr<100:
Chris@366 69 print xout
Chris@366 70 print xoutcomp
Chris@366 71 exitcode=1
Chris@366 72 print 'NFFT=%s,SNR = %f dB' % (str(dims),snr)
Chris@366 73 sys.exit(exitcode)
Chris@366 74
Chris@366 75 def dopack(x,fmt,cpx):
Chris@366 76 x = reshape( x, ( size(x),) )
Chris@366 77 if cpx:
Chris@366 78 s = ''.join( [ struct.pack('ff',c.real,c.imag) for c in x ] )
Chris@366 79 else:
Chris@366 80 s = ''.join( [ struct.pack('f',c) for c in x ] )
Chris@366 81 return s
Chris@366 82
Chris@366 83 def dounpack(x,fmt,cpx):
Chris@366 84 uf = fmt * ( len(x) / 4 )
Chris@366 85 s = struct.unpack(uf,x)
Chris@366 86 if cpx:
Chris@366 87 return array(s[::2]) + array( s[1::2] )*j
Chris@366 88 else:
Chris@366 89 return array(s )
Chris@366 90
Chris@366 91 if __name__ == "__main__":
Chris@366 92 main()