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

jay*_*jay 6 python fft

我有一个太阳黑子数量的时间序列,其中太阳黑子的平均数量是每月计算的,我正在尝试使用傅立叶变换从时域转换到频域。使用的数据来自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)
Run Code Online (Sandbox Code Playgroud)

这是图形输出

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

从这张图中我想知道的第二件事是为什么似乎有两条线 - 一条是 y=0 上方的水平线。当我将 x 轴边界更改为:plt.xlim(0,1) 时,情况会更清楚。

plt.xlim(0,1) 时的图表

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

Cri*_*ngo 4

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

\n

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

\n

通常,您\xe2\x80\x99d 仅绘制数据的前半部分,只需裁剪freqspower_spectrum数组。

\n