【CIC滤波器】基于MATLAB/FPGA的数字CIC滤波器的设计
FPGA代碼:
module down(i_clk,//輸入時鐘i_rst,//輸入復(fù)位信號i_M, //抽取值i_data,//輸入信號o_data,//輸出信號r_clk);input i_clk;//輸入時鐘 input i_rst;//輸入復(fù)位信號 input [7:0] i_M; //抽取值 input signed[31:0] i_data;//輸入信號 output signed[31:0]o_data;//輸出信號 output r_clk;//輸出信號 reg [7:0] r_cnt =8'd0; reg signed[31:0]o_data=32'd0; reg r_clk =1'b0;always @(posedge i_clk) beginif(!i_rst)//系統(tǒng)復(fù)位beginr_cnt<=8'd0;r_clk<=1'b0;end else beginif(r_cnt==i_M/2-1)//分頻beginr_clk<=~r_clk;r_cnt<=8'd0;endelse beginr_cnt<=r_cnt+1'b1;r_clk<=r_clk; end end end always @(posedge r_clk) beginif(!i_rst)//系統(tǒng)復(fù)位begino_data<=32'd0;end else begino_data<=i_data;//抽取end end endmoduleMATLAB代碼:
clc; clear; close all;%CIC又稱為梳狀濾波器,所以這里首先給出其梳狀波形。。。。 %積分濾波器的響應(yīng) b1=1; a1=[1 -1]; D=9; b2=[1 zeros(1,D-1) -1]; a2=1; b3=b2; a3=a1; b4=conv(b3,b3); a4=conv(a3,a3); b5=conv(b4,b3); a5=conv(a4,a3); b6=conv(b4,b4); a6=conv(a4,a4); b7=conv(b6,b3); a7=conv(a6,a3); figure(1); freqz(b7/D^5,a7,'whole');%CIC抽取濾波器 % 抽取因子 r = 2; hm = mfilt.cicdecim(r); %原始的采樣率 44.1kHz. fs = 44.1e3; %10240個采樣點 n = 0:10239; %原始信號 x = sin(2*pi*1e3/fs*n); %得到抽取后的5120個采樣點 y_fi = filter(hm,x); x = double(x); y = double(y_fi); y = y/max(abs(y)); figure(2); stem(n(1:44)/fs,x(2:45)); hold on; stem(n(1:22)/(fs/r),y(3:24),'r','filled'); xlabel('時間(sec)');ylabel('信號值'); title('CIC抽取濾波器');%CIC內(nèi)插濾波器 %插值因子 R = 2; hm = mfilt.cicinterp(R); % 原始采樣頻率:22.05 kHz. fs = 22.05e3; % 5120個采樣點 n = 0:5119; %原始信號 x = sin(2*pi*1e3/fs*n); y_fi = filter(hm,x); x = double(x); y = double(y_fi); y = y/max(abs(y)); figure(3); stem(n(1:22)/fs,x(1:22),'filled'); hold on; stem(n(1:44)/(fs*R),y(4:47),'r'); xlabel('時間(sec)');ylabel('信號值'); title('CIC內(nèi)插濾波器');仿真與說明
1.1 MATLAB設(shè)計說明
這個CIC濾波器的頻率特性,如果上圖,上圖和梳子比較相似。所以稱為梳狀濾波器。
??? 這個是CIC抽取濾波器,如圖可以看到,每2個點抽取一個點,達(dá)到抽取效果。
??? 這個是CIC內(nèi)插濾波器,如圖可以看到,每2個點插入一個點,達(dá)到抽取效果。
1.2 FPGA設(shè)計說明
??? 一般在實際應(yīng)用中,我們多半設(shè)計抽取濾波器用的更多,一般抽取濾波器如下所示:
在這里,我們將其中一些參數(shù)具體化,設(shè)計一個具體參數(shù)的CIC濾波器。
我們將這個系統(tǒng)模塊話,然后在實際應(yīng)用的時候,我們只要改變其中的參數(shù)就可以了。
系統(tǒng)分為如下三個模塊。
??? ???
模塊一的設(shè)計:
delay_one(
??????????????? i_clk,//輸入時鐘
??????????????? i_rst,//輸入復(fù)位信號
??????????????? i_data,//輸入信號
??????????????? o_data//輸出信號
??????????????? );
模塊二的設(shè)計:
down(
?????????? i_clk,//輸入時鐘
?????? ????i_rst,//輸入復(fù)位信號
?????????? i_M,? //抽取值
?????????? i_data,//輸入信號
?????????? o_data//輸出信號
?????????? );
模塊三的設(shè)計:
delay_M(
????????????? i_clk,//輸入時鐘
????????????? i_rst,//輸入復(fù)位信號
????????????? i_data,//輸入信號
????????????? o_data//輸出信號
????????????? );
那么其在頂層,我們只要調(diào)用這些模塊就行了。
其中CIC積分器輸出結(jié)果如下所示:
系統(tǒng)濾波輸出結(jié)果如下所示:
可以看到,濾波后的效果。
當(dāng)改變CIC級數(shù)的時候,就能得到不同效果的CIC濾波器
? ? ? 檢驗CIC濾波器最快的方法就是輸入一個階躍信號,這里我們輸入的階躍信號是00FFFFFF,最終通過CIC濾波器的效果如dataout,通過查看相關(guān)文獻(xiàn)資料,階躍信號信號通過CIC濾波器后的效果為:
? ? ?
??
其效果和我們FPGA設(shè)計得到的效果基本相同。
?以上是輸入隨機信號后濾波效果,顯然,其波形特性得到了改善。
A01-23
總結(jié)
以上是生活随笔為你收集整理的【CIC滤波器】基于MATLAB/FPGA的数字CIC滤波器的设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STBC】Alamouti,STBC误
- 下一篇: 【Efficient-Net】基于Eff