簡體   English   中英

如何使用Python在原始信號上應用FFT

[英]How to apply FFT on raw signal using Python

我是處理信號的新手,需要您的幫助。

我已經從TI AFE4490獲得了10秒的原始PPG(光電容積描記)信號。 我的硬件已經過校准,我每秒使用250個樣本來記錄這些信號。 最后我獲得了2500分。

您可以在下面看到圖像,要點和代碼。

頂部:我的原始PPG信號-底部:嘗試應用FFT: 頂部:我的原始PPG信號-底部:嘗試應用FFT

碼:

RED, IR, nSamples, sRate = getAFESignal()


period = 1/sRate

plt.figure(1)

plt.subplot(2,1,1)
x = np.linspace(0.0, nSamples*period, nSamples)
y = IR
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.plot(x,y)

plt.subplot(2,1,2)
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*period), nSamples//2) 
plt.xlabel("Frequency (Hz)")
plt.ylabel("Gain")
plt.plot(xf, 2.0/nSamples * np.abs(yf[0:nSamples//2])) 

plt.grid()
plt.show()

函數getAFEsignal()只是一個讀取.txt文件並將其全部放入兩個numpy數組的函數。

在這里您可以找到.txt文件: 原始信號文件

如您所見,我沒有正確應用FFT,我需要這樣做才能發現需要過濾的頻率。 您知道我在做什么錯嗎,並且是否有可能在此信號上應用FFT?

好消息是您對FFT的計算很好。 您在時域中顯示的數據具有相當強的低頻成分。 相應地,您得到的頻域圖顯示出一個接近0Hz的尖峰。

主要問題在於如何繪制結果。 為了根據對時域波形的直覺更好地了解在頻域中可能看到的內容,您需要重新調整每個軸的比例。 特別是,在顯示的時間范圍內,您可能希望注意到持續時間約為0.25秒到幾秒鍾的模式。 那將對應於大約0-5Hz的頻率范圍。 然后,將重點放在該范圍而不是顯示整個0-125Hz頻譜將是有意義的。 這可以通過如下設置x軸限制來實現:

plt.xlim(0,5) # set x-axis limits from 0 to 5Hz

類似地,對於y軸,您需要考慮到振幅較小的頻率分量(在線性范圍內很難注意到)仍然可以對時域信號產生非常明顯的影響。 因此,通常希望以對數分貝標度顯示頻域幅度。 可以按照以下步驟進行:

plt.plot(xf, 20*np.log10(2.0/nSamples * np.abs(yf[0:nSamples//2])))

最后,如果您希望更好地了解某些特定頻率分量的影響而又不受其他頻率分量頻譜泄漏的干擾,則可能需要考慮在計算FFT之前對時域信號進行預濾波。 例如,如果要消除恆定信號偏置,緩慢的〜0.1Hz變化和頻率大於10Hz的噪聲的影響,則可以使用以下方法:

import scipy.signal
b,a = signal.butter(4, [0.25/sRate, 10/sRate], btype='bandpass')
y = signal.filtfilt(b,a,signal.detrend(IR, type='constant'))

暫無
暫無

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

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