【发布时间】:2022-01-04 22:51:15
【问题描述】:
我有一个太阳黑子数量的时间序列,其中每月计算太阳黑子的平均数量,我正在尝试使用傅里叶变换从时域转换到频域。使用的数据来自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) 时会更清楚。
我是否错误地使用了傅立叶变换函数?
【问题讨论】:
-
FFT 是很棘手的事情。请记住,FFT 将信号分解为正弦波。仅仅因为您的数据每 132 个月出现一次峰值并不意味着您将在那里出现 FFT 峰值。我获取了数据,该图显示了 25 个月的峰值频率。顺便说一句,您可以考虑改用
np.fft.rfft,因为您有实值数据。 -
感谢您对使用
np.fft.rfft的建议!只是问一下 - FFT 可能不会每 11 年出现一次峰值,但numpy.fft.fftfreq应该会在 11 年时返回一个峰值,对吗? -
没有。
fftfreq根本不使用数据。它只是计算您的 x 轴值。它基本上是np.arange()除以一个常数。 -
谢谢!我想我现在理解得更好了,因为我也对情节和代码做了一些调整。