基于Matlab和FPGA的FIR數字濾波器設計及實現
摘要:基于FIR數字濾波器的原理和層次化、模塊化設計思想,結合Altera公司的CycloneII系列FPGA芯片,提出了FIR數字濾波器的實現硬件方案,給出了采用Matlab、QuartusⅡ設計及實現32階低通FIR濾波器的方法步驟,仿真及實際測試結果驗證了設計方案的正確性,與傳統的數字濾波器相比,本文設計的FIR數字濾波器具有更好的實時性、靈活性和實用性。
關鍵詞:FIR數字濾波器;FPGA;Verilog HDL;Matlab
1 引 言
FIR數字濾波器以其良好的線性特性被廣泛應用于現代電子通信系統中,是數字信號處理的重要內容之一。在實際信號處理中,往往要求系統兼具實時性和靈活性,而已有的一些軟件或硬件實現方案(如DSP)則難以同時達到這兩方面的要求。使用具有并行處理特性的FPGA來實現FIR濾波器,既有很強的實時性,又兼顧了靈活性,為數字信號處理提供了一種很好的解決方案。FIR濾波器系數計算較為繁瑣,在設計時借助Matlab工具箱,選擇合適的窗函數,可以方便地計算濾波器系數,并分析其幅頻、相頻特性。
本文在用FPGA設計FIR濾波器時,采用了層次化、模塊化的設計思想,將整個濾波器劃分為若干功能模塊,運用Verilog HDL語言和原理圖兩種設計輸入方式,各個模塊先獨立設計,驗證無誤后再互聯綜合,完成了FIR數字濾波器的系統設計及仿真測試。
2 FIR濾波器基本原理及結構
FIR數字濾波器的沖擊響應h(n)為實序列時,頻率響應:
若要求線性相位,則需:
因而h(n)如果滿足對稱或反對稱的條件,就具有線性相位特性,即:
數字濾波器結構有很多種,偶對稱FIR濾波器的直接型結構如圖1所示。
其中x(n),y(n)分別為輸入輸出時間序列。容易得到32階偶對稱FIR濾波器的輸入輸出關系,如式(4)所示:
根據以上分析,可以把對稱結構的FIR數字濾波器分成“移位相加單元、乘法器、輸出相加及截位輸出”四塊,如圖2所示。
對于長度為2M的濾波器,其運算次數只有M量級,減少了乘法次數,也提高了運算速度。在用FPGA實現時可以節(jié)約不少資源。
3 用Matlab設計FIR數宇濾波器
具有對稱結構的直接型FIR濾波器結構如圖1所示,用加窗的設計方法,經比較后窗函數選用海明窗。根據實際指標要求在Matlab的“Filter Design”工具里設置各參數,然后算得系數h(n),如圖3所示,得到的系數是用十進制表示的,需要將其轉換成系統要求精度(如18位)的定點二進制小數。把所有系數乘以218后再四舍五入即可,最終數據如表1所示。
4 濾波器的FPGA實現及仿真測試
按照圖l、圖2和濾波器系數表1,用Verilog HDL分別實現濾波器的各個模塊,仿真無誤后生成單元模塊圖,然后在QuartusⅡ里調用該模塊,互聯后綜合得到系統電路圖,各功能模塊的設計方法如下。
4.1 移位及首尾相加單元
把輸入數據存儲到移位寄存器,利用FIR濾波器的對稱性,把移位后的數據首尾相加即可。加法器輸出端要加個寄存器模塊,以去除毛刺。另外為防止相加后數據溢出,要把數據位數擴寬到14+1位。其中D_in[13..O]是二進制補碼輸入,D out XX[14..O]是移位相加后數據輸出。Vexrilog HDL程序關鍵語句為:
移位相加單元模塊圖如圖4所示。
[!--empirenews.page--]
移位相加單元時序仿真:仿真結果如圖5所示,輸入一個階躍信號(8191),從圖5中可以看出,輸出數據從D_out_a到D_out_p依次有一個時鐘周期的時延,并且總的時延和濾波器階數(32)相等,最后輸出數據是16 382=8 191*2,和理論計算值相同。
4.2 與濾波器系數相乘
數據首尾相加輸出后與濾波器系數h(n)相乘,由于FIR濾波器的結構是對稱的,因而只需16個乘法器即可。乘法器直接調用QuartusⅡ里面的參數化元件庫,系數的位寬設為18。關鍵Verilog語句如下:
以上為一個乘法器設置方法,16個乘法器的整體模塊圖如圖6所示。
為了便于仿真測試,乘法器單元一開始只設置了4個輸入。其中h(0)=100,h(1)=200,h(2)=300,h(3)=400,a,b,c,d為4個輸入數據,與h(n)相乘后對應輸出分別為R_a,R_b,R_c和R_d。這樣設計不失一般性,仿真無誤后再擴充到16個即可。仿真結果如圖7所示。
4.3 乘法器輸出結果相加
16路數據相加后位數被擴為33+4=37,另外要在其輸出端加一寄存器,以消除毛刺。此模塊原理圖如圖8所示。
相加輸出模塊仿真:實際用到的是16輸入的加法器,為便于仿真測試.輸入先設為4路,仿真結果如圖9所示。
4.4 截位輸出[!--empirenews.page--]
截位是濾波器設計的關鍵,此處的處理方法是:14位的輸入數據(14 b的ADC),18位二進制補碼表示的濾波器系數,除去符號位,相乘后小數位是13+17=30,加法運算不改變小數位數。另外系統測試電路板用的是USB總線,USB控制器的數據位寬是16,因而把輸出數據截到16位,然后送給FIFO,從而傳到計算機。截位用VerilogHDL實現的語句是:
assign FIR_out={D_temp[36],D_temp[29:15]};
此模塊的原理圖如圖10所示,其中FIR_out[15..O]是濾波器的最終輸出。
在QuarltusⅡ7.0里調用仿真無誤的模塊,組成整個系統,最后仿真無誤后進行系統的實際數據測試。
5 實際測試
測試電路是一基于FPGA和USB的數據采集及處理系統。其原理框圖如圖1l所示。
測試時把一被干擾的模擬信號輸入ADC,采樣得到的數據經過FPGA和USB傳輸到計算機上,然后用Mat—lab顯示出其時域和頻域圖形。
5.1 未濾波時信號波形
輸入信號頻率是3 kHz,含頻率為34 kHz的干擾信號(用兩個信號源合成),下載的FPGA控制程序不含數字濾波器模塊,采樣得到的數據經USB傳到計算機,然后用Matlab顯示出的波形如圖12所示,可以看出干擾信號的相對功率約為一20 dB。
5. 2 濾波后信號波形
把濾波器程序下載到FPGA,輸入信號不變。濾波后波形如圖13所示。
前后對比可以發(fā)現,濾波后信號明顯變好,34 kHz的干擾被抑制到約一55 dB,驗證了設計的正確性。
6 結 語
本文給出了用CycloneⅡ系列FPGA實現FIR低通濾波器的設計實例。然后將濾波前后的AD實際采樣數據用Madab顯示出來并做比較,測試結果證明所設計的FIR數字濾波器功能正確,性能良好。并且該數字濾波器有很高的靈活性,濾波器系數在一個表格內,修改其參數即可分別實現低通、高通、帶通等類型。文中所討論的設計方法和實現技術對數字信號處理系統的設計與實現具有重要的實用價值。