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