引言
數(shù)字濾波器是數(shù)字信號系統(tǒng)里面最常用、最重要、最基本的元件之一。有限脈沖響應(Finite Impulse Response,FIR)濾波器可以設計成任意幅頻特性,同時保證精確,嚴格的線性相位特性。因此在電子通信、圖像處理、模式識別等領域,F(xiàn)IR數(shù)字濾波器被廣泛應用。本文主要通過以低通濾波器的MATLAB與FPGA的設計實現(xiàn)來介紹FIR濾波器的原理介紹,架構研究,設計實現(xiàn)等。
原理介紹
FIR濾波器的方程表達式為: y(n)=∑x(k)h(n-k) k=0,1…N-1;0≦n≦N-1; 其方程分解式為:y(n)=h(0)x(n)+h(1)x(n-1)+h(2)x(n-2)+…+h(k)x(n-k); 根據(jù)FIR濾波器的幅頻特性可知,F(xiàn)IR濾波器為奇對稱和偶對稱兩種形式。 例如當濾波器階數(shù)為偶數(shù)n=3時,根據(jù)線性相位跟對稱法則可得:h(0)=h(3),h(1)=h(2); 可得到方程式為:y(n)=h(0){x(n-1)+x(0)}+h(1){x(n-2)+x(1)}; 當濾波器階數(shù)為奇數(shù)n=4時,根據(jù)線性相位跟對稱法則可得:h(0)=h(4),h(1)=h(3),h(2)獨立一個; 可得到方程式為:y(n)=h(0){x(n-1)+x(0)}+h(1){x(n-2)+x(n-3)}+h(2)x(n-2); 故其系統(tǒng)函數(shù)為 從其系統(tǒng)函數(shù)可以看得出FIR系統(tǒng)是線性時不變系統(tǒng),只在原點上存在極點,這使得FIR系統(tǒng)具有全局穩(wěn)定性。從FIR系統(tǒng)函數(shù)也可以看得出FIR濾波器其實是由一個抽頭延遲線加法器和乘法器的集合構成的。每個乘法器的操作系數(shù)為FIR濾波器系數(shù)。因此這種抽頭延遲線結構的架構實現(xiàn)圖可如下所示:
MATLAB設計實現(xiàn)
在matlab里面設計數(shù)字濾波器既可以通過窗函數(shù)自己編寫程序來設計FIR濾波器,也可以通過調(diào)用工具箱來設計FIR濾波器。通過編寫程序來設計FIR濾波器比較普遍,濾波器的參數(shù)等改動也比較方便,與FPGA做聯(lián)合功能仿真驗證也方便。而直接調(diào)用工具箱就直接了當,較節(jié)省設計時間。本文將對兩種方法進行介紹,不過本文設計采用的是凱塞窗函數(shù)來設計FIR濾波器。
窗函數(shù)設計法
利用窗函數(shù)法來設計FIR濾波器是設計FIR濾波器最簡單,最普遍的方法,在MATLAB里面窗函數(shù)有海明(Hamming)窗,漢寧(Hanning)窗,凱塞(Kaiser)窗等,本文設計采用的是凱塞窗函數(shù)來設計FIR濾波器。通過最優(yōu)算法來計算出過渡帶,紋波等參數(shù)供給凱塞窗來計數(shù)出β值,以及濾波器的階數(shù)。 凱塞窗函數(shù)的語法形式為:[n,wn,beta,ftype]=kaiserord(fc,mag,dev,fs) 其中各參數(shù)的意義介紹如下所述: (1)fc及fs:fc是指過渡帶的起始點和終點,fs指的是采樣評率; (2)mag:f指定了過渡帶,向量a用于指定這些頻率段的理想幅度值,例如a=[1 0]可以代指低通濾波為1,高頻截止為0; (3)dev:用于指定通帶或阻帶內(nèi)的容許誤差; (4)n,wn:n是返回凱塞窗函數(shù)滿足設計的最小階數(shù),wn是返回濾波器的截止頻率點; (5)beta:為凱塞窗函數(shù)計算得到的β值。 (6)ftype:返回設計濾波器的類型,low,hige等; 通過凱塞窗函數(shù)最終可以得到濾波器的最佳設計階數(shù)n為多少,然后根據(jù)n來設計FIR濾波器,本文采用的是最優(yōu)濾波器設計法,利用firpm函數(shù)根據(jù)最大誤差最小準則來設計濾波器。 最優(yōu)濾波器firpm函數(shù)的語法形式為:b_firpm = firpm(n,fpm,magpm) 其中各參數(shù)的意義介紹如下所述: (1)n:為濾波器的設計階數(shù); (2)fpm,magpm:指定濾波器的設計頻率段對應的幅度值magpm; (3)b_firpm:返回設計濾波器的系數(shù)h(n)。 到此為止設計FIR濾波器的matlab設計實現(xiàn)如下圖所示,本文設計的是一個低通濾波器。 現(xiàn)在濾波器的系數(shù)b_firpm是可以求出來,但是注意是小數(shù),在FPGA中實現(xiàn)還是比較麻煩還占用大量資源,所以在這里還進行了量化處理,對matlab數(shù)字濾波器的b_firpm進行14bit的量化處理(我在做量化的時候做了10,12,14bit的設計,發(fā)現(xiàn)14bit的濾波器效果最好)。 運行函數(shù)會發(fā)現(xiàn)生成了28階的FIR濾波器系數(shù)如下所示,當n=27,濾波器階數(shù)為28的時候,發(fā)現(xiàn)濾波器系數(shù)為對稱相等的h(14)=h(15)=8191; 可驗證到與前面的原理介紹是一致的。這樣子后面在FPGA設計濾波器的時候可以用線性相位結構來設計。 運行函數(shù),設計的低通濾波器性能如下圖所示: 接下來生成高斯白噪聲通過MATLAB設計的低通濾波器,來驗證我們設計的低通濾波器性能如何,同時將生成的高斯白噪聲生成數(shù)據(jù)文件txt供給后面的FPGA設計的低通濾波器做modelsim的功能仿真測試。生成白噪聲的程序如下圖所示,q_noise為高斯白噪聲,filter_noise為濾波后噪聲。 將生成的高斯白噪聲生成數(shù)據(jù)文件txt供給后面的FPGA設計的低通濾波器做modelsim的功能仿真測試。 調(diào)用自己MATLAB設計的低通濾波器對高斯白噪聲進行濾波,程序設計如下圖所示: 運行程序看設計的低通濾波器的性能如何,如下圖所示,matlab設計的低通濾波器很完美的把高頻率的數(shù)據(jù)進行截止濾波掉。在低頻率的時候保持原高斯白噪聲的輸出狀態(tài)。
tool工具箱設計法
在matlab的應用程序里面有一個filter design & analysis tool點進去即為快速設計濾波器的工具。操作界面如下圖所示,較為簡單不做詳細介紹。 點analysis里面的filter coefficient即可出現(xiàn)設計濾波器的FIR濾波器系數(shù),通過file-export可以把濾波器系數(shù)導出到workplace。
FPGA設計實現(xiàn)
在前面的原理介紹中可以得知,根據(jù)階數(shù)的系數(shù)為對稱相等的,于是抽頭延遲線結構可以升級為線性相位優(yōu)化結構來設計,具體我的架構設計圖如下所示: 從上面的架構設計圖可以看得出,F(xiàn)IR的設計大概可以分為三步分,數(shù)據(jù)流的移位延遲模塊,系數(shù)和乘法器模塊,累加和模塊三大部分。 整體的端口設計介紹如下圖所示:
數(shù)據(jù)流的移位延遲模塊
data_mem為28個14位寬的寄存器,進行數(shù)據(jù)流的采集跟移位保存。其設計如下圖所示:
累加和的設計模塊
這里的數(shù)據(jù)流有符號正負,所以在運算時為了不溢出,擴展一位,并用signed聲明進行有符號的運算設計。
系數(shù)乘法器的設計模塊
乘法器的設計端口介紹如下圖所示: 乘法器的設計原理介紹如下圖所示,具體的乘法設計可參考之前的博客章文:基于FPGA的乘法器原理介紹及設計實現(xiàn),具體博文鏈接為: https://blog.csdn.net/weixin_39015789/article/details/101430566 最后再將所有的乘積和進行累加便是對數(shù)據(jù)流進行低通濾波后的結果了。
MATLAB與FPGA的連仿驗證
到現(xiàn)在為止,低通濾波器的FPGA設計實現(xiàn)也已經(jīng)完畢了,接下來就是在modelsim里面讀取matlab產(chǎn)生的高斯白噪聲數(shù)據(jù)流,供給FPGA設計的FIR濾波器進行濾波計算,看兩者的結果是否一模一樣。 FPGA的textbench設計驗證開始
讀取高斯白噪聲數(shù)據(jù)流
從外部txt文件(noise_in.txt)讀入matlab產(chǎn)生的高斯白噪聲數(shù)據(jù)流作為測試激勵輸入數(shù)據(jù)流。具體的設計如下所示:
將FPGA濾波后的數(shù)據(jù)流讀取到文件
將FPGA濾波后的數(shù)據(jù)流保存讀取到文件,然后提供給matlab進行傅里葉變換,看FPGA設計的低通濾波器性能是如何的。
MATLAB與FPGA的連仿
讀取FPGA濾波后的數(shù)據(jù),進行傅里葉變換,求高斯白噪聲及濾波后信號的幅頻響應,對比濾波前后的信號,查看濾波器的性能如何。 通過MATLAB將FPGA的濾波數(shù)據(jù)進行傅里葉變換的頻譜濾波效果圖如下所示,可以看到FPGA設計的低通濾波器在低頻域的時候完美將高斯白噪聲進行輸出,在高頻率的時候,對高斯白噪聲進行濾波處理。效果性能與前面MATLAB設計的濾波器效果性能很是一致,濾波器的效果性能都很好。
|