2016-05-14 74 views
3

我仍然試圖在Python中使用FFT對此data進行頻率分析。 採樣率是每分鐘1個數據點。使用Python的FFT - 意外的低頻

我的代碼是:

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)|') 

但結果得出:

enter image description here

所以我的問題是:

1)爲什麼沒有頻率呢?數據顯然是週期性的。

2)爲什麼頻譜如此之低? (0 - 0.009)

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

任何見解?

謝謝!

+1

由FFT函數返回的數組中的第一項具有DC分量,即原始數組中的所有值的總和。這通常比周期性分量大幾個數量級。在繪圖之前嘗試繪製'Y [1:]'或繪製'Y [0] = 0',您應該看到您的頻率出現。 – Jaime

+0

我試圖在繪製之前先做Y [0] = 0,但仍然沒有頻率。也許這是正常化?因爲週期性行爲是一天兩次。 – ValientProcess

+1

通常,您要使用對數刻度繪製Y軸。您還忘了在FFT之前應用合適的窗口功能。 –

回答

2

1)爲什麼沒有頻率呢?數據顯然是週期性的。

那麼,有頻率的內容,它只是不完全可見,因爲它的結構。試着改變了標繪的頻譜線,從ax[1].plot(frq,abs(Y),'r')ax[1].semilogy(frq,abs(Y),'r')

這將導致到:

semilog Spectrum

如果我們現在已經應用了簡單的改造是提升低值和高限制值。欲瞭解更多信息,請參閱​​。當然,刪除DC(就像你在代碼的第3行那樣)也有幫助。

這似乎仍然有點模糊,它是,但如果我們放大到頻譜的下部,我們可以看到這一點:

semilog Transform

其中顯示了一個峯值大約2.3E-05 Hz,相當於大約12小時。

2)爲什麼頻譜如此之低? (0-0。009)

因爲您每60秒採樣一次,所以您的採樣頻率爲(大約)0.016 Hz。您的頻譜包含DC(0Hz)和0.0083Hz之間的所有內容。欲瞭解更多信息,請參閱this link

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

如果你不能解決諧波但你看起來並不需要它,你可以嘗試開窗。

希望這會有所幫助。

1

這些頻率看起來如此之低的部分原因是因爲您的幅度圖中的時間軸會被奇怪地縮放。如果您每60秒確實有一個樣本,那麼x軸的範圍應介於0到1690260秒之間(即〜20天!)。

enter image description here

通過眼睛,你似乎有每50000秒(〜2每天)約一小峯,這將對應於大約2x10⁻⁵Hz的頻率。因此,您的週期圖對我而言看起來相當合理,因爲x軸的尺寸有多大。