我试图还原python中的fft函数。在这里,我们看到了一个类似的问题,手动fft不能给我与fft相同的结果,但是我很难判断我是在做同样的错误,还是在做不同的错误。
import numpy as np
import numpy.random as npr
N=9 ### 10 -1
MC=10
###Genrate soem data
data=complex(1,0)*npr.uniform(size=(N,MC))+complex(0,1)*npr.uniform(size=(N,MC))
naive_fft=complex(1,0)*np.zeros((N,MC))
for K in range(N):
for m in range(N):
phase=(2*np.pi*K*m)/float(N+1)
naive_fft[K,:]=naive_fft[K,:]+data[m,:]*np.exp(complex(0,1)*phase)
fft=np.fft.fft(data,axis=0)
ifft=np.fft.ifft(data,axis=0)
print('fft')
print(naive_fft-fft)
print('ifft')
print(naive_fft-ifft*(N+1.0))将我的结果与numpy fft进行比较,我既不能再现fft,也不能再现ifft (只有naive_fft[0,:]似乎与fft[0,:]值匹配。
发布于 2016-02-01 14:52:44
有几件事要提。首先,在Python中,我们使用1j来表示假想单位,而不是complex(0, 1)。如果您想将您的结果与numpy进行比较,那么您必须检查numpy是如何实现fft的。有关细节,请参阅Numpy FFT文档。您会发现numpy遵循最常见的fft定义,它使用负指数。此外,您的阶段中的float(N+1)是完全错误的。它必须读N。总之,你拥有:
# ...
naive_fft = np.zeros((N,MC), dtype='complex')
for K in range(N):
for m in range(N):
phase=(-2*np.pi*K*m) / float(N)
naive_fft[K] += data[m] * np.exp(phase*1j)
xfft = np.fft.fft(data, axis=0)
# ...用
>>> np.isclose(xfft, naive_fft).all()
True逆变换工作类似,但有一个正指数。
https://stackoverflow.com/questions/35128772
复制相似问题