annotate constant-q-cpp/src/ext/kissfft/test/fastfir.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 from Numeric import *
Chris@366 4 from FFT import *
Chris@366 5
Chris@366 6 def make_random(len):
Chris@366 7 import random
Chris@366 8 res=[]
Chris@366 9 for i in range(int(len)):
Chris@366 10 r=random.uniform(-1,1)
Chris@366 11 i=random.uniform(-1,1)
Chris@366 12 res.append( complex(r,i) )
Chris@366 13 return res
Chris@366 14
Chris@366 15 def slowfilter(sig,h):
Chris@366 16 translen = len(h)-1
Chris@366 17 return convolve(sig,h)[translen:-translen]
Chris@366 18
Chris@366 19 def nextpow2(x):
Chris@366 20 return 2 ** math.ceil(math.log(x)/math.log(2))
Chris@366 21
Chris@366 22 def fastfilter(sig,h,nfft=None):
Chris@366 23 if nfft is None:
Chris@366 24 nfft = int( nextpow2( 2*len(h) ) )
Chris@366 25 H = fft( h , nfft )
Chris@366 26 scraplen = len(h)-1
Chris@366 27 keeplen = nfft-scraplen
Chris@366 28 res=[]
Chris@366 29 isdone = 0
Chris@366 30 lastidx = nfft
Chris@366 31 idx0 = 0
Chris@366 32 while not isdone:
Chris@366 33 idx1 = idx0 + nfft
Chris@366 34 if idx1 >= len(sig):
Chris@366 35 idx1 = len(sig)
Chris@366 36 lastidx = idx1-idx0
Chris@366 37 if lastidx <= scraplen:
Chris@366 38 break
Chris@366 39 isdone = 1
Chris@366 40 Fss = fft(sig[idx0:idx1],nfft)
Chris@366 41 fm = Fss * H
Chris@366 42 m = inverse_fft(fm)
Chris@366 43 res.append( m[scraplen:lastidx] )
Chris@366 44 idx0 += keeplen
Chris@366 45 return concatenate( res )
Chris@366 46
Chris@366 47 def main():
Chris@366 48 import sys
Chris@366 49 from getopt import getopt
Chris@366 50 opts,args = getopt(sys.argv[1:],'rn:l:')
Chris@366 51 opts=dict(opts)
Chris@366 52
Chris@366 53 siglen = int(opts.get('-l',1e4 ) )
Chris@366 54 hlen =50
Chris@366 55
Chris@366 56 nfft = int(opts.get('-n',128) )
Chris@366 57 usereal = opts.has_key('-r')
Chris@366 58
Chris@366 59 print 'nfft=%d'%nfft
Chris@366 60 # make a signal
Chris@366 61 sig = make_random( siglen )
Chris@366 62 # make an impulse response
Chris@366 63 h = make_random( hlen )
Chris@366 64 #h=[1]*2+[0]*3
Chris@366 65 if usereal:
Chris@366 66 sig=[c.real for c in sig]
Chris@366 67 h=[c.real for c in h]
Chris@366 68
Chris@366 69 # perform MAC filtering
Chris@366 70 yslow = slowfilter(sig,h)
Chris@366 71 #print '<YSLOW>',yslow,'</YSLOW>'
Chris@366 72 #yfast = fastfilter(sig,h,nfft)
Chris@366 73 yfast = utilfastfilter(sig,h,nfft,usereal)
Chris@366 74 #print yfast
Chris@366 75 print 'len(yslow)=%d'%len(yslow)
Chris@366 76 print 'len(yfast)=%d'%len(yfast)
Chris@366 77 diff = yslow-yfast
Chris@366 78 snr = 10*log10( abs( vdot(yslow,yslow) / vdot(diff,diff) ) )
Chris@366 79 print 'snr=%s' % snr
Chris@366 80 if snr < 10.0:
Chris@366 81 print 'h=',h
Chris@366 82 print 'sig=',sig[:5],'...'
Chris@366 83 print 'yslow=',yslow[:5],'...'
Chris@366 84 print 'yfast=',yfast[:5],'...'
Chris@366 85
Chris@366 86 def utilfastfilter(sig,h,nfft,usereal):
Chris@366 87 import compfft
Chris@366 88 import os
Chris@366 89 open( 'sig.dat','w').write( compfft.dopack(sig,'f',not usereal) )
Chris@366 90 open( 'h.dat','w').write( compfft.dopack(h,'f',not usereal) )
Chris@366 91 if usereal:
Chris@366 92 util = './fastconvr'
Chris@366 93 else:
Chris@366 94 util = './fastconv'
Chris@366 95 cmd = 'time %s -n %d -i sig.dat -h h.dat -o out.dat' % (util, nfft)
Chris@366 96 print cmd
Chris@366 97 ec = os.system(cmd)
Chris@366 98 print 'exited->',ec
Chris@366 99 return compfft.dounpack(open('out.dat').read(),'f',not usereal)
Chris@366 100
Chris@366 101 if __name__ == "__main__":
Chris@366 102 main()