ZYNQ实验--CIC插值滤波器实验

一、CIC滤波器介绍

  CIC (Cascaded Integrator-Comb) 滤波器是一种常用的数字信号处理滤波器,主要用于降采样(decimation)和升采样(interpolation)操作。它具有简单的硬件实现、高效的运算速度以及适用于需要快速处理的应用场景等优点。半带滤波器具有较好的通带平坦特性,但考虑到面积和功耗,通常只能实现偶数倍的采样率变化。CIC滤波器在信号带宽为8分之一采样率时的滤波效果较好,因此在实际使用中为保证整体滤波的带内平坦和较好的滤波效果,CIC滤波会结合半带滤波器实现高倍采样率变化。

  在理论上,多级CIC(Cascaded Integrator-Comb)滤波器可以通过级联多个单级CIC滤波器来实现。然而,根据Noble恒等式的观点,即“先进行抽取或插值,再进行线性滤波”与“先进行线性滤波,再进行抽取或插值”是等价的,我们可以将多个单级CIC滤波器的结构进行变换,可以节省资源并提高计算速度,更为实用。

1.1 CIC滤波器基本结构

  CIC滤波器分为3部分:积分器,抽取/插值器,梳状器。本实验在Vivado 2018.3 环境中完成并进行仿真。根据插值滤波器的结构,使用Verilog HDL分别完成积分模块、插值模块、梳状模块的设计。下图分别为CIC抽取和CIC插值滤波器的基本结构图,图中参数:R为抽取或插值系数,M为差分延迟,在工程中一般取1或者2,N为滤波器级数。
在这里插入图片描述
在这里插入图片描述

1.2 CIC滤波器位宽确定

  上文图中R抽取或插值系数,M差分延迟(M为CIC阶数),N滤波器级数和Bin输入数据的位宽将决定积分器Bout不发生溢出的位宽值。 计算公式如下:

  1. 抽取滤波器
    B out ⁡ = ⌈ N log ⁡ 2 R M + B i n ⌉ B_{\operatorname{out}}=\left\lceil N \log _2 R M+B_{in}\right\rceil Bout=Nlog2RM+Bin
  2. 插值滤波器
    B out ⁡ = ⌈ log ⁡ 2 ( R M ) N R + B i n ⌉ B_{\operatorname{out}}=\left\lceil\log _2 \frac{(R M)^N}{R}+B_{in}\right\rceil Bout=log2R(RM)N+Bin
    与CIC抽取滤波器不同,插值并不要求所有滤波器有相同的位宽,这里使用的最大位宽公式。

说明: M这个参数有的文章认为是CIC滤波器的阶数,但有的文章计算公式中有M却并为说明M是什么参数并且设计中也没有体现,结合找到的参考资料在本设计中认为M为差分延迟参数,设置为1。CIC抽取滤波可以在中间级进行舍入操作,但是CIC插值滤波不能进行舍入操作,因为积分器在梳状器之后,梳状器引入的量化误差会在积分器中累加引起滤波器的不稳定。

二、CIC插值滤波器实现

2.1位宽确定

  实验设计的插值滤波器插值系数 R = 96 , M = 1 , N = 4 , B i n = 16 b i t R=96,M=1,N=4,Bin=16bit R=96M=1N=4Bin=16bit,根据计算公式得
B out ⁡ = ⌈ log ⁡ 2 ( R M ) N R + B i n ⌉ = ⌈ log ⁡ 2 ( 96 ∗ 1 ) 4 96 + 16 ⌉ = 36 b i t B_{\operatorname{out}}=\left\lceil\log _2 \frac{(R M)^N}{R}+B_{in}\right\rceil=\left\lceil\log _2 \frac{(96*1)^4}{96}+16\right\rceil=36bit Bout=log2R(RM)N+Bin=log296(961)4+16=36bit
MATLAB的FDATOOL工具观察CIC滤波器的频谱。
在这里插入图片描述

//模块定义
module CIC#(
    parameter STAGES = 4, // 滤波器阶数
    parameter DATA_WIDTH = 16, // 数据宽度
    parameter INDATA_WIDTH = 36, // 中间数据宽度
    parameter Ntimer = 96 // 插值倍数
)
(
    input clk_in,  // 输入数据时钟
    input clk_out, // 输出数据时钟(Ntimer倍于输入数据时钟)
    input reset,   // 复位信号
    input signed [DATA_WIDTH-1:0] data_in, // 输入数据
    output reg signed [DATA_WIDTH-1:0] data_out // 输出数据
);
// 积分器的寄存器
reg signed [INDATA_WIDTH-1:0] integrator [0:STAGES-1]; 
// 梳状器的寄存器
reg signed [INDATA_WIDTH-1:0] comb [0:STAGES-1]; 
reg signed [INDATA_WIDTH-1:0] combd [0:STAGES-1]; 
// 插值的寄存器
reg signed [INDATA_WIDTH-1:0] interpolation = 0;
reg [7:0] cont;
// 输出缓冲
reg signed [INDATA_WIDTH-1:0] output_buffer = 0;

// 将输出缓冲的值映射到输出端口
always @(posedge clk_out) begin
    data_out <= output_buffer[INDATA_WIDTH-1:INDATA_WIDTH-15]; // 可能需要调整以适应实际的位宽和动态范围
end

endmodule

2.2 梳状器模块(fs)

// 梳状器(由输入时钟驱动)
always @(posedge clk_in or posedge reset) begin
    if (reset) begin
        for (i = 0; i <STAGES; i = i + 1) begin
            comb[i] <= 0;
            combd[i]<= 0;
        end
    end 
    else begin
    	//梳状器操作
        comb[0] <= {{(INDATA_WIDTH-16){data_in[15]}},data_in};
        for (i = 0; i <STAGES; i = i + 1) begin
            combd[i] <= comb[i];
        end
        for (i = 1; i <STAGES; i = i + 1) begin
            comb[i] <= comb[i-1]-combd[i-1];
        end
    end
end

一级comb的RTL图,实现输入与输入延时一个单位后相减的操作。
在这里插入图片描述

2.3 插值器模块(N*fs)

对梳状器结果进行插值操作,即间隔N点补零

// 插值器(输出时钟驱动)
always @(posedge clk_out or posedge reset) begin
    if (reset) begin
          interpolation <= 0;
          cont<=0;
    end 
    else begin
         cont<=cont+1;
         if(cont==Ntimer-1) begin //N倍插值
            interpolation <=comb[STAGES-1];
            cont<=0;
         end
         else
            interpolation <=0;
    end
end

2.4 积分器模块(N*fs)

// 积分器逻辑(由输出时钟驱动)
always @(posedge clk_out or posedge reset) begin
    if (reset) begin
        for (i = 0; i <STAGES; i = i + 1) begin
            integrator[i] <= 0;
        end
        output_buffer <= 0;
    end 
    else begin
        integrator[0] <= interpolation;
        for (i = 1; i <STAGES; i = i + 1) begin //积分器
            integrator[i] <= integrator[i] + integrator[i-1];
        end
        output_buffer<=integrator[STAGES-1];
    end
end

一级integartor的RTL图
在这里插入图片描述

三、CIC插值滤波器实现

实验仅进行行为仿真验证

3.1 testbench

module testCIC(
    );
reg clk,reset;
reg sclk;
wire [7:0]RA;
wire [15:0]RD;
wire [15:0]RO;

initial begin
    clk  = 1'b0;
    sclk  = 1'b0;
    #100 reset=1'b1;
    #500 reset=1'b0;
    end
    
always begin
   #1 clk =~clk;
end

always begin
   #96 sclk =~sclk;
end

//正弦信号输出
count count1(   
    .CLK(sclk),
    .RST(reset),
    .RA(RA));
DDS DDS1(
    .CLK(sclk),           
    .RA(RA),       
    .RDQ(RD));
//CIC插值滤波
CIC cic1(
     .clk_in(sclk),  
     .clk_out(clk), 
     .reset(reset),  
     .data_in(RD), 
     .data_out(RO) 
);
endmodule

3.2 仿真分析

上变频时钟周期为2ns,输入时钟为192ns,图中data_in和data_out周期比例为96,符合预期设计
在这里插入图片描述
CIC插值滤波后的波形未出现波形失真,但存在幅度减小的情况(这里暂未弄清楚是滤波增益造成还是输入数据的问题)
在这里插入图片描述
中间梳妆器和积分器的过程就不再展示,可自行进行实验观测。

参考文章

Vivado CIC IP核手册
数字下变频和抽取滤波器—陈老湿·通信MATLAB仿真
《Xilinx FPGA 数字信号处理系统设计指南》-- 何宾 张艳辉 编著

本文目的主要为学习记录,如果您在本文中发现了任何错误或疑问,请随时反馈会及时做出相应的修改。

  • 30
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
CIC滤波器补偿滤波器是一种数字滤波器,用于对信号进行滤波和频率补偿。CIC滤波器是一种多级积分器累积器(CIC)结构,用于实现高效的抽取插值操作。然而,CIC滤波器在频率响应上存在一些缺陷,例如有一个很宽的过渡带和一个剧烈下降的折线响应。 为了克服CIC滤波器的频率响应问题,可以设计一个补偿滤波器。补偿滤波器通常是一个带通滤波器,用于补偿CIC滤波器的频率响应。补偿滤波器的设计目标是使得整体滤波器的频率响应更加平坦。 补偿滤波器的设计方法通常包括以下步骤: 1. 确定CIC滤波器的型号和参数。这包括CIC滤波器的积分阶数、不同级别的延迟和减小因子。 2. 分析CIC滤波器的频率响应。可以使用数学分析或者模拟工具来获得CIC滤波器的幅度响应和相位响应。 3. 根据CIC滤波器的频率响应,设计补偿滤波器。通常可以选择使用FIR(有限脉冲响应)滤波器或者IIR(无限脉冲响应)滤波器来实现补偿滤波器。 4. 进行滤波器的仿真和验证。使用仿真工具来验证补偿滤波器的性能,并对其进行调整和优化。 5. 实现补偿滤波器并与CIC滤波器级联。将补偿滤波器CIC滤波器级联,以实现靠近理想频率响应的整体滤波器。 通过补偿滤波器的设计,可以有效改善CIC滤波器的频率响应,并得到更接近理想滤波器的性能。这在许多信号处理和通信系统中非常重要,特别是对于需要对信号进行高质量处理和恢复的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊丽莎白鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值