对时间序列数据应用傅立叶变换,避免混叠

时间:2018-11-05 17:14:53

标签: python scipy fft aliasing time-frequency

我愿意对时间序列数据进行傅里叶变换,以将数据转换为频域。我不确定我用来进行傅立叶变换的方法是否正确?以下是我使用过的数据的link

读取数据文件后,我使用绘制了原始数据

24*60*60

由于数据每天都在运行,因此我已使用55*24*60*60将其转换为秒,并使用#Applying Fourier Transform fft = fftpack.fft(s) #Time taken by one complete cycle of wave (seconds) T = t[1] - t[0] #Calculating sampling frequency F = 1/T N = s.size #Avoid aliasing by multiplying sampling frequency by 1/2 f = np.linspace(0, 0.5*F, N) #Convert frequency to mHz f = f * 1000 #Plotting frequency domain against amplitude sns.set_style("darkgrid") plt.ylabel("Amplitude") plt.xlabel("Frequency [mHz]") plt.plot(f[:N // 2], np.abs(fft)[:N // 2]) plt.show() 将其转换为55天

图形如下:Original Time Series

接下来,我使用以下代码实现了傅立叶变换,并获得了如下图像:

availableLabelNames: [String]

Transformed

我有以下问题:

我不确定我上面的方法是否正确实施傅里叶变换。

我不确定用于避免混叠的方法是否正确。

如果,我所做的比在解释频域图中的三个峰值方面是正确的。

最后,我将如何仅使用重要的频率来进行变换。

1 个答案:

答案 0 :(得分:2)

虽然我不想回答您的前两个问题(对我来说看起来不错,但我很喜欢专家的意见),但我可以考虑后两个问题:

  

如果,我所做的比在解释频域图中的三个峰值方面是正确的。

好吧,这意味着您的信号中有三个主要成分,它们的频率分别约为0.00025 mHz(这里不是单位的最佳选择!),0.00125 mHz和0.00275 mHz。

  

最后,我将如何仅使用重要的频率来进行变换。

您可以将所确定的截止以下的每个频率归零(例如,绝对值3-此处应覆盖您的峰值)。然后,您可以执行以下操作:

below_cutoff = np.abs(fft) < 3
fft[below_cutoff] = 0
cleaner_signal = fftpack.ifft(fft)

这确实应该做到!