簡體   English   中英

使用 Python 對原始信號應用合適的巴特沃斯濾波器

[英]Applying an suitable butterworth filter on raw signal using Python

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

我使用了 lowcut=0.5、highcut=15 和 order=2 的 Butterworth 帶通濾波器。 您可以在下面看到我的原始信號和過濾后的信號:

頂部 = 原始光體積描記圖信號,底部 = 過濾后的光體積描記圖信號

我還嘗試使用 lowcut=15 和 order=2 的 Butterworth 低通濾波器對其進行過濾。 如您所見,我的原始信號和過濾后的信號如下:

頂部 = 原始光體積描記圖信號,底部 = 過濾后的光體積描記圖信號

我在一些文章中讀到 0.5Hz 和 15Hz 是此類信號的良好低切和高切頻率。

在我應用過濾器之前,我使用了 Scipy Butterworth(來自 scipy docs)算法來顯示過濾器響應,這很好。

在那個“開始”(開始時的高度)之后,我的過濾信號似乎很好,但我不知道為什么開始。 任何人都可以告訴我“開始”在 Butterworth 過濾器中是否正常? 如果是,有什么方法可以解決嗎?

我感謝您的幫助。

我的代碼:

RED, IR, nSamples, sRate = getAFESignal()

period = 1/sRate # Signal period.
# Desired cutoff frequency (in Hz) and filter order.
lowcut = 0.5
highcut = 15
orders = 2

plt.figure(1)

x = np.linspace(0, nSamples*period, nSamples, endpoint=True)

plt.subplot(2,1,1)
y = IR
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.plot(x,y, label='Noisy signal')


plt.subplot(2,1,2)
yf = butter_bandpass_filter(IR, lowcut, highcut, nSamples, order=orders)
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.plot(x, yf, label='Filtered signal')

plt.grid()
plt.show()

函數getAFEsignal()只是一個讀取.txt 文件並將所有內容放入兩個 numpy 數組中的函數。

您在圖表中看到的初始瞬變是濾波器的階躍響應,因為突然輸入應用於處於靜止狀態的濾波器。 如果您剛剛連接了一個包含此類帶通濾波器的物理儀器,則該儀器的傳感器可能會拾取從 0(當探頭斷開連接時)跳到第一個樣本值 ~0.126V 的輸入數據樣本。 儀器濾波器的響應隨后會顯示出類似的瞬態。

但是,您可能對儀器不再受這些外部因素(例如連接的探頭)干擾並有時間穩定到感興趣信號的特性后的穩態響應更感興趣。

實現這一點的一種方法是使用足夠長的數據樣本並丟棄初始瞬態。 另一種方法是強制濾波器的初始內部狀態接近於在您的第一個輸入樣本之前應用類似幅度的信號一段時間時可能預期的狀態。 例如,這可以通過使用scipy.signal.lfilter_zi設置初始條件來完成。

現在,我假設您已經使用了 SciPy Cookbook 中的butter_bandpass_filter ,它不會處理過濾器的初始條件。 幸運的是,可以很容易地為此修改它:

from scipy.signal import butter, lfilter, lfilter_zi

def butter_bandpass_filter_zi(data, lowcut, highcut, fs, order=5):
    b, a = butter_bandpass(lowcut, highcut, fs, order=order)
    zi = lfilter_zi(b, a)
    y,zo = lfilter(b, a, data, zi=zi*data[0])
    return y

在此處輸入圖像描述

此時要注意的另一件事是,您將butter_bandpass_filter稱為:

yf = butter_bandpass_filter(IR, lowcut, highcut, nSamples, order=orders)

nSamples (樣本總數,在您的情況下為 2500)作為第 4 個參數傳遞,而該函數期望采樣率(在您的情況下為 250)。 兩個量之間的系數 10 的效果相當於將過濾范圍從[0.5,15] Hz 減小到[0.05,1.5] Hz。 要獲得預期的帶通頻率范圍,您應該將sRate作為第四個參數傳遞:

yf = butter_bandpass_filter_zi(IR, lowcut, highcut, sRate, order=orders)

在此處輸入圖像描述

最后,您可能會注意到最后一個輸出比輸入的三角形少一點。 這是由於濾掉了 0.5Hz 附近的一些低頻內容造成的。 如果那是您所期待的,那就太好了。 否則,您仍然可以嘗試使用截止頻率來獲得您認為會產生最佳結果的任何頻率。 例如(我並不是說這是一個更好的頻率范圍),如果你設置lowcut=0.25你會得到一個更三角形的圖形,例如:

在此處輸入圖像描述

暫無
暫無

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

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