对于几个特定的频率进行fft和ifft操作。

3
我有一个关于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个回答

2
我不确定我是否正确理解了问题,但让我试着回答一下:
首先,如果您只需要原始信号的几个分量的振幅,您可以单独计算它们。如果 A 是您的数据序列,并且您只想知道第 k 个 bin,您可以使用DFT 的定义
x = np.sum(A*np.exp(-1j*2*np.pi*k*np.arange(len(A))/len(A)))

因为k的单位是cycles/sample,所以与第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/365),我必须选择成对的频率(正和负),除了零频率。也就是说,在我的情况下选择1和364。 - zhr

1

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

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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接