基于FPGA的IIR數(shù)字濾波器的快捷設(shè)計(jì)
0 引言
本文引用地址:http://butianyuan.cn/article/189710.htmIIR數(shù)字濾波器在很多領(lǐng)域中都有著廣闊的應(yīng)用。與FIR數(shù)字濾波器相比,IIR數(shù)字濾波器可以用較低的階數(shù)獲得較高的選擇性,而且所用存儲(chǔ)單元少,經(jīng)濟(jì)效率高。一個(gè)N階IIR數(shù)字濾波器的系統(tǒng)函數(shù)為:
其線性常系數(shù)差分方程為:
用FPGA實(shí)現(xiàn)濾波的基本思想就是基于式(2)來(lái)實(shí)現(xiàn)的。如果知道了系統(tǒng)的輸入序列(濾波器的輸入),那么,只要根據(jù)所給的濾波器的指標(biāo),然后通過(guò)MATLAB仿真出系數(shù)矢量b和a,再采用遞推算法求解差分方程,就能求出輸出序列(濾波器的輸出)。
1 濾波器的MATLAB設(shè)計(jì)
由于本文采用巴特沃斯濾波器,故需要在工具箱中調(diào)用的兩個(gè)函數(shù)buttord和butter的調(diào)用格式為:
其中N為濾波器階數(shù);wp和ws分別為通帶截止頻率矢量和阻帶截止頻率矢量,單位為π,一般需要模擬頻率指標(biāo)對(duì)采樣頻率的一半作歸一化;Rp和As分別為通帶最大衰減和阻帶最小衰減,單位dB;wc為3 dB邊緣頻率矢量;b和a即為方程(2)中的系數(shù)矢量。
獲得系數(shù)6和a之后,調(diào)用函數(shù)freqz(b,a,k,F(xiàn)s)即可按照下式計(jì)算k點(diǎn)的復(fù)頻率響應(yīng)矢量H:
然后便可繪出K點(diǎn)的幅頻和相頻特性曲線,以用于檢查計(jì)算出的系數(shù)是否滿(mǎn)足所需要的濾波器指標(biāo)。
2 編寫(xiě)VHDL語(yǔ)言代碼注意事項(xiàng)
乘加運(yùn)算過(guò)程中的數(shù)據(jù)是有符號(hào)的二進(jìn)制補(bǔ)碼,通常在Xilinx ISE集成開(kāi)發(fā)環(huán)境下建立的VHDL源文件頭部都會(huì)有“use IEEE.STD_LOG-IC_UNSIGNED_ALL;”,如將其改為“use IEEE.STD_LOGIC_SIGNED.ALL;”即應(yīng)該包含有符號(hào)數(shù)運(yùn)算程序包,這樣就能保證代碼中的所有std_log-ic_vector型數(shù)據(jù)按照有符號(hào)二進(jìn)制補(bǔ)碼的規(guī)則進(jìn)行運(yùn)算。
由于FPGA內(nèi)部不能表示浮點(diǎn)數(shù),因此只能用有限精度方法來(lái)實(shí)現(xiàn)數(shù)據(jù)的運(yùn)算,即用數(shù)據(jù)(包括方程(2)的輸入輸出和系數(shù))的整數(shù)部分(截去小數(shù)部分)作近似運(yùn)算,且需要std_log-ic_vector數(shù)據(jù)類(lèi)型來(lái)表示數(shù)據(jù)整數(shù)部分的二進(jìn)制補(bǔ)碼形式,但這樣會(huì)產(chǎn)生截?cái)嗾`差。為了減小截?cái)嗾`差,應(yīng)該將數(shù)據(jù)擴(kuò)大適當(dāng)?shù)谋稊?shù)(通常是2L倍,L為正整數(shù)),以使小數(shù)部分可以忽略不計(jì)。擴(kuò)大的倍數(shù)越大,截?cái)嗾`差就越小,得到的數(shù)據(jù)就越精確,但是,用來(lái)表示數(shù)據(jù)整數(shù)部分的std_logic_vector型數(shù)據(jù)長(zhǎng)度會(huì)越大,這樣就會(huì)占用越多的FPGA內(nèi)部資源,因此,適當(dāng)?shù)倪x擇數(shù)據(jù)擴(kuò)大倍數(shù)是個(gè)關(guān)鍵。此外,各種數(shù)據(jù)轉(zhuǎn)換為std_logic_vector型數(shù)據(jù)的長(zhǎng)度選取至少應(yīng)足以表示二進(jìn)制補(bǔ)碼(包括符號(hào)位)。若FPGA內(nèi)部資源充足,可以通過(guò)增加std_logic_vector型數(shù)據(jù)長(zhǎng)度來(lái)減小截?cái)嗾`差,提高運(yùn)算精度。
通常由MATLAB仿真得到的系數(shù)b都遠(yuǎn)小于1,因此要適當(dāng)選擇正整數(shù)L。運(yùn)算時(shí)可給系數(shù)b和a(a的第一個(gè)系數(shù)除外)同乘以2L,之后取整得到B=round(b*2L)和A=round(a*2L)
當(dāng)前時(shí)刻輸入的x(n)有時(shí)可能太小,為減小截?cái)嗾`差,應(yīng)該選擇適當(dāng)?shù)恼麛?shù)M,以給x(n)乘以2M,即給表示當(dāng)前時(shí)刻輸入的std_logic_vec-tor變量后補(bǔ)上M個(gè)‘0’。這樣,得到的當(dāng)前時(shí)刻輸出y (n)就是擴(kuò)大了2L+M倍的數(shù)據(jù),應(yīng)該除以2L+M才是當(dāng)前時(shí)刻的真實(shí)輸出。而VHDL語(yǔ)言不支持除法運(yùn)算,故應(yīng)采用截去末尾(L+M)位的方法來(lái)近似除法運(yùn)算,這種做法相當(dāng)于原始輸出y除以2L+M之后截去小數(shù)部分。
在用示波器觀測(cè)時(shí),濾波器的輸出波形可能帶有許多大幅度尖銳毛刺,從而嚴(yán)重影響了濾波器的性能。毛刺是由于組合電路的競(jìng)爭(zhēng)而使電路輸出發(fā)生瞬時(shí)錯(cuò)誤的現(xiàn)象,通常消除毛刺的方法是在具體的電路中加個(gè)鎖存器。本文采取另一優(yōu)化方法,即在源代碼中通過(guò)符號(hào)“=”把輸出信號(hào)賦給一個(gè)中間信號(hào),再把中間信號(hào)作為輸出,這相當(dāng)于將信號(hào)作一個(gè)延時(shí)再輸出。這種方法不需要知道具體的電路結(jié)構(gòu),也元需編寫(xiě)其它代碼模塊,因此優(yōu)化更為簡(jiǎn)便快捷,而且優(yōu)化效果非常好。
3 濾波器MATLAB設(shè)計(jì)的FPGA實(shí)現(xiàn)
下面以一個(gè)簡(jiǎn)單的低通濾波器設(shè)計(jì)實(shí)例來(lái)說(shuō)明從MATLAB設(shè)計(jì)到FPGA實(shí)現(xiàn)的整個(gè)過(guò)程。該低通濾波器的系統(tǒng)采樣頻率為40 MHz,通帶截止頻率為1 MHz,阻帶截止頻率為5 MHz,通帶內(nèi)最大衰減為3 dB,阻帶內(nèi)最小衰減為40 dB,而對(duì)相位不作要求。
低通濾波器相關(guān)文章:低通濾波器原理
電源濾波器相關(guān)文章:電源濾波器原理
評(píng)論