import cmath # an in place implementation 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 N2=N/2 #bit reversal j=0 for i in range(N-1): if i < j: temp=input[j] input[j]=input[i] input[i]=temp b=N2 while(b<=j): j=j-b b=b/2 j=j+b #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=input[j2]*a input[j2]=input[j]-temp input[j]=input[j]+temp return def invfft(input): N=len(input) for i in range(N): input[i]=i.conjugate()/N fft(input) for i in range(N): input[i]=input[i].conjugate() return a=range(2048) b=range(2048) b.reverse() input=a+b fft(input) invfft(input) print input