2017-06-24 212 views
1

我想平滑以200Hz獲得的FFT圖形(我現在捕獲500個點),以便代表性的峯值顯示在THIS附近。在Python中平滑FFT圖形

這是我的代碼:

N = 500 
T = 5/1000 
y1 = np.array(data_Ax) 
yf1 = scipy.fftpack.fft(y1) 
xf1 = np.linspace(0.0, 1.0/(2.0*T), N/2) 
yfft1 = 2.0/N * np.abs(yf1[:N//2]) 

plt.figure(figsize=(20, 3), dpi= 100, facecolor='w', edgecolor='k') 
plt.plot(xf1, yfft1, 'g-', label ="FFT for Ax") 
plt.xlabel('Frequency [Hz]') 
plt.legend(loc=1) 

,平滑處理我試圖用這樣的:

rft = np.fft.rfft(yfft1) 
y_smooth = np.fft.irfft(rft) 

但它並沒有任何影響。

我很清楚,200Hz是一個低採樣頻率,500次測量並不多,但它只是爲了得到程序的掛起。下面是獲得圖: enter image description here

我想知道:

  1. 如何平滑曲線?
  2. 如何去除0Hz處的峯值(高通濾波器)?
  3. 從理論的角度來看,有代表性的FFT圖的測量的最小數量要求是什麼?

謝謝任何​​幫助!

大號

回答

2

平滑圖:

我以爲你真的希望以後越來越多的點數。所以只需指定你想讓它看起來更平滑點的數量。

例如這裏是具有相同數量的點作爲測量的FFT:

n = 500 
nfft = n 

t = np.linspace(0, 0.1, n) 
y = 0.5 + np.sin(2*np.pi*60*t) 
yf = fftshift(fft(y, nfft)) 

f = fftshift(fftfreq(nfft, np.mean(np.diff(t)))) 

pyplot.plot(f, abs(yf)) 
pyplot.grid() 
pyplot.xlim([-100, 100]) 

enter image description here

如果你改變FFT的點數爲4096,即nfft=2**12,那麼你會得到一個更平滑的圖形。 enter image description here

在0赫茲

刪除峯如果DC值是所有你關心的,那麼就減去平均。根據上面的示例,您可以將第5行更改爲

yf = fftshift(fft(y - np.mean(y), nfft)) 

並且您將得到沒有基帶的FFT。 enter image description here

從理論的角度來看的最小數量,你只需要滿足尼奎斯特速率。但是,對於視覺效果,FFT中的頻率間隔爲Fs/N。因此,如果採樣率爲500 Hz和500點,那麼點之間的間距爲1 Hz,如果您的帶寬爲5 Hz,則這可能不足,因此您可以通過零填充信號來增加FFT的點數,或者降低採樣率(只要它在奈奎斯特以上)...

1

首先我建議你得到500多個樣本。這只是2.5期

使用韋爾奇的方法應該有助於得到一個更平滑的圖。

doc scipy