以fft和ifft为特定频率

时间:2015-07-20 16:05:45

标签: python numpy scipy

我对fftifft函数有疑问。

假设A是一个包含365天数据的数组:

fft_output = scipy.fftpack.fft(A)

它给出了与所有频率相关的系数。我只需要三个频率(0, 1/365, 1/182)。所以我认为fft_output[0]fft_output[364]fft_output[181]对于我想要的频率来说是正确的选择。

现在我想通过使用这三个频率365天来ifft。我没有弄清楚如何使用ifft函数来完成此操作。

如果有人引导我,我将不胜感激。

提前谢谢

2 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了这个问题,但让我试一试:

首先,如果您需要原始信号的几个分量的幅度,您可以单独计算它们。如果A是您的数据系列,并且您只想知道k bin,则可以使用definition of DFT

x = np.sum(A*np.exp(-1j*2*np.pi*k*np.arange(len(A))/len(A)))

由于k的单位是周期/样本,因此k bin对应的频率由k*F_s/len(A)给出,其中F_s是采样频率信号A(例如Hz,m ^ -1等)。

相应的IFFT bin是通过取指数的负数给出的:

x = np.sum(A*np.exp(1j*2*np.pi*k*np.arange(len(A))/len(A)))

接下来,假设您已使用上面的第一个等式来计算三个分档x0x181x364,如果您想要重建原始信号,请使用只是这些值,你可以这样做:

F = np.zeros((365))
F[0] = x0
F[181] = x181
F[364] = x364
A2 = np.fft.ifft(F) # complex--you may wish to use np.abs(np.fft.ifft(F))

答案 1 :(得分:0)

最后,我使用以下代码计算数据的年度周期。希望它给了我正确答案。

Amp = scipy.fftpack.fft(A)

F = np.zeros(365)

F = F.tolist()

F[0] = Amp[0]

F[1] = Amp[1]

F[364] = Amp[364]

ann_cycle = np.abs(np.fft.ifft(F))