一般濾波器可以分為經(jīng)典濾波器和數(shù)字濾波器。
在連續(xù)系統(tǒng)中采用拉普拉斯變換求解微分方程,并直接定義了傳遞函數(shù),成為研究系統(tǒng)的基本工具。在采樣系統(tǒng)中,連續(xù)變量變成了離散量,將Laplace變換用于離散量中,就得到了Z變換。和拉氏變換一樣,Z變換可用來求解差分方程,定義Z傳遞函數(shù)成為分析研究采樣系統(tǒng)的基本工具。 對(duì)于一般常用的信號(hào)序列,可以直接查表找出其Z變換。相應(yīng)地,也可由信號(hào)序列的Z變換查出原信號(hào)序列,從而使求取信號(hào)序列的Z變換較為簡便易行。 Z變換有許多重要的性質(zhì)和定理:
設(shè)a,a1,a2為任意常數(shù),連續(xù)時(shí)間函數(shù)f(t),f1(t),f2(t)的Z變換分別為F(z),F(xiàn)1(z),F(xiàn)2(z),則有
設(shè)連續(xù)時(shí)間函數(shù)在t<0時(shí),f(t)=0,且f(t)的Z變換為F(z),則有 應(yīng)用Z變換求解差分方程的一個(gè)例子:已知系統(tǒng)的差分方程表達(dá)式為$y(n)-0.9y(n-1)=0.05u(n)$,若邊界條件$y(-1)=1$,求系統(tǒng)的完全響應(yīng)。 解:方程兩端取z變換 可得 其中A1=0.5,A2=0.45,于是$y(n)=0.5+0.45 \times(0.9)^n \quad(n\geq0)$
IIR數(shù)字濾波器是一類遞歸型的線性時(shí)不變因果系統(tǒng),其差分方程可以寫為: 進(jìn)行Z變換,可得: 于是得到IIR數(shù)字濾波器的系統(tǒng)函數(shù): 其中ci為零點(diǎn)而di為極點(diǎn)。H(z)的設(shè)計(jì)就是要確定系數(shù)、或者零極點(diǎn),以使濾波器滿足給定的性能指標(biāo)。
數(shù)字濾波器的功能本質(zhì)上是將一組輸入數(shù)字序列通過一定的運(yùn)算后轉(zhuǎn)變?yōu)榱硪唤M輸出數(shù)字序列。濾波器系統(tǒng)函數(shù)可以表達(dá)為多種不同的形式,每一種對(duì)應(yīng)著不同的算法,也就對(duì)應(yīng)著不同的實(shí)現(xiàn)結(jié)構(gòu)。例如: 可以分解為: 或 上述同一系統(tǒng)的三種不同描述形式就對(duì)應(yīng)了不同的實(shí)現(xiàn)結(jié)構(gòu),或者說不同的濾波器結(jié)構(gòu)可以實(shí)現(xiàn)相同的傳遞函數(shù)。IIR濾波器常見的結(jié)構(gòu)形式有直接Ⅰ型、直接Ⅱ型(典范型)、級(jí)聯(lián)型、并聯(lián)型。通過差分方程能夠畫出包含反饋結(jié)構(gòu)的數(shù)字網(wǎng)絡(luò)稱為直接型。 直接Ⅰ型濾波器的網(wǎng)絡(luò)結(jié)構(gòu)可以根據(jù)差分方程很直觀地畫出(The Direct-Form I structure implements the feed-forward terms first followed by the feedback terms): 可以看出直接Ⅰ型濾波器需要N+M個(gè)延時(shí)單元(N≥M)。直接Ⅱ型結(jié)構(gòu)是對(duì)直接Ⅰ型的變型,將上面網(wǎng)絡(luò)的零點(diǎn)與極點(diǎn)的級(jí)聯(lián)次序互換,并將延時(shí)單元合并。實(shí)現(xiàn)N階濾波器只需要N個(gè)延時(shí)單元(The Direct-Form II structure uses fewer delay blocks than Direct-Form I),故稱為典范型。 直接Ⅱ型看上去不那么直觀,可以通過下圖進(jìn)行理解。我們可以將整個(gè)濾波器系統(tǒng)看成A、B兩個(gè)子系統(tǒng)串聯(lián)而成,由于為線性系統(tǒng)因此交換順序不影響最終輸出結(jié)果,傳遞函數(shù)可寫為: 直接型優(yōu)點(diǎn):直接型結(jié)構(gòu)簡單,用的延遲器較少(N和M中較大者的個(gè)數(shù));缺點(diǎn):系數(shù)ak,bk對(duì)濾波器性能的控制關(guān)系不直接,因此調(diào)整不方便;具體實(shí)現(xiàn)濾波器時(shí)ak,bk的量化誤差將使濾波器的頻率響應(yīng)產(chǎn)生很大的改變,甚至影響系統(tǒng)的穩(wěn)定性。直接型結(jié)構(gòu)一般用于實(shí)現(xiàn)低階系統(tǒng)。
級(jí)聯(lián)型:將系統(tǒng)傳遞函數(shù)H(z)因式分解為多個(gè)二階子系統(tǒng),系統(tǒng)函數(shù)就可以表示為這些二階子系統(tǒng)傳遞函數(shù)的乘積。實(shí)現(xiàn)時(shí)將每個(gè)二階子系統(tǒng)用直接型實(shí)現(xiàn),整個(gè)系統(tǒng)函數(shù)用二階環(huán)節(jié)的級(jí)聯(lián)實(shí)現(xiàn)。
并聯(lián)型:與級(jí)聯(lián)型類似,用部分分式展開法將系統(tǒng)函數(shù)表示為二階子系統(tǒng)傳遞函數(shù)的和。每個(gè)二階子系統(tǒng)仍然用直接型實(shí)現(xiàn),整個(gè)系統(tǒng)函數(shù)用二階環(huán)節(jié)的并聯(lián)實(shí)現(xiàn)。
在IIR濾波器設(shè)計(jì)過程中,通常利用模擬濾波器來設(shè)計(jì)數(shù)字濾波器,要先根據(jù)濾波器的性能指標(biāo)設(shè)計(jì)出相應(yīng)的模擬濾波器的系統(tǒng)函數(shù)H(s),然后由H(s)經(jīng)變換得到所需要的數(shù)字濾波器的系統(tǒng)函數(shù)H(z)。常用的變換方法有沖激響應(yīng)不變法和雙線性變換法。下面使用MATLAB等工具直接生成數(shù)字濾波器系數(shù):
在MATLAB命令行中輸入fdatool打開濾波器設(shè)計(jì)工具箱,為了便于分析,我們先從設(shè)計(jì)一個(gè)簡單的2階低通濾波器。Design Method用于選擇IIR濾波器還是FIR濾波器,這里我們選擇IIR濾波器,類型選擇Butterworth,當(dāng)然也可以選擇其他類型,不同類型的頻率響應(yīng)不同,選擇后默認(rèn)的濾波器結(jié)構(gòu)是直接II型。ResponseType用于選擇低通、高通、帶通、帶阻等類型,選擇低通濾波“Lowpass”。Frequency Specifications用于設(shè)置采樣頻率以及截止頻率,這里填入200以及20,即采樣率為200Hz,20Hz以上的頻率將被濾除掉。Fiter Order 選擇濾波器階數(shù),為了簡單起見,先選擇一個(gè)2階濾波器做實(shí)驗(yàn)。
參數(shù)設(shè)置好后點(diǎn)擊Design filter按鈕,將按要求設(shè)計(jì)濾波器。默認(rèn)生成的IIR濾波器類型是Direct-Form II,Second-Order Sections(直接Ⅱ型,每個(gè)Section是一個(gè)二階濾波器),在工具欄上點(diǎn)擊Filter Coefficients圖標(biāo)或菜單欄上選擇Analysis→Filter Coefficients可以查看生成的濾波器系數(shù)。
MATLAB中二階濾波器差分方程公式如下(注意反饋項(xiàng)符號(hào)為負(fù)號(hào)): 高階IIR濾波器的實(shí)現(xiàn)是采用二階濾波器級(jí)聯(lián)的方式來實(shí)現(xiàn)的。默認(rèn)情況下,F(xiàn)ilter Coefficients把結(jié)果分成多個(gè)2階Section顯示,其中還有增益。增益的目的是為了保證計(jì)算的精度和系統(tǒng)的穩(wěn)定性。選擇[edit]→[Convert to Single Section],這時(shí)候系數(shù)變成我們熟悉的形式:
按照上面的公式,濾波器差分方程為:y[n] = 0.06745527*x[n] + 0.134910547*x[n-1] + 0.06745527*x[n-2] - (-1.1429805025)*y[n-1] - (0.412801596)*y[n-2] 濾波器設(shè)計(jì)完成后還可以生成Simulink模型進(jìn)行仿真:按照下圖中數(shù)字標(biāo)號(hào)進(jìn)行,第一步點(diǎn)擊左邊Realize Model圖標(biāo),第二步勾選“Build model using basic elements”這一項(xiàng),右邊四個(gè)灰色的項(xiàng)將自動(dòng)打鉤,最后點(diǎn)擊“Realize Model”,matlab將自動(dòng)生成濾波器模型,在彈出的窗口中雙擊模型可以觀察該模型的內(nèi)部結(jié)構(gòu)。
下面是按照設(shè)計(jì)要求生成的2階濾波器直接Ⅰ型的結(jié)構(gòu): Direct-Form I 下面是直接Ⅱ型的內(nèi)部結(jié)構(gòu): Direct-Form II 使用生成的濾波器搭建一個(gè)簡答的測試模型:將兩個(gè)幅值為1,頻率分別為10Hz、50Hz的正弦波疊加,輸入濾波器后觀察濾波前后的波形。仿真時(shí)間設(shè)為1s,仿真參數(shù)中求解器類型設(shè)為固定步長,求解器選擇discrete(它適用于離散無連續(xù)狀態(tài)的系統(tǒng)),步長設(shè)為0.005s(200Hz)
點(diǎn)擊Run按鈕開始進(jìn)行仿真: 打開示波器結(jié)果如下圖所示:上面一欄是不同頻率疊加的波形,下面是10Hz正弦波和濾波后得到的波形的對(duì)比。由于50Hz正弦波頻率高于濾波器截止頻率20Hz,因此被濾除,同時(shí)濾波也產(chǎn)生了一定的滯后和失真。
知道了差分方程的形式并通過MATLAB得到濾波器系數(shù)后很容易寫出相應(yīng)的代碼來實(shí)現(xiàn)數(shù)字濾波,另外還有一個(gè)網(wǎng)站能根據(jù)設(shè)計(jì)指標(biāo)直接生成C代碼:http://www-users.cs./~fisher/mkfilter/ 根據(jù)前面的設(shè)計(jì)指標(biāo),在網(wǎng)頁上填入相應(yīng)參數(shù)后提交,會(huì)得到下面的C語言代碼。簡單修改后就可以使用: #define NZEROS 2 #define NPOLES 2 #define GAIN 1.482463775e+01 static float xv[NZEROS+1], yv[NPOLES+1]; static void filterloop() {
在LabVIEW中為了自己實(shí)現(xiàn)IIR濾波器可以使用反饋結(jié)點(diǎn)來存儲(chǔ)數(shù)據(jù),下面的程序框圖實(shí)現(xiàn)了與MATLAB模型相同的功能: 前面板波形圖如下圖所示: 參考: Butterworth / Bessel / Chebyshev Filters ARM官方DSP庫IIR濾波器的實(shí)現(xiàn)(STM32) 手把手教你用matlab生成STM32官方IIR濾波器的系數(shù)(二) 手把手教你用matlab生成STM32官方IIR濾波器的系數(shù)(三) A Collection of Useful C++ Classes for Digital Signal Processing |
|