我愿意对时间序列数据进行傅里叶变换,以将数据转换为频域。我不确定我用来进行傅立叶变换的方法是否正确?以下是我使用过的数据的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天
接下来,我使用以下代码实现了傅立叶变换,并获得了如下图像:
availableLabelNames: [String]
我有以下问题:
我不确定我上面的方法是否正确实施傅里叶变换。
我不确定用于避免混叠的方法是否正确。
如果,我所做的比在解释频域图中的三个峰值方面是正确的。
最后,我将如何仅使用重要的频率来进行变换。
答案 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)
这确实应该做到!