kissfft/fft.py
2003-11-12 01:09:35 +00:00

79 lines
1.7 KiB
Python

#!/usr/local/bin/python2.3
import math
pi=math.pi
e=math.e
j=complex(0,1)
def fft(f):
n=len(f)
if n==1:
return f
for p in 2,3,5:
if n%p==0:
break
else:
raise Exception('%s not factorable ' % n)
#print 'n=%d,p=%d' % (n,p)
#print f,' << fin'
m = n/p
Fout=[]
for q in range(p): # 0,1
fp = f[q::p]
#print fp,'<< fp'
Fp = fft( fp )
Fout.extend( Fp )
for u in range(m):
scratch = Fout[u::m] # u to end in strides of m
#print scratch
for q1 in range(p):
k = q1*m + u # indices to Fout above that became scratch
Fout[ k ] = scratch[0] # cuz e**0==1 in loop below
for q in range(1,p):
t = e ** ( j*2*pi*k*q/n )
Fout[ k ] += scratch[q] * t
return Fout
def real_fft( f ):
broken
N = len(f) / 2
res = f[::2]
ims = f[1::2]
fp = [ complex(r,i) for r,i in zip(res,ims) ]
Fp = fft( fp )
Fpr = [ c.real for c in Fp ]
Fpi = [ c.imag for c in Fp ]
F1 = [complex(0,0)]*(N+1)
F2 = [complex(0,0)]*(N+1)
F1[0] = complex( Fpr[0] , 0 )
F2[0] = complex( Fpi[0] , 0 )
#F1[N] = complex( Fpr[N] , 0 )
#F2[N] = complex( Fpi[N] , 0 )
for k in range(1,N):
F1[k] = complex( (Fpr[k]+Fpr[N-k])/2 , j*(Fpi[k]-Fpi[N-k])/2 )
F2[k] = complex( (Fpi[k]+Fpi[N-k])/2 , j*(Fpr[k]-Fpr[N-k])/2 )
F = [ complex(0,0) ] * ( N + 1 )
for k in range(N+1):
F[k] = F1[k] + e ** ( j*pi*k/N ) * F2[k]
return F
def test(f=range(1024),ntimes=10):
import time
t0 = time.time()
for i in range(ntimes):
fft(f)
t1 = time.time()
print '%ss'% (t1-t0)