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

news2024/10/6 13:52:08

一、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 数字信号处理系统设计指南》-- 何宾 张艳辉 编著

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应届生选导师的创业公司,还是去中厂?

点击上方&#xff0c;选择“置顶/星标公众号” 福利干货&#xff0c;第一时间送达 导师是做自动化设备的控制软件&#xff0c;公司做纯软件。导师能给一样的工资&#xff0c;五人左右团队&#xff0c;潜在收入可能要高一些。纠结哪个对今后的发展更好一些。 大家好&#xff0…

【论文阅读笔记】Mamba模型代码理解

0.开源代码地址 官方实现&#xff1a;state-spaces/mamba (github.com) 最简化实现&#xff1a;johnma2006/mamba-minimal: Simple, minimal implementation of the Mamba SSM in one file of PyTorch. (github.com) 直接实现&#xff1a;alxndrTL/mamba.py: A simple and e…

Java 接口提示500,但console并不报错。

因为习惯了C语言printf打印&#xff0c;且当时并不明白try catch意义所在 如图所示&#xff0c;下添加了行号打印 但只打印出了line 89&#xff0c;无line 91&#xff0c;也无报错 所以使用try catch 包裹Sql查询封装函数 e.printStackTrace(); 果真打印出了 查看Entity类&…

【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)

#算法 目录 题目描述思路及实现方式一&#xff1a;递归思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 方式二&#xff1a;迭代和原地反转思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 总结相似题目 标签&#xff1a;链表、递归 题目描述 给你链表的头…

DFS:floodfill算法解决矩阵联通块问题

floodfill&#xff0c;翻译为洪水灌溉&#xff0c;而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。 一、图像渲染 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int dx[4]{0,0,1,-1};int dy[4]{1,-1,0,0};int prev;//记住初始值int m,…

什么是广播系统语言传输指数 STIPA

基础知识 通过广播系统播放一个确定的信号&#xff08;STIPA 测试信号&#xff09;&#xff0c;再在待测点测量其到达后的质量即可。IEC 60268-16 标准中定义通过单一值表示清晰度结果&#xff0c;0 表示完全无法理解&#xff0c;1 表示完美理解。测量单位是 STI&#xff08;语…

C#探索之路基础夯实篇(3):面向对象的三大特性和五大原则详解

文章目录 前提&#xff1a;一、特性&#xff1a;二、原则&#xff1a;三、示例1. 单一职责原则 (Single Responsibility Principle, SRP)&#xff1a;2. 开放-封闭原则 (Open-Closed Principle, OCP)&#xff1a;3. 里氏替换原则 (Liskov Substitution Principle, LSP)&#xf…

移动硬盘能当u盘重装系统吗?做启动数据还能恢复吗

在数字时代&#xff0c;随着技术的不断发展&#xff0c;我们越来越依赖于各种存储设备&#xff0c;其中移动硬盘以其大容量和便携性受到广大用户的青睐。不过&#xff0c;有时我们可能会遇到需要使用U盘来重装系统的情况&#xff0c;而手头又没有合适的U盘。这时&#xff0c;我…

Spring Boot-01-通过一个项目快速入门

官方参考文档&#xff1a;Spring Boot Reference Documentation 0. 概述 Spring的缺点&#xff1a; 1. 配置繁琐&#xff1a;虽然Spring的组件代码是轻量级&#xff0c;但它的配置却是重量级的。 2. 依赖繁琐&#xff1a;项目的依赖管理也是一件耗时耗力的事情。分析要导入哪…

03-JAVA设计模式-工厂模式详解

工厂模式 工厂设计模式是一种创建型设计模式&#xff0c;它提供了一种封装对象创建过程的机制&#xff0c;将对象的创建与使用分离。 这种设计模式允许我们在不修改客户端代码的情况下引入新的对象类型。 在Java中&#xff0c;工厂设计模式主要有三种形式&#xff1a;简单工厂…

【CNN】ConvMixer探究ViT的Patch Embedding: Patches Are All You Need?

Patches Are All You Need? 探究Patch Embedding在ViT上的作用&#xff0c;CNN是否可用该操作提升性能&#xff1f; 论文链接&#xff1a;https://openreview.net/pdf?idTVHS5Y4dNvM 代码链接&#xff1a;https://github.com/tmp-iclr/convmixer 1、摘要 ViT的性能是由于T…

基于Spark中随机森林模型的天气预测系统

基于Spark中随机森林模型的天气预测系统 在这篇文章中&#xff0c;我们将探讨如何使用Apache Spark和随机森林算法来构建一个天气预测系统。该系统将利用历史天气数据&#xff0c;通过机器学习模型预测未来的天气情况&#xff0c;特别是针对是否下雨的二元分类问题。 简介 Ap…

【unity】【C#】延时调用(协程)和场景管理

文章目录 什么是协程协程的应用 - IEnumerator如何控制协程的暂停协程的另一种写法 - Invoke场景管理 多看代码块中的注释 什么是协程 A coroutine alows vou to spreacwhere it left off on the following anc return control toolinencoeframe. 协程允许您将任务分布在多个帧…

Android14应用启动流程(源码+Trace)

1.简介 应用启动过程快的都不需要一秒钟&#xff0c;但这整个过程的执行是比较复杂的&#xff0c;无论是对手机厂商、应用开发来说启动速度也是核心用户体验指标之一&#xff0c;本文采用Android14源码与perfetto工具进行解析。 源码参考地址&#xff1a;Search trace分析工…

【二分查找】Leetcode 在排序数组中查找元素的第一个和最后一个位置

题目解析 34. 在排序数组中查找元素的第一个和最后一个位置 我们使用暴力方法进行算法演化&#xff0c;寻找一个数字的区间&#xff0c;我们可以顺序查找&#xff0c;记录最终结果 首先数组是有序的&#xff0c;所以使用二分法很好上手&#xff0c;但是我们就仅仅使用上一道题…

第四百四十二回 再谈flutter_launcher_icons包

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 经验与总结4.1 经验分享4.2 内容总结 我们在上一章回中介绍了"overlay_tooltip简介"相关的内容&#xff0c;本章回中将 再谈flutter_launcher_icons包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 …

配置vscode链接linux

1.安装 remote SSH 2.按F1 ssh ljh服务器公网ip 3. 选择保存远端host到本地 某位置 等待片刻后 4. 切换到远程资源管理器中 应该可以看到一台电脑&#xff0c;右键在当前窗口链接&#xff0c;输入你的服务器用户密码后电脑变绿说明远程连接成功 5.一定要登陆上云服务器后再…

Day:004(2) | Python爬虫:高效数据抓取的编程技术(数据解析)

正则表达式实战-腾讯新闻 需求&#xff1a; 使用正则获取腾讯新闻标题内容 网站&#xff1a;https://sports.qq.com/ 代码&#xff1a; import reimport requests from fake_useragent import UserAgenturl https://sports.qq.com/ # 构建请求头信息 headers {User-Agent:…

【JavaWeb】Day33.MySQL概述

什么是数据库 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音类的app&#xff0c;那这些大家所…

前端学习之DOM编程星星点灯案例

这个案例的实现逻辑是当你点击屏幕时&#xff0c;会完成一个事件&#xff0c;在你的屏幕上生成一张星星图片。然后再设置星星图片的大小将其改为随机。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…