import cmath def fft(input): N=len(input) n=1 M=0 while N>n: M+=1 n*=2 if n != N: print "size must be power of 2" return None N2=N/2 output=[0]*N #bit reversal j=0 for i in range(N-1): output[j]=complex(input[i]) b=N2 while(b<=j): j=j-b b=b/2 j=j+b output[N-1]=complex(input[N-1]) #twiddle factors stride2=1 for i in range(M): q=0 stride1=stride2 stride2=2*stride1 for k in range(stride1): a=cmath.exp(-1j*q) q=q+cmath.pi/stride1 for j in range(k,N,stride2): j2=j+stride1 print j2,j,a temp=output[j2]*a output[j2]=output[j]-temp output[j]=output[j]+temp return output def invfft(input): output=fft([i.conjugate()/len(input) for i in input]) return [i.conjugate() for i in output] a=range(2048) b=range(2048) b.reverse() input=a+b print invfft(fft(input))