一、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/n/183893.html
微信扫一扫
支付宝扫一扫