1. 程式人生 > >可用於實時嵌入式裝置的心電訊號基線漂移濾除方法——基於延遲的近似零相位IIR濾波器

可用於實時嵌入式裝置的心電訊號基線漂移濾除方法——基於延遲的近似零相位IIR濾波器

      考慮到ECG訊號去基漂演算法需要在嵌入式裝置中執行,並且儘可能降低延遲,選擇IIR低通濾波器求得訊號的基線漂移。將訊號減去基漂後得到最終訊號。
      參考論文《基於零相位的心電訊號基線漂移濾波方法的實時性改進》。該論文提出了一種(近似)零相位的心電訊號基線漂移濾波方法。零相位IIR濾波在很多書中都有提到,主要原理是:先將輸入訊號按順序濾波,然後將結果逆轉後再次通過濾波器,將結果逆轉後即可得到精確零相位的輸出結果。但是這個完美的演算法需要拿到全部的測量資料後才能執行,沒法實時實現啊。
論文提出了一種有一定延遲的近似零相位的方法:
      ①    設計IIR濾波器,並將輸入訊號按順序濾波。這一步可以用直接結構IIR濾波器實現,有少量的延遲。這裡我用的2階巴特沃斯低通。
      ②    IIR濾波器的單位衝激響應為無限長,正是由於這個原因導致零相位濾波器無法實時實現。取出這個無限長衝激響應的前N項作為第二步的濾波器,係數記為Hn。
      ③    將第①步得到的結果與Hn點乘後再累加。這個步驟相當於零相位濾波器的反轉→濾波→反轉的過程。這樣即可得到最終結果。
      上述步驟的技術細節見論文。
      我們的訊號取樣率為250Hz。在MATLAB中設計IIR濾波器,參考論文中的引數,階數為2,截止頻率為0.67Hz。先直接給出結果:
 


      上圖藍色是原始心電訊號(請忽略高頻噪聲,尷尬 ̄□ ̄||)。黑色是隻經過第①步即只通過IIR濾波器得到的基線,由於IIR不是線性相位,群延遲不固定,這裡通過作圖取<0.67Hz頻段的大概平均延遲100,然後進行對齊。紅色是經過(近似)零相位濾波的結果,這裡大概有400點的延遲,也進行了對齊,關於延遲後面再講。得到的基線明顯紅色更好!
再來看看濾除基線的最終訊號:
 
      上圖藍色是原始心電訊號,黑色是隻經過第1步IIR濾波得到的訊號,紅色是經過兩步濾波得到的訊號。其實肉眼看不太出來優勢,但是紅色保持R波峰值方面有優勢。由於作圖時給定的offset不同,紅色TP段略低於黑色,但二者R波高度相當。若把TP段放在相同縱座標,紅色的R波保持的優勢就明顯了。從第1張圖也可以看出來,如果只通過簡單的IIR濾波,計算出來的基線在R波峰值附近會有個小波峰。
      再說幾個剛才提到和沒提到的問題:
      1、    截斷濾波器N的選取問題
      論文中建議是取樣率/截止頻率,這個資料基本沒問題。實踐中最好根據實際情況調整下。而且,如果不是低通濾波器呢?這個建議數值沒法用,所以還是得實際情況具體分析。我是把濾波器的群延遲作圖,大概選了個合適的數值:400。見下圖:
 

      其中黑線是第1個IIR濾波器的延遲,藍線是截斷反轉濾波器的延遲,紅線是二者之和,橫座標是頻率(Hz),縱座標是取樣點。可以看出,在0~0.67Hz內總的延遲基本為一條直線。至於阻帶的延遲,我們就不關心了,畢竟基線都在低頻。正是由於截斷反轉濾波器的存在,修正了IIR延遲不恆定的問題。
附上全頻帶的延遲曲線供參考吧:
 
      2、    截斷反轉濾波器的理解
      將IIR截斷並反轉後的濾波器,本質上就是一個因果的FIR濾波器!但是由於它就是IIR的粗魯的截斷,所以是犧牲了一定效能,來換取能用延遲實現的近似零相位。FIR濾波器的延遲較大,所以這個方法還導致整個濾波器的延遲增大了。從上面的圖可以看出。這其實也是用全通濾波器校正IIR相位存在的問題。