Python 中的傅里叶变换时间序列

Fourier Transform Time Series in Python

我有一个太阳黑子数的时间序列,其中每个月计算太阳黑子的平均数量,我正在尝试使用傅里叶变换从时域转换到频域。使用的数据来自https://wwwbis.sidc.be/silso/infosnmtot。 我感到困惑的第一件事是如何将采样频率表示为每月一次。我是否需要将其转换为秒数,例如。 1/(30 天内的秒数)?到目前为止,这是我得到的:

fs = 1/2592000
#the sampling frequency is 1/(seconds in a month)

fourier = np.fft.fft(sn_value)
#sn_value is the mean number of sunspots measured each month
freqs = np.fft.fftfreq(sn_value.size,d=fs)

power_spectrum = np.abs(fourier)

plt.plot(freqs,power_spectrum)

plt.xlim(0,max(freqs))
plt.title("Power Spectral Density of the Sunspot Number Time Series")
plt.grid(True)

我认为这不正确 - 即因为我不知道 x 轴的比例是多少。但是我知道在 (11years)^-1 应该有一个峰值。

第二个我想知道的问题是为什么看起来有两条线 - 一条是 y=0 上方的水平线。当我将 x 轴边界更改为:plt.xlim(0,1).

时会更清楚

我是否错误地使用了傅里叶变换函数?

您可以使用任何您想要的单位。随意将您的采样频率表示为 fs=12 (samples/year),x 轴将以 1/年为单位。或使用fs=1(sample/month),则单位为1/月

您发现的额外线条来自您绘制数据的方式。查看 np.fft.fftfreq 调用的输出。该数组的前半部分包含从 0 到 1.2e6 左右的正值,另一半包含从 -1.2e6 到几乎为 0 的负值。通过绘制所有数据,您会得到一条从 0 到右边的数据线,然后是从最右边的点到最左边的点直线,然后数据线的其余部分回零。您的 xlim 调用成功了,因此您看不到绘制的一半数据。

通常你只会绘制数据的前半部分,只需裁剪 freqspower_spectrum 数组。