mirror of
https://github.com/mborgerding/kissfft.git
synced 2025-06-04 01:28:23 -04:00
n-dimensional FFT works
This commit is contained in:
parent
5e6199c868
commit
22ff70b71d
59
test/fft.py
59
test/fft.py
@ -148,9 +148,11 @@ def randmat( ndims ):
|
|||||||
def test_fftnd(ndims=3):
|
def test_fftnd(ndims=3):
|
||||||
import FFT
|
import FFT
|
||||||
import Numeric
|
import Numeric
|
||||||
|
random.seed(2)
|
||||||
|
|
||||||
x=randmat( ndims )
|
x=randmat( ndims )
|
||||||
print 'dimensions=%s' % str( Numeric.shape(x) )
|
print 'dimensions=%s' % str( Numeric.shape(x) )
|
||||||
|
#print 'x=%s' %str(x)
|
||||||
xver = FFT.fftnd(x)
|
xver = FFT.fftnd(x)
|
||||||
x2=myfftnd(x)
|
x2=myfftnd(x)
|
||||||
err = xver - x2
|
err = xver - x2
|
||||||
@ -158,7 +160,11 @@ def test_fftnd(ndims=3):
|
|||||||
xverf = flatten(xver)
|
xverf = flatten(xver)
|
||||||
errpow = Numeric.vdot(errf,errf)+1e-10
|
errpow = Numeric.vdot(errf,errf)+1e-10
|
||||||
sigpow = Numeric.vdot(xverf,xverf)+1e-10
|
sigpow = Numeric.vdot(xverf,xverf)+1e-10
|
||||||
print 'SNR=%sdB' % str(10*math.log10(abs(sigpow/errpow) ) )
|
snr = 10*math.log10(abs(sigpow/errpow) )
|
||||||
|
if snr<80:
|
||||||
|
print xver
|
||||||
|
print x2
|
||||||
|
print 'SNR=%sdB' % str( snr )
|
||||||
|
|
||||||
def myfftnd(x):
|
def myfftnd(x):
|
||||||
import Numeric
|
import Numeric
|
||||||
@ -168,20 +174,41 @@ def myfftnd(x):
|
|||||||
|
|
||||||
def fftndwork(x,dims):
|
def fftndwork(x,dims):
|
||||||
import Numeric
|
import Numeric
|
||||||
if len(dims)==1:
|
kk=1
|
||||||
return fft(x,0)
|
for k in range( len(dims) ):
|
||||||
else:
|
d=dims[ k ]
|
||||||
samples_per_chunk = Numeric.product( dims[1:] )
|
g=Numeric.product( dims ) / d
|
||||||
precomp = [ ]
|
#print 'dimension %d==%d, g=%d' % ( k ,d,g )
|
||||||
curfftlen = dims[ 0 ]
|
#print 'x=%s' % str(x)
|
||||||
for i in range( curfftlen ):
|
next_stage = []
|
||||||
xslice = x[ i*samples_per_chunk : (i+1)*samples_per_chunk ]
|
chunk = 0
|
||||||
precomp.extend( fftndwork( xslice,dims[1:] ) )
|
for ii in range(kk):
|
||||||
xout = [ complex(0,0) ] * samples_per_chunk * dims[0]
|
start = ii*d*g
|
||||||
for i in range( samples_per_chunk ):
|
for i in range(start,start+g):
|
||||||
pfx = fft( precomp[ i::samples_per_chunk ],0 )
|
xslice = x[i:(i+d)*g:g]
|
||||||
xout[ i::samples_per_chunk ] = pfx
|
if len(xslice) != d:
|
||||||
return xout
|
print 'len(xslice)= %d' % len(xslice)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
fxslice = fft(xslice,0)
|
||||||
|
#print 'fft( x[%d:%d:%d] ) ' %( i,(i+d)*g,g),
|
||||||
|
#print 'fft( %s ) == %s ' % (str(xslice),str(fxslice))
|
||||||
|
next_stage.extend( fxslice )
|
||||||
|
if len(next_stage) != len(x):
|
||||||
|
print 'len(next_stage)= %d' % len(next_stage)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
#kk *= d
|
||||||
|
#print 'next_stage=%s' % str(next_stage)
|
||||||
|
x = next_stage[:]
|
||||||
|
return x
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
try:
|
||||||
|
nd = int(sys.argv[1])
|
||||||
|
except:
|
||||||
|
nd=None
|
||||||
|
if nd:
|
||||||
|
test_fftnd( nd )
|
||||||
|
else:
|
||||||
|
sys.exit(0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user