Chris@184: #!/usr/bin/env python Chris@184: Chris@184: # use FFTPACK as a baseline Chris@184: import FFT Chris@184: from Numeric import * Chris@184: import math Chris@184: import random Chris@184: import sys Chris@184: import struct Chris@184: import fft Chris@184: Chris@184: pi=math.pi Chris@184: e=math.e Chris@184: j=complex(0,1) Chris@184: lims=(-32768,32767) Chris@184: Chris@184: def randbuf(n,cpx=1): Chris@184: res = array( [ random.uniform( lims[0],lims[1] ) for i in range(n) ] ) Chris@184: if cpx: Chris@184: res = res + j*randbuf(n,0) Chris@184: return res Chris@184: Chris@184: def main(): Chris@184: from getopt import getopt Chris@184: import popen2 Chris@184: opts,args = getopt( sys.argv[1:],'u:n:Rt:' ) Chris@184: opts=dict(opts) Chris@184: exitcode=0 Chris@184: Chris@184: util = opts.get('-u','./kf_float') Chris@184: Chris@184: try: Chris@184: dims = [ int(d) for d in opts['-n'].split(',')] Chris@184: cpx = opts.get('-R') is None Chris@184: fmt=opts.get('-t','f') Chris@184: except KeyError: Chris@184: sys.stderr.write(""" Chris@184: usage: compfft.py Chris@184: -n d1[,d2,d3...] : FFT dimension(s) Chris@184: -u utilname : see sample_code/fftutil.c, default = ./kf_float Chris@184: -R : real-optimized version\n""") Chris@184: sys.exit(1) Chris@184: Chris@184: x = fft.make_random( dims ) Chris@184: Chris@184: cmd = '%s -n %s ' % ( util, ','.join([ str(d) for d in dims]) ) Chris@184: if cpx: Chris@184: xout = FFT.fftnd(x) Chris@184: xout = reshape(xout,(size(xout),)) Chris@184: else: Chris@184: cmd += '-R ' Chris@184: xout = FFT.real_fft(x) Chris@184: Chris@184: proc = popen2.Popen3( cmd , bufsize=len(x) ) Chris@184: Chris@184: proc.tochild.write( dopack( x , fmt ,cpx ) ) Chris@184: proc.tochild.close() Chris@184: xoutcomp = dounpack( proc.fromchild.read( ) , fmt ,1 ) Chris@184: #xoutcomp = reshape( xoutcomp , dims ) Chris@184: Chris@184: sig = xout * conjugate(xout) Chris@184: sigpow = sum( sig ) Chris@184: Chris@184: diff = xout-xoutcomp Chris@184: noisepow = sum( diff * conjugate(diff) ) Chris@184: Chris@184: snr = 10 * math.log10(abs( sigpow / noisepow ) ) Chris@184: if snr<100: Chris@184: print xout Chris@184: print xoutcomp Chris@184: exitcode=1 Chris@184: print 'NFFT=%s,SNR = %f dB' % (str(dims),snr) Chris@184: sys.exit(exitcode) Chris@184: Chris@184: def dopack(x,fmt,cpx): Chris@184: x = reshape( x, ( size(x),) ) Chris@184: if cpx: Chris@184: s = ''.join( [ struct.pack('ff',c.real,c.imag) for c in x ] ) Chris@184: else: Chris@184: s = ''.join( [ struct.pack('f',c) for c in x ] ) Chris@184: return s Chris@184: Chris@184: def dounpack(x,fmt,cpx): Chris@184: uf = fmt * ( len(x) / 4 ) Chris@184: s = struct.unpack(uf,x) Chris@184: if cpx: Chris@184: return array(s[::2]) + array( s[1::2] )*j Chris@184: else: Chris@184: return array(s ) Chris@184: Chris@184: if __name__ == "__main__": Chris@184: main()