前言
本文根據(jù)FIR濾波器相關(guān)原理進(jìn)行設(shè)計(jì)構(gòu)建工程,利用前文的工程構(gòu)建的混頻功能的工程,將高頻分量進(jìn)行濾除,保留低頻分量。
有限沖擊響應(yīng)濾波器概述
FIR濾波器廣泛應(yīng)用于數(shù)字信號(hào)處理中,主要功能就是將不感興趣的信號(hào)濾除,留下有用信號(hào)。FIR濾波器是全零點(diǎn)結(jié)構(gòu),系統(tǒng)永遠(yuǎn)穩(wěn)定;并且具有線性相位的特征,在有效頻率范圍內(nèi)所有信號(hào)相位上不失真。相比IIR濾波器,F(xiàn)IR濾波器更容易用數(shù)字域進(jìn)行實(shí)現(xiàn)。
在數(shù)字濾波的應(yīng)用中, 絕大部分接觸的都是使用 FIR Filter,其相對(duì)于 IIR Filter 要簡單的多。FIR Filter 的核心思想就是卷積運(yùn)算,然后了解一下卷積的時(shí)域卷積定理,就可以想象出 FIR 濾波器的原理。
卷積類比FIR卷積
在離散數(shù)字信號(hào)領(lǐng)域, 卷積的定義如下
而 FIR Filter 中的卷積是有限長序列的卷積, 定義為
其中?(k)是濾波器序列, M 是濾波器系數(shù)的長度, k 的取值為 0~M-1。在實(shí)際的應(yīng)用中,一般都會(huì)認(rèn)為x(n)的也是從零開始。下面舉一個(gè)例子,設(shè)置一個(gè)序列和一個(gè)濾波器系數(shù),然后觀察卷積效果。
xn=[5,11,15,234,34,67,88,46,66,12];%定義x(n)序列
m=size(xn,2);
t1=0:m-1;%定義時(shí)間
hn=[0.2,0.2,0.2,0.2,0.2];%定義h(n)序列
n=size(hn,2);
t2=0:n-1;
yn=conv(xn,hn);
t3=0:(n+m-1)-1;%卷積計(jì)算后序列的長度定義為n+m-1
figure;
subplot(3,1,1);stem(t1,xn,'r','filled');title('x(n)序列');%畫x(n)序列
subplot(3,1,2);stem(t2,hn,'g','filled');title('h(n)序列');%畫h(n)序列
subplot(3,1,3);stem(t3,yn,'b','filled');title('y(n)序列');%畫y(n)序列
經(jīng)過卷積運(yùn)算后的信號(hào)序列更加平滑,觀察hn序列中的系數(shù)均為0.2,該設(shè)計(jì)類似一個(gè)平滑濾波器的功能,相當(dāng)于做了平均濾波。
利用MATLAB或filter_solution設(shè)計(jì)濾波器
DDS的混頻工程,混頻之后的信號(hào)是 1Mhz 和 7Mhz,保留低頻分量的話就要濾除 7Mhz 保留 1Mhz。 因?yàn)镮P中設(shè)置的信號(hào)動(dòng)態(tài)范圍是 45dB, 那么1Mhz 和 7Mhz 的動(dòng)態(tài)范圍各自是22.5dB,要想把7Mhz 抑制掉,需要至少濾波器要抑制信號(hào) 22.5dB。 所以設(shè)計(jì)的濾波器,在 9Mhz位置需要是有至少-22.5dB 的衰減, 且在1Mhz 位置通帶盡量平滑, 并接近于 0dB,也就是沒有增益沒有衰減。
在這里可以利用MATLAB的濾波器設(shè)計(jì)工具或者Filter_solution進(jìn)行構(gòu)建。
MATLAB的FDA設(shè)計(jì)
下圖為濾波器設(shè)計(jì)的界面,通過界面可以設(shè)計(jì)所需要的濾波器,為了濾除設(shè)計(jì)中的高頻分量,這里使用了低通濾波,并根據(jù)實(shí)際的應(yīng)用需求將參數(shù)進(jìn)行設(shè)置。
- 濾波類型(Filter Type)= Lowpass
- 采樣率(Fs) = 50MHZ
- 濾波階數(shù)(order) = 63(階數(shù)越大,濾波品質(zhì)越好,但相對(duì)滯后越大)
- 密度因子( Density Factor)= 20
- Fpass(通頻帶)= 2MHZ
- Fstop(截止帶)= 4MHZ
- Apass(通頻帶寬增益期望)= 1dB
- Astop(截止帶寬增益期望)= -80dB
完成濾波器的參數(shù)配置后,進(jìn)行生成濾波器的系數(shù),點(diǎn)擊下圖指示可生成coe文件或者c的頭文件,可根據(jù)具體需要進(jìn)行輸出設(shè)置。
filter_solution設(shè)計(jì)濾波器
該軟件效果和MATLAB的濾波器的效果相當(dāng),都是根據(jù)需求調(diào)整相應(yīng)的濾波器參數(shù),然后進(jìn)行生成相關(guān)的濾波器系數(shù)。
點(diǎn)擊頻率響應(yīng)可觀察到該濾波器的頻率響應(yīng)圖。
如下圖所示:
點(diǎn)擊分析濾波器可獲得相關(guān)濾波器的權(quán)值。可根據(jù)具體需求選擇輸出向量模式或者生成相關(guān)測試C代碼。
使用FIR IP進(jìn)行工程設(shè)計(jì)
將DDS應(yīng)用實(shí)例的工程進(jìn)行復(fù)制備份,然后添加FIR IP。打開設(shè)置相關(guān)參數(shù)。
FIR濾波器IP設(shè)置
可先在第一個(gè)界面配置濾波器的基本參數(shù),如果濾波器系數(shù)選擇向量格式,可將剛剛在濾波器設(shè)計(jì)軟件中的系數(shù)進(jìn)行復(fù)制,并粘貼到vector的輸入框中。這里將之前生成的系數(shù)進(jìn)行復(fù)制。
8.05e-04, 8.416e-04, 8.681e-04, 8.624e-04, 7.882e-04, 6.001e-04, 2.496e-04, -3.048e-04, -1.089e-03, -2.101e-03, -3.306e-03, -4.628e-03, -5.95e-03, -7.117e-03, -7.941e-03, -8.217e-03, -7.735e-03, -6.301e-03, -3.758e-03, 0, 5.008e-03, 1.122e-02, 1.85e-02, 2.664e-02, 3.533e-02, 4.421e-02, 5.289e-02, 6.095e-02, 6.798e-02, 7.361e-02, 7.754e-02, 7.956e-02, 7.956e-02, 7.754e-02, 7.361e-02, 6.798e-02, 6.095e-02, 5.289e-02, 4.421e-02, 3.533e-02, 2.664e-02, 1.85e-02, 1.122e-02, 5.008e-03, 0, -3.758e-03, -6.301e-03, -7.735e-03, -8.217e-03, -7.941e-03, -7.117e-03, -5.95e-03, -4.628e-03, -3.306e-03, -2.101e-03, -1.089e-03, -3.048e-04, 2.496e-04, 6.001e-04, 7.882e-04, 8.624e-04, 8.681e-04, 8.416e-04, 8.05e-04
然后可以對(duì)通道相關(guān)參數(shù)進(jìn)行設(shè)置。
在第三個(gè)界面中可設(shè)置濾波器系數(shù)的相關(guān)數(shù)據(jù)格式,以及輸入輸出的數(shù)據(jù)格式。需要注意的是,這里輸入的信號(hào)是DDS產(chǎn)生的數(shù)據(jù),這個(gè)數(shù)據(jù)僅有整數(shù)部分,所以要調(diào)整輸入數(shù)據(jù)的小數(shù)位為0。
詳細(xì)實(shí)現(xiàn)界面主要對(duì)濾波器的硬件實(shí)現(xiàn)的架構(gòu)進(jìn)行選擇,包括對(duì)架構(gòu)的優(yōu)化方式,存儲(chǔ)以及DSP資源的使用設(shè)置。
接口界面主要對(duì)相關(guān)的指示信號(hào)進(jìn)行設(shè)置,這里可暫時(shí)保持默認(rèn),實(shí)際應(yīng)用時(shí)可根據(jù)需要進(jìn)行使能相關(guān)信號(hào)。
總結(jié)界面對(duì)前面的相關(guān)設(shè)置進(jìn)行了小結(jié)展示,方便用戶進(jìn)行檢查核對(duì)并修改錯(cuò)誤設(shè)置的參數(shù)。
同時(shí)在左側(cè)欄中可以看到濾波器的頻率響應(yīng),以及該IP設(shè)置的相關(guān)資源使用情況,以便于在實(shí)際工程應(yīng)用中對(duì)數(shù)據(jù)鏈路的信號(hào)進(jìn)行操作處理,以及對(duì)資源的合理分配。
修改DDS IP
之前進(jìn)行混頻設(shè)計(jì)時(shí),使用了DDS的IP輸出三路信號(hào)分別為10MHz,3MHz和4MHz。這里為了減少一路輸出,設(shè)置兩路的信號(hào)輸出,匹配FIR的ip采樣頻率的50MHz。或者這里采用頻率直接修改為33.33MHz也可以。
修改頂層文件
修改了DDS ip后,要對(duì)邏輯進(jìn)行調(diào)整使得可根據(jù)m_axis_data_tuser信號(hào)輸出3M和4M的信號(hào)。并在頂層模塊中調(diào)用例化FIR的IP,將混頻后的數(shù)據(jù)接入到FIR的輸入數(shù)據(jù)端,將DDS的data_tvalid接到FIR ip的tvalid端口,tready可懸空。因?yàn)?a target="_blank">仿真設(shè)計(jì)的是100MHz時(shí)鐘,而FIR ip需要的是50MHz所以用寄存器生成一個(gè)二分頻時(shí)鐘接入到FIR ip的時(shí)鐘端口。
module top(
input clk
);
// wire m_axis_data_tvalid_ch1;
// wire [7:0] m_axis_data_tdata_ch1;
// //單通道測試
// dds_compiler_0 ch1_dds(
// .aclk(clk), // input wire aclk
// .m_axis_data_tvalid(m_axis_data_tvalid_ch1), // output wire m_axis_data_tvalid
// .m_axis_data_tdata(m_axis_data_tdata_ch1) // output wire [7 : 0] m_axis_data_tdata
// );
wire m_axis_data_tvalid_ch3;
wire [7 : 0] m_axis_data_tdata_ch3;
wire [0 : 0] m_axis_data_tuser_ch3;
// wire m_axis_phase_tvalid_ch3;
// wire [31 : 0] m_axis_phase_tdata_ch3;
// wire [1 : 0] m_axis_phase_tuser_ch3;
//多通道測試
dds_compiler_1 multi_ch_dds(
.aclk(clk), // input wire aclk
.m_axis_data_tvalid (m_axis_data_tvalid_ch3), // output wire m_axis_data_tvalid
.m_axis_data_tdata (m_axis_data_tdata_ch3), // output wire [7 : 0] m_axis_data_tdata
.m_axis_data_tuser (m_axis_data_tuser_ch3), // output wire [1 : 0] m_axis_data_tuser
.m_axis_phase_tvalid(), // output wire m_axis_phase_tvalid
.m_axis_phase_tdata (), // output wire [31 : 0] m_axis_phase_tdata
.m_axis_phase_tuser () // output wire [1 : 0] m_axis_phase_tuser
);
reg [7 : 0] data10MHz;
reg [7 : 0] data3MHz;
reg [7 : 0] data4MHz;
always @(posedge clk) begin
case(m_axis_data_tuser_ch3)
0:data3MHz<=m_axis_data_tdata_ch3;
1:data4MHz<=m_axis_data_tdata_ch3;
endcase
end
//混頻測試
wire [15 : 0] mixer_singal;
mult_gen_0 mult_mixer (
.CLK(clk), // input wire CLK
.A(data3MHz), // input wire [7 : 0] A
.B(data4MHz), // input wire [7 : 0] B
.P(mixer_singal) // output wire [15 : 0] P
);
wire [39:0] after_fir_singal;
reg div_clk=0;
always @(posedge clk ) begin
div_clk<=!div_clk;
end
fir_compiler_0 uut_fir(
.aclk(div_clk), // input wire aclk
.s_axis_data_tvalid(m_axis_data_tvalid_ch3), // input wire s_axis_data_tvalid
.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready
.s_axis_data_tdata(mixer_singal), // input wire [15 : 0] s_axis_data_tdata
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(after_fir_singal) // output wire [39 : 0] m_axis_data_tdata
);
endmodule
運(yùn)行仿真測試
點(diǎn)擊運(yùn)行行為級(jí)仿真,添加信號(hào)波形,并修改信號(hào)的進(jìn)制(進(jìn)制可選擇有符號(hào)十進(jìn)制)和類型(選擇模擬類型),可觀察到下面的情況。
從截圖中可看出,混頻后的信號(hào)經(jīng)過了濾波處理消除了高頻分量,添加游標(biāo)可觀察濾波后的信號(hào)的頻率。添加游標(biāo)后觀察發(fā)現(xiàn)濾波后的信號(hào)為混頻信號(hào)的1Mhz的信號(hào)。因此,工程設(shè)計(jì)中的低通濾波很好地濾除掉了7MHz的高頻分量。
小結(jié)思考
在使用FIR濾波器中的實(shí)際設(shè)計(jì)的數(shù)字濾波器效果可能會(huì)因設(shè)置的不同而效果不同。因此,在實(shí)際使用時(shí)要關(guān)注一下方面確保濾波器的效果能達(dá)到預(yù)期。
- 在濾波器工具使用時(shí)應(yīng)考慮不同類型的濾波器的實(shí)際效果,可經(jīng)過對(duì)比選擇性能較優(yōu)異,階數(shù)少,且濾波效果能達(dá)到使用預(yù)期的類型,例如在使用FIR濾波器時(shí),同樣階數(shù)的不同類型窗的濾波效果可能對(duì)特定信號(hào)的濾波效果不同。
- 該工程僅僅驗(yàn)證了FIR濾波器的基本功能,在實(shí)際使用時(shí)特別是遇到實(shí)時(shí)處理的情況需謹(jǐn)慎考慮濾波器的并行度,確保在規(guī)定的處理時(shí)間內(nèi)能完成相關(guān)信號(hào)處理操作,且要關(guān)注數(shù)據(jù)鏈路的數(shù)據(jù)位寬,確保在實(shí)際應(yīng)用做切片處理時(shí)不會(huì)損失精度,或造成數(shù)據(jù)溢出。
-
matlab
+關(guān)注
關(guān)注
185文章
2980瀏覽量
230784 -
濾波器
+關(guān)注
關(guān)注
161文章
7857瀏覽量
178625 -
數(shù)字信號(hào)處理
+關(guān)注
關(guān)注
15文章
563瀏覽量
45939 -
FIR
+關(guān)注
關(guān)注
4文章
147瀏覽量
33244 -
信號(hào)
+關(guān)注
關(guān)注
11文章
2803瀏覽量
76981
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論