【導讀】:在嵌入式系統中經常需要采集模擬信號,采集模擬信號的信號鏈中難免引入干擾,那么如何濾除干擾呢?今天就來個一步一步描述如何設計部署一個IIR濾波器到你的系統。寫這篇文章考慮到很多粉絲是做單片機系統開發的,經常會需要采集模擬信號,系統中往往存在各種各樣的干擾,干擾常常讓人一籌莫展,所以花了一周時間整理出IIR濾波器設計部署的干貨文章,照此一步一步做,你必會解決大部分干擾問題。
編外語:文章寫作過程雖談不上嘔心瀝血,但也可算絞盡腦汁。在此也呼吁粉絲朋友積極參與互動,或點在看,或分享,或留言評論,當然如能買杯咖啡,那就更好啦!如果大家對此類話題感興趣,我會寫出系列信號處理文章以答謝各位的厚愛,如果大家對此類話題不感興趣,就不在花過多時間整理發布了。在此感謝各位關注厚愛!
何為IIR濾波器?
無限沖激響應(IIR:Infinite Impulse Response)是一種適用于許多線性時不變系統的屬性,這些系統的特征是具有一個沖激響應h(t),該沖激響應h(t)不會在特定點上完全變為零,而是無限期地持續。這與有限沖激響應(FIR:Finite Impulse Response)系統形成對比,在有限沖激響應(FIR)系統中,對于某個有限T,在時間t》 T時,沖激響應確實恰好變為零。線性時不變系統的常見示例是大多數電子和數字濾波器。具有此屬性的系統稱為IIR系統或IIR濾波器。對于什么叫沖激響應,這里就不展開解釋了,有興趣的可以查閱相關書籍。
這是常見的教科書式數學嚴謹定義,很多人看到這一下就蒙了,能說人話嗎?
線性時不變系統理論俗稱LTI系統理論,源自應用數學,直接在核磁共振頻譜學、地震學、電路、信號處理和控制理論等技術領域運用。它研究的是線性、非時變系統對任意輸入信號的響應。雖然這些系統的軌跡通常會隨時間變化(例如聲學波形)來測量和跟蹤,但是應用到圖像處理和場論時,LTI系統在空間維度上也有軌跡。因此,這些系統也被稱為線性非時變平移,在最一般的范圍理論給出此理論。在離散(即采樣)系統中對應的術語是線性非時變平移系統。由電阻、電容、電感組成的電路是LTI系統的一個很好的例子。比如一個運放系統在一定頻帶范圍內滿足信號的時域疊加,輸入一個100Hz和200Hz正弦信號,輸出頻率是這兩種信號的線性疊加。
用數學對LTI系統描述:
線性:輸入x1(t),產生響應 y1(t),而輸入x2(t),產生相應y2(t) , 那么放縮和加和輸入 ax1(t)+bx1(t), 產生放縮、加和的響應ay1(t)+by1(t),其中a和b是標量,對于任意的有:
而對200Hz的正弦信號,假定其放大倍數為1.7倍。(做過運放電路設計的朋友應該有經驗,在其同頻帶其放大倍數往往并不平坦,也即幅頻響應在頻帶內不平坦,這是比較常見的)。也即輸入為:
那么如果輸入100Hz和200Hz的時域疊加信號,則其輸入為:
由這些圖可看出,輸入信號的形狀保持不變,輸出為對應輸入的線性時域疊加。對于時不變,就不用圖描述了,在一個真實電路中,如果輸入延遲一定時間,則響應對應延遲相同時間輸出。
上面這么多文字只是為了描述在什么場合可以使用IIR濾波器對信號進行數字濾波。總結而言,就是在線性時不變系統中適用。換言之,在大多數電路系統中我們都可以嘗試采用IIR濾波器進行數字濾波。
那么究竟什么是IIR濾波器呢?從數字信號處理的書籍中我們能看到這樣的Z變換信號流圖:
上述數字濾波器,如果從編程的角度來看,x(n-1),表示上一次的信號,可能是來自ADC的上次采樣,而y(n-1)則為上一次濾波器的輸出值,對應就比較好理解x(n-N)就表示前第n次輸入樣本信號,而y(n-M)則為前第M次濾波器的輸出。
說了這么多,只是為了更好的理解概念,只有概念理解正確,才能使用正確。概念理解這對工程師而言,非常之重要。
如何設計呢?
MATLAB提供了非常容易使用的FDATool幫助我們設計數字濾波器,真正精彩的地方開始了,讓我們拭目以待究竟如何一步一步設計并實施一個IIR濾波器。首先打開MATLAB,在命令行中敲fdatool,然后敲回車
在設計具體,有幾個相關概念需要澄清:Fs:采樣率,單位為Hz,真實部署在系統中,請務必確保樣本是按照恒定采樣率進行采樣,否則將得不到想要的效果。Fpass: 通頻帶,單位為Hz,即系統中期望通過的最高頻率。Fstop: 截至頻率,即幅頻響應的-3dB處的頻率,這個如不理解,請自行查閱相關書籍。分貝dB: 這是一個無單位反應輸出與輸入倍數的一個術語。電學中分貝與放大倍數的轉換關系為:
A(V)(dB)=20lg(Vo/Vi);電壓增益,Vo 為輸出電壓,Vi為輸入電壓
A(I)(dB)=20lg(Io/Ii);電流增益,Io 為輸出電流,Ii為輸入電流
A(p)(dB)=10lg(Po/Pi);功率增益,Po 為輸出功率,Pi為輸入功率
濾波器類型:這里有Butterworth(巴特沃斯)、Chebyshev Type I,Chebyshev Type II、(切比雪夫)、Elipic 等可選。
巴特沃斯 Butterworth,也被稱作最大平坦濾波器。巴特沃斯濾波器的特點是通頻帶內的頻率響應曲線最大限度平坦,沒有紋波。
切比雪夫 Chebyshev,是在通帶或阻帶上頻率響應幅度等波紋波動的濾波器。切比雪夫濾波器在過渡帶比巴特沃斯濾波器的衰減快,但頻率響應的幅頻特性不如后者平坦。
橢圓 EllipTIc,橢圓濾波器是在通帶和阻帶等波紋的一種濾波器。
…這里就不一一介紹了,有興趣可以去查信號處理書籍。
就其特點,這里對其中幾種略作介紹:
巴特沃斯具有最平坦的通帶。
橢圓濾波器衰減最快,但是通帶、阻帶都有波紋。
切比雪夫濾波器衰減比巴特沃斯快,但比橢圓濾波器慢,波紋區域可選擇。
假設我們需要設計一個IIR濾波器,采樣率為32000Hz, 有用信號頻率在10000Hz內,設計IIR濾波器對信號進行數字濾波。這里為節省算力,我們指定濾波器的階數,也即傳遞函數中N/M中的最大值,一般而言N大于M。
這里指定階數為8階,類型指定為巴特沃斯型IIR濾波器,輸入階數8階,采樣率32000Hz,然后點擊Design Filter如下圖所示:
除此之外,我們還可以將幅頻與相頻曲線放在一個頻率坐標上去看設計結果:
導出濾波器參數,這里我們選擇,
然后就得到了一個文件,保存2KHz_LPF.fcf,文件名隨你喜歡。
所謂直接II型,SOS(second order section)理解很簡單,本質是將IIR Z傳遞函數分解為上述二階塊的級聯形式。
部署測試濾波器
到這里,沒有經驗的朋友可能會說,這么一堆參數我該咋用呢?
需要自己去寫前面描述的計算公式嗎?當然你也可以這么做,這里就不寫了,ARM的CMSIS庫已經幫大家設計好了種類繁多的數字信號處理函數實現了,而且經過了測試,這里直接拿來用即可。有興趣自己寫也不難,只要理解Z傳遞函數概念內涵,非常容易實現。這里我們采用32位浮點實現函數:
arm_biquad_cascade_df1_f32。該函數位于:
CMSIS\DSP\Source\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c
CMSIS\DSP\Source\FilteringFunctions\arm_biquad_cascade_df1_f32.c
我們來看一看這個函數:
arm_biquad_cascade_df1_init_f32.c:
開始測試:
(編者注:以上是上截圖不完整部分的補充:)
const float iir_coeffs[5*IIR_SECTION]={
0.035416141341387819,2*0.035416141341387819,0.035416141341387819,1.7193929141691948,-0.8610574795347461, 0.031387100113383172,2*0.031387100113383172,0.031387100113383172,1.5237898734101736,-0.64933827386370635, 0.028873109331868367,2*0.028873109331868367,0.028873109331868367,1.4017399331200424,-0.51723237044751591, 0.027673522765052503,2*0.027673522765052503,0.027673522765052503,1.3435020629061745,-0.45419615396638446
};
static arm_biquad_casd_df1_inst_f32 S;
/*假定采樣512個點*/
(補充完成,接上)
利用csv文件,將模擬數據存儲,直接用excel打開,將行數據生成曲線圖如下:
有興趣也可以寫個界面直接顯示,甚至繪制出譜線圖,做進一步分析。
第一幅圖,為800Hz信號混入隨機噪聲的波形
第二幅圖,為4000Hz信號,對假定系統為無用干擾信號
第三幅圖, 為800Hz 混入隨機噪聲過濾后,已經很好的還原有用信號頻率
第四幅圖, 為800Hz信號混入隨機噪聲,同時疊加4000Hz干擾的波形,對系統而言,從時域中,明顯可見,有用信號已經完全扭曲
第五幅圖,為800Hz信號混入隨機噪聲,同時疊加4000Hz干擾的輸入,經過該低通濾波器后的波形,與第三幅圖基本一樣,已經非常好的濾除了干擾信號。
總結:
IIR濾波器在線性時不變系統中可以很好的解決工程中一般噪聲問題
如果需要設計帶通、高通濾波器其步驟基本類似,只是濾波器的參數以及SOS塊個數可能不一樣而已
需要提醒的時,IIR的相頻響應不線性,如果系統對相頻響應有嚴格要求,就需要采用其他的數字濾波器拓撲形式了
實際應用中,如果階數不高時,現在算力強勁的單片機或者DSP以及可以直接使用浮點處理。
如果對處理速度有嚴格的實時要求,需要在極短時間進行濾波處理,可以考慮降低階數,或采用定點IIR濾波算法實現。也或者將文中函數進行匯編級優化。
歡迎大家進行留言討論。