簡體   English   中英

使用Python的FFT - 意外的低頻率

[英]FFT using Python - unexpected low frequencies

我仍在嘗試使用Python中的FFT對這些數據進行頻率分析。 采樣率是每分鍾1個數據點。

我的代碼是:

from scipy.fftpack import fft
df3 = pd.read_csv('Pressure - Dates by Minute.csv', sep=",", skiprows=0)
df3['Pressure FFT'] = df3['ATMOSPHERIC PRESSURE (hPa) mean'] - df3['ATMOSPHERIC PRESSURE (hPa) mean'].mean()
Pressure = df3['Pressure FFT']
Fs = 1/60
Ts = 1.0/Fs
n = len(Pressure)
k = np.arange(n)
T = n/Fs
t = np.arange(0,1,1/n) # time vector
frq = k/T # two sides frequency range
frq = frq[range(int(n/2))] # one side frequency range

Y = np.fft.fft(Pressure)/n # fft computing and normalization
Y = Y[range(int(n/2))]

fig, ax = plt.subplots(2, 1)
ax[0].plot(t,Pressure)
ax[0].set_xlabel('Time')
ax[0].set_ylabel('Amplitude')
ax[1].plot(frq,abs(Y),'r') # plotting the spectrum
ax[1].set_xlabel('Freq (Hz)')
ax[1].set_ylabel('|Y(freq)|')

但結果給出:

在此輸入圖像描述

所以我的問題是:

1)為什么根本沒有頻率? 數據顯然是周期性的。

2)為什么頻譜這么低? (0 - 0.009)

3)也許我應該嘗試不同的過濾技術?

任何見解?

謝謝 !!!

1)為什么根本沒有頻率? 數據顯然是周期性的。

嗯,有頻率內容,由於其結構,它只是不完全可見。 嘗試更改繪制頻譜的線,從ax[1].plot(frq,abs(Y),'r')ax[1].semilogy(frq,abs(Y),'r')

這將導致:

半光譜

我們現在應用了一個簡單的轉換,可以提升低值並限制高值。 有關更多信息,請參閱此鏈接 當然,刪除DC(就像你在代碼的第3行所做的那樣)也有幫助。

這仍然看起來有點模糊,但如果我們放大到頻譜的下半部分,我們會看到:

semilog變換

其顯示大約2.3e-05Hz的尖峰,其對應於大約12小時。

2)為什么頻譜這么低? (0 - 0.009)

因為您每60秒采樣一次,因此您的采樣頻率(大約)為0.016 Hz。 您的頻譜包含DC(0Hz)和0.0083Hz之間的所有信號。 有關詳細信息,請參閱此鏈接

3)也許我應該嘗試不同的過濾技術?

如果你不能解決諧波問題,你可以嘗試開窗,但這看起來不像是需要的。

希望這可以幫助。

這些頻率看起來如此之低的部分原因是因為振幅圖中的時間軸被奇怪地縮放。 如果你真的每60秒有一個樣本,那么x軸的范圍應該是0到1690260秒(即~20天!)。

在此輸入圖像描述

通過眼睛,你似乎每50000秒(每天約2次)有一個小峰值,這相當於大約2x10 -6 Hz的頻率。 因此,考慮到x軸的大小,你的周期圖對我來說看起來很合理。

暫無
暫無

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

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