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