簡體   English   中英

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 軸的比例是多少。 但是我確實知道(11 年)^-1 應該有一個峰值。

我從這張圖中想知道的第二件事是為什么似乎有兩條線 - 一條是 y=0 上方的水平線。 當我將 x 軸邊界更改為:plt.xlim(0,1) 時會更清楚。

plt.xlim(0,1) 時的圖形

我是否錯誤地使用了傅立葉變換函數?

你可以使用任何你想要的單位。 隨意以樣本/年表示您的采樣頻率。 然后,x 軸將具有 1/年單位。

您發現的額外線來自您 plot 數據的方式。 查看np.fft.fftfreq調用的 output。 該數組的前半部分包含從 0 到 1.2e6 左右的正值,另一半包含從 -1.2e6 到幾乎為 0 的負值。通過繪制所有數據,您會得到一條從 0 到右側的數據線,然后是從最右邊點到最左邊點的直線,然后將數據線的rest歸零。 您的xlim調用使您看不到繪制的數據的一半。

通常,您只需要前半部分數據freqs ,只需裁剪頻率和功率譜power_spectrum

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM