将傅里叶变换应用于时间序列数据并避免混叠。

8
我愿意对时间序列数据应用傅里叶变换,将其转换为频域数据。我不确定我使用的傅里叶变换方法是否正确?下面是我使用的数据链接
读取数据文件后,我使用以下代码绘制原始数据:
t = np.linspace(0,55*24*60*60, 55)
s = df.values
sns.set_style("darkgrid")
plt.ylabel("Amplitude")
plt.xlabel("Time [s]")
plt.plot(t, s)
plt.show()

由于数据是以每日为频率的,所以我使用 24*60*60 将其转换为秒,并使用 55*24*60*60 进行了55天的计算。

图表如下:Original Time Series

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

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

Transformed

我有以下问题:

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

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

如果我的做法是正确的,那么如何解释频域图中的三个峰值。

最后,如何使用只有显著频率的信号进行反向变换。

1个回答

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)

好的,那就这样吧!


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