一、CIC濾波器論文
首先介紹CIC濾波器的論文背景。CIC全稱為Cascaded Integrator-Comb濾波器,最早由E. H. Robinson和R. W. Schafer在1982年提出。CIC濾波器是數字信號處理領域中一種高效的低通濾波器,常用於信號降採樣、信號定點化、數據壓縮和數據預處理等應用。由於其結構簡單,實現容易,速度快等特點,被廣泛應用於數字通信、電力系統、控制系統等領域。
隨後,又有L. R. Rabiner等人在2002年的論文中對CIC濾波器進行了深入的研究,提出不同類型和長度的CIC濾波器的設計方法及其影響因素。於是CIC濾波器的設計以及應用得到了更加成熟和廣泛的應用。
二、CIC濾波器FPGA實現
CIC濾波器在FPGA實現中是非常常見的,其主要原因就是由於其結構特殊,能夠用多個級聯的積分器和滑動平均器簡單地構建出低通數字濾波器。FPGA的可編程性和高速並行性也使得CIC濾波器在數字信號處理中表現得十分出色。
以下是基於Verilog語言實現的2級CIC濾波器代碼示例:
module cic_filter #( parameter SDW = 16, //輸入數據寬度 parameter SDP = 16, //積分器寬度 parameter SDC = 16, //CF width parameter NST = 2, //級聯數量 parameter CF = 8 //CIC濾波器的CF參數,即積分器階數 )( input clk, //時鐘 input rstn, //非同步重置 input [SDW-1:0] in_data,//輸入數據 output reg [SDW-1:0] out_data//輸出數據 ); reg signed[SDP-1:0] integrator1; // 積分器1 reg signed[SDP-1:0] integrator2; // 積分器2 // CIC濾波器參數設置 reg signed[SDC-1:0] cntr[NST-2:0]; assign csum = {cntr[NST-2],cntr[NST-3:NST-CF]}; reg signed[SDC+log2(NST)-1:0] cic_p_n; reg signed[SDP+log2(NST)-1:0] cic_f; reg signed[(SDP+SDC)+log2(NST)-1:0] cic_q; reg cic_r; reg cic_f_nf; generate genvar i; for(i=0;i<NST-1;i=i+1) begin : cic_instance cic foo(SDP,SDC,CF)( .clk(clk), .rstn(rstn), .prm_rst(prm_rst), .p(ccsum[i]), .f(ccsum[i+1]), .q(bar[i]), .r(cic_r), .f_nf(cic_f_nf) ); end endgenerate // CIC濾波器模塊連接 assign ccsum[0] = {csum,in_data}; genvar i; generate for(i=1;i<NST-1;i=i+1) begin : cic_sum_connection assign ccsum[i] = bar[i-1]; end endgenerate assign out_data = cic_q[NST*SDC+NST*CF+SDP-1:NST*SDC]; endmodule
三、CIC濾波器的長度與延時
CIC濾波器的長度和延時是與濾波器參數和級聯數量直接相關的。在級聯數量為1的情況下,CIC濾波器的長度等於CF,延時為CF-1。在級聯數量為2的情況下,CIC濾波器的長度為CF * CF + CF,延時為CF * (CF-1)。
可以通過FPGA實現並進行模擬驗證,以下是一個CIC濾波器延時為49的模擬結果:
module cic_sim( input clk, input rstn, input signed [31:0] in_data, output signed [31:0] out_data ); reg signed [14:0] cic_out [4:0]; wire [15:0] cic_out_int; wire [15:0] cic_out_int_delayed; genvar i; generate for(i=0;i<5;i=i+1) begin : cic_lvl cic_filter #(16,16,16,3,2)(.clk(clk), .rstn(rstn), .in_data(cic_out[i]), .out_data(cic_out[i+1])); end endgenerate assign cic_out_int = cic_out[2][31:16]; assign cic_out_int_delayed = #10 cic_out_int; assign out_data = {cic_out_int,cic_out_int_delayed}[47:16]; endmodule
四、CIC濾波器的作用和原理
CIC濾波器能夠實現數字信號降採樣或者特定頻段的濾波,常用於數據預處理的環節。其本質上是一個低通積分器,積分器的輸出經過累加器後得到多個抽樣點內信號的平均值,實現了信號的平滑。CIC濾波器利用了理想低通濾波器的離散時間形式,將濾波器的「微分」和「積分」操作拆分并迭代執行,達到了簡單實現和高效運算的目的。但是CIC濾波器在設計的時候會存在性能損耗和輸出雜訊增加等問題,需要針對特定的應用需求進行設計和調整。
五、CIC濾波器的設計和增益
CIC濾波器的設計基於其級聯結構,主要涉及到CF參數的選擇(即積分器的階數)和級聯數量的確定。CF參數的選擇和級聯數量的增加都會影響濾波器的性能和輸出結果,需要進行權衡。同時,CIC濾波器也存在一定的增益,其值為2的CF倍數次方,也需要在設計過程中加以考慮。
以下是一個基於MATLAB的2級CIC濾波器設計代碼示例:
fs = 1000; % 採樣率 fc = 50; % 截止頻率 cf = 2; % 積分器個數 N = 2; % 級聯個數 M = 2^N; % CIC濾波器增益 R = round(fs/fc); % 重採樣係數 Q = R^cf; % 各級積分器輸入採樣率 % 各級差分器的係數 a = zeros(1,cf + 1); a(1) = M; for i = 1:cf a(i+1) = R; end % 一階IIR濾波器 b = [1-R R-1]; % 計算CIC濾波器的差分方程 b_cic = 1; a_cic = 1; for i = 1:N b_cic = conv(b_cic,a); a_cic = conv(a_cic,b); end % 歸一化係數 b_cic = b_cic/M; a_cic = a_cic; % 畫出CIC濾波器的幅頻響應 fvtool(b_cic, a_cic);
六、CIC濾波器的模擬選取
模擬具體操作如下:
1、模擬信號的生成:可以使用Matlab代碼或Simulink工具生成需要濾波的信號;
2、驗證CIC濾波器的性能:使用Verilog語言設計CIC濾波器,並用Vivado工具模擬驗證其性能,如幅頻特性和延時等;
3、功能和性能集成:將CIC濾波器的模擬信號和CIC濾波器的系統集成起來,觀察其實際效果。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/183893.html