1 項目背景 (源碼下載,至簡設(shè)計法輔導(dǎo)交流群:544453837)1.1 FIR和IIR濾波器 FIR(Finite Impulse Response)Filter:有限沖激響應(yīng)濾波器,又稱為非遞歸線性濾波器。 FIR濾波器,顧名思義,其脈沖響應(yīng)由有限個采樣值構(gòu)成。長度(抽頭數(shù))為N、階數(shù)為N−1的FIR系統(tǒng)的轉(zhuǎn)移函數(shù)、差分方程和單位沖激響應(yīng)分別如下列三式所示。 IIR(Infinite Impulse Response)Filter:無限沖激響應(yīng)濾波器,又稱為遞歸線性濾波器。 FIR相對與IIR來說,具有如下的優(yōu)點: Ø 可以具備線性相位特性 線性相位的概念:如果濾波器的N個實值系數(shù)為對稱或者反對稱結(jié)構(gòu),該濾波器具有線性相位。 W(n)=±W(N−1−n)W(n)=±W(N−1−n) 線性相位的特性:通過線性相位濾波器的信號的所有頻率部分具有相同的延遲量。 Ø 易于設(shè)計 但FIR也有自身的缺點:同樣指標的濾波器,F(xiàn)IR需要更多的參數(shù),即實現(xiàn)時消耗更多的計算單元,產(chǎn)生更大的延遲。 1.2 FIR濾波器的原理 信號通過一個FIR濾波器其實就是信號與FIR濾波器的系數(shù)進行卷積(即乘累加)的過程。我們以一個簡單信號模型為例,了解一下FIR波形器的原理。 現(xiàn)在有三組信號,分別是: 信號1:低頻信號,即在時域上變化慢的信號,其輸入先后為1 1 1 1 2 2 2 2。 信號2:直流信號,其輸入先后為1 1 1 1 1 1 1 。 信號3:高頻信號,即在時域上變化快的信號,其輸入先后為1 2 1 2 1 2 1 2 。 簡單的濾波器模型 低通濾波器:1 1 信號1與低通濾波器進行卷積運算,其結(jié)果再除以2,得到如下數(shù)據(jù):1 1 1 1.5 2 2 2?梢钥吹,低頻信號經(jīng)過低通濾波器后,各個點仍然保持了其形狀,而且在1變成2時,還變平緩了。 信號2與低通濾波器進行卷積運算,其結(jié)果再除以2,得到如下數(shù)據(jù):1 1 1 1 1 1 1?梢钥吹,直流信號與輸入的信號完成相同。 信號3與低通濾波器進行卷積運算,其結(jié)果再除以2,得到如下數(shù)據(jù):1.5 1.5 1.5 1.51.5 1.5 1.5?梢钥吹剑哳l信號經(jīng)過低通濾波器后,已經(jīng)完成消去了形狀,變成了直流信號。 再考慮另一種濾波器模型,高通濾波器:1 -1 信號1與高通濾波器進行卷積運算,其結(jié)果再除以2,得到如下數(shù)據(jù):0 0 0 -0.5 0 0 0?梢钥吹剑皖l信號經(jīng)過高通濾波器后,信號變化基本上消失。 信號2與低通濾波器進行卷積運算,其結(jié)果再除以2,得到如下數(shù)據(jù):0 0 0 0 0 0 0?梢钥吹,直流信號仍然是沒有變化。 信號3與低通濾波器進行卷積運算,其結(jié)果再除以2,得到如下數(shù)據(jù):-0.5 0.5 -0.5 0.5-0.5 0.5 -0.5 0.5?梢钥吹,高頻信號已經(jīng)仍然保持了變化的形狀。 由這兩個例子可以看出,F(xiàn)IR濾波器其實就是信號與FIR濾波器的系數(shù)進行卷積(即乘累加)的過程。通過調(diào)整濾波器系數(shù)、抽頭個數(shù),就可實現(xiàn)低通、高通、帶通等濾波器。 1.3 FIR濾波器的設(shè)計1.3.1 matlab產(chǎn)生濾波器系數(shù) 打開matlab在其命令窗口輸入fdatool 按下回車 調(diào)出FIR濾波器的設(shè)計界面。 在波形設(shè)計界面中,我們重要關(guān)注以下選項。 Response Type:選擇可以選擇濾波器的類型,可選擇:lowpass低通濾波器、Highpass高通濾波器、bandpass帶通濾波器、bandstop帶阻濾波器。 Fs(采樣頻率): Fstop :信號截止頻率 Fpass: Filter Order:用來設(shè)置濾波器的抽頭個數(shù)?梢栽趕pecify order中輸入個數(shù),也可以選擇Minimumorder,讓系統(tǒng)計算滿足要求的前提下的最小抽頭個數(shù)。 點擊Design Filter,就可以計算出抽頭系數(shù)。 產(chǎn)生系數(shù)后點擊file 菜單里的Export 將系數(shù)保存到工作區(qū) 點擊export 點擊之后打開工作區(qū)里的Num。 而后將下圖第一列的數(shù)據(jù)復(fù)制粘貼到txt文件中。 注意復(fù)制后需在兩個系數(shù)間插入逗號(英文輸入狀態(tài)下的的逗號)。 這樣就得到濾波器的系數(shù)了。 1.3.2FPGA生成FIR IP核 打開工程后,在IP catalog這一界面中選擇DSP下一目錄中選擇Filter 在選擇選擇 FIR II 首先在Fitter這一界面做如下操作 Filter Type Interpolation Factor: Decimation Factor: Max Number of channels: Clock rate:填寫本IP核的工作時鐘頻率。 clock slack: Input sample rate (msps):采樣率 點擊coefficients,進入coefficients界面。 這一界面點擊import from file ,彈出一下界面,找出我們之前用matlab生成的系數(shù)文件,點擊import,導(dǎo)入成功后可以看到下圖的 frequency response界面的波形發(fā)生變化 在coefficient界面,還可以設(shè)置系數(shù)的格式、數(shù)據(jù)位寬等。 其它選項不改按默認的來點擊finish即可。 以上就是生成 FIR濾波器的主要步驟。 2 設(shè)計目標 本次案例將使用到采樣率大于100M的雙通道的示波器。將示波器的兩個通道,分別與FPGA的DA通道1和DA通道2相連,觀察兩路DA的輸出。其連接示意如下圖所示。 本案例是FPGA內(nèi)部產(chǎn)生正弦信號,這個正弦信號一路輸出給DA通道1,另一路經(jīng)過FIR濾波器后,輸出給DA通道2。 正弦信號的頻率受開發(fā)板上的3個撥碼開關(guān)控制,用3位信號key表示,一共可以產(chǎn)生8種頻率。 正弦信號的頻率 約等于: 100KHz * (key+1)。 例如,當key等于0時,產(chǎn)生約100KHz的正弦信號; 當key等于1時,產(chǎn)生約200KHz的正弦波; 當key等于7時,產(chǎn)生約800KHz的正弦波。 FIR濾波器是低通濾波器,其截止頻率是500KHz,這樣原則上超過500KHz的信號就會被濾除。濾波器的輸出給通道2。 下面是示波器的顯示效果,其中黃色是通道1輸出的信號(上面的波形),下面藍色是通道2的輸出信號(下面的波形)。 下圖是100KHz的信號圖。 下圖是200KHz的信號圖。 下圖是300KHz的信號圖。 下圖是400KHz的信號圖,可以看到已經(jīng)衰減了。 下圖是500KHz的信號圖,可以看到已經(jīng)衰減的很小了。 下圖是600KHz的信號圖,可以看到通道2已經(jīng)沒有波形。 下圖是700KHz的信號圖,可以看到通道2已經(jīng)沒有波形。下圖是800KHz的信號圖,可以看到通道2已經(jīng)沒有波形。 下圖是800KHz的信號圖,可以看到通道2已經(jīng)沒有波形。 3 設(shè)計實現(xiàn)3.1 頂層接口 新建目錄:D:\mdy_book\fir_prj。在該目錄中,新建一個名為fir_prj.v的文件,并用GVIM打開,開始編寫代碼。 我們要實現(xiàn)的功能,概括起來就是FPGA產(chǎn)生控制AD9709,讓其中的通道A未濾波的正弦信號,讓通道B輸出濾波后的正弦信號。為了控制AD9709的工作模式,就要控制AD9709的MODE、SLEEP管腳;為了控制通道A,就需要控制AD9729的CLK1、WRT1、DB7~0P1管腳;為了控制通道B,就需要控制AD9729的CLK2、WRT2、DB7~0P2管腳。根據(jù)設(shè)計目標的要求,整個工程需要以下信號: 1. 使用clk連接到晶振,表示50M時鐘的輸入。 2. 使用rst_n連接到按鍵,表示復(fù)位信號。 3. 使用3位信號key,表示三位撥碼開關(guān)。 4. 使用dac_mode信號連接到AD9709的MODE管腳,用來控制其工作模式。 5. 使用dac_sleep信號連接到AD9709的SLEEP管腳,用來控制其睡眠模式。 6. 使用dac_clka信號連接到AD9709的CLK1管腳,用來控制通道A的時鐘。 7. 使用dac_wra信號連接到AD9709的WRT1管腳,用來控制通道A的寫使能。 8. 使用8位信號dac_da連接到AD9709的DB7~0P1管腳,用來控制通道A的寫數(shù)據(jù)。 9. 使用dac_clkb號連接到AD9709的CLK2腳,用來控制通道B時鐘。 10. 使用dac_wrb號連接到AD9709的WRT2腳,用來控制通道B使能。 11. 使用8位信號dac_db接到AD9709的DB7~0P2腳,用來控制通道B寫數(shù)據(jù)。 綜上所述,我們這個工程需要11個信號,時鐘clk,復(fù)位rst_n,撥碼開關(guān)的輸入key,dac_mode、dac_sleep、dac_clka、dac_wra、dac_da、dac_clkb、dac_wrb和dac_db信號,其中dac_da和dac_db是8位信號,其他都是1位信號。下面表格表示了硬件電路圖的連接關(guān)系。 將module的名稱定義為fir_prj,代碼如下: 其中clk、rst_n是1位的輸入信號,dac_da和dac_db是8位的輸出信號,key是3位輸入信號,dac_mode,dac_clka,dac_wra,dac_sleep,dac_clkb,dac_wrb是一位輸出信號。 3.2 正弦信號設(shè)計 假設(shè)產(chǎn)生的正弦信號命名為sin_data信號。sin_data是從表XX中選擇出來的值,該表一共有128個點。該表的產(chǎn)生方法,請看案例“信號發(fā)生器和DA轉(zhuǎn)換”一章的內(nèi)容。 很自然地定義一個7位的選擇信號addr。我們只要控制好addr,就能方便得到sin_data。因此可以寫出下面代碼。 |