CIC滤波器原理与设计

一、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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-25 05:50
下一篇 2024-11-25 05:50

相关推荐

  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29
  • 神经网络BP算法原理

    本文将从多个方面对神经网络BP算法原理进行详细阐述,并给出完整的代码示例。 一、BP算法简介 BP算法是一种常用的神经网络训练算法,其全称为反向传播算法。BP算法的基本思想是通过正…

    编程 2025-04-29
  • GloVe词向量:从原理到应用

    本文将从多个方面对GloVe词向量进行详细的阐述,包括其原理、优缺点、应用以及代码实现。如果你对词向量感兴趣,那么这篇文章将会是一次很好的学习体验。 一、原理 GloVe(Glob…

    编程 2025-04-27
  • 编译原理语法分析思维导图

    本文将从以下几个方面详细阐述编译原理语法分析思维导图: 一、语法分析介绍 1.1 语法分析的定义 语法分析是编译器中将输入的字符流转换成抽象语法树的一个过程。该过程的目的是确保输入…

    编程 2025-04-27
  • Python字典底层原理用法介绍

    本文将以Python字典底层原理为中心,从多个方面详细阐述。字典是Python语言的重要组成部分,具有非常强大的功能,掌握其底层原理对于学习和使用Python将是非常有帮助的。 一…

    编程 2025-04-25
  • Grep 精准匹配:探究匹配原理和常见应用

    一、什么是 Grep 精准匹配 Grep 是一款在 Linux 系统下常用的文本搜索和处理工具,精准匹配是它最常用的一个功能。Grep 精准匹配是指在一个文本文件中查找与指定模式完…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25
  • 朴素贝叶斯原理详解

    一、朴素贝叶斯基础 朴素贝叶斯是一种基于贝叶斯定理的算法,用于分类和预测。贝叶斯定理是一种计算条件概率的方法,即已知某些条件下,某事件发生的概率,求某条件下另一事件发生的概率。朴素…

    编程 2025-04-25
  • 单点登录原理

    一、什么是单点登录 单点登录(Single Sign On,SSO)指的是用户只需要登录一次,在多个应用系统中使用同一个账号和密码登录,而且在所有系统中都可以使用,而不需要在每个系…

    编程 2025-04-25

发表回复

登录后才能评论