孩子都能学会的FPGA:第二十六课——用FPGA实现CIC抽取滤波器

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。如需整个工程请留言(WX:Blue23Light),不收任何费用,但是仅供参考,不建议大家获得资料后从事一些商业活动!

在数字信号处理中,CIC滤波器是FIR滤波器中最优的一种,其使用了积分,梳状滤波器级联的方式。CIC滤波器由一对或多对积分-梳状滤波器组成,在抽取CIC中,输入信号依次经过积分,降采样,以及与积分环节数目相同的梳状滤波器。

以上是百度上对CIC滤波器的说明,后面还有各种的公式的推导,有兴趣的读者可以好好学习一下,这不是本文的重点,本文主要讲解如何用FPGA设计CIC滤波器。

从定义中我们可以得出,CIC滤波器是FIR滤波器的一种,可以只使用积分和梳状滤波器来实现,也就是说根本没有了FIR的乘法操作,实现非常的简单。

积分器是单极点的IIR滤波器,其状态方程为:

y(n)=y(n−1)+x(n)

其系统响应为:

H1(z) = 1/(1 - z^{-1})

梳状滤波器为对称的FIR滤波器,其状态方程为:

y(n)=x(n)−x(n−N)

其系统响应为:

H2(z) = 1-z^{-N}

CIC滤波器是通过将积分器与梳状滤波器进行级联,可以得到CIC滤波器的系统函数响应:

H(z) = H1(z)*H2(z) = 1-z^{-N}/(1 - z^{-1})

其中N为抽取倍数由于单级CIC的第一旁瓣阻带衰减是固定的13.46dB,无法很好的抑制旁瓣,因此可以通过级联的方式来提升抑制效果。

看公式能可能会一头雾水,我们用3级CIC抽取滤波器的示意图来说明,如下所示。CIC抽取滤波器一般用在高速采集信号的降采样上,假如AD的采集速度是Fs,但是系统的处理速度只有Fs/N,和直接抽取或者N个值加权平均相比,CIC抽取是计算复杂度低,系统性能,可以有效的过滤掉噪声和干扰信号。

数据以Fs(假设100MHz)的频率输入滤波器,那数据先通过3级的积分滤波器一直进行累加。假如我们希望得到Fs16分频的采样数据,那就将积分滤波器的最后一级输出以Fs/N(6.25MHz)的频率进入梳状滤波器,梳状滤波器其实是微分运算,即当前值减去上一次的值。经过3次的梳状滤波器,最后1级的结果即为抽取的数值。

CIC滤波器的设计还有一个问题,就是数据位数的扩展。假设输入数据是8位,因为积分滤波器一直在累计,中间的寄存器一定要进行数据位的扩展。这儿有一个扩展的公式,就是数据的最大位宽是8+K*log2(N*M)K是积分滤波器和梳状滤波器的级数,这儿K=3N是降采样的倍数,这儿N=16M是每次采样的样本个数,这儿M=1;所以扩展后数据的最大位宽是8+3*log2(16)=20,方便起见,中间的寄存器可以都取20位即可。

如下所示,CIC降采样滤波器相关信号的定义,参数W=20是中间寄存器的位宽,DIV_NUM=16是降采样的倍数,SIGNAL_NUM是符号位扩展的位数。

用时序打拍的方式完成积分累计值的3级传递,用组合逻辑实现积分器的累加。用计数器div_cnt产生flag控制系统降采样。

用时序打拍的方式完成梳状滤波器微分值的3级传递,用组合逻辑实现梳状滤波器的微分运算。最后一级微分值的高8位就是CIC按照16倍降采样抽取的最终数值。

本工程新建了一个cic_top文件,用来例化cic_sampling和前面课程中的正弦波生成器gen_sin,将正弦波以数据以100MHz的频率读出,经过cic_sampling后,以6.25MHz的频率输出。

新建仿真文件后,双击sim目录下的top_tb.bat文件,完成系统的自动化仿真。

modelsim的仿真波形如下所示,CIC降采样抽取后的波形相位有一些滞后,输出的波形也没有失真,功能开发是正确的。

其实CIC不光可以降采样抽取,还是可以升采样进行插值,这个我们下节课进行讲解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows系统如何解决爆满C盘

目录 方法一:清理临时文件 方法二:清理临时文件 方法三:清理系统更新文件 方法四: 设置自动清理无用文件 4.1 清理缓存 4.2 打开存储感知 4.3 调整新内容存储地方 方法一:清理临时文件 代码:win …

Python框架篇(4):FastApi-错误处理

提示: 微信搜索【猿码记】回复 【fastapi】即可获取源码信息~ 1.验证错误 1.1 默认返回 当传参不符合模型验证规则时,默认错误信息和格式返回如下: { "detail": [ { "loc": [ "body", "age" …

22、pytest多个参数化的组合

官方实例 # content of test_multi_parametrie.py import pytestpytest.mark.parametrize("x",[0,1]) pytest.mark.parametrize("y",[2,3]) def test_foo(x,y):print("{}-{}".format(x,y))pass解读与实操 要获得多个参数化参数的所有组合&…

科学指南针助力江西高校开展《透射电子显微镜简介及案例分析课程》讲座

2023年11月,科学指南针与江西各大高校合作,共同开展了一场关于《透射电子显微镜的简介及案例分析课程》讲座。该讲座旨在加强学生对于透射电子显微镜的了解,提高他们在科学研究中的实践能力。 透射电子显微镜(简称TEM&#xff09…

【LeetCode】每日一题 2023_12_9 下一个更大的数值平衡数(枚举/打表二分)

文章目录 刷题前唠嗑题目:下一个更大的数值平衡数题目描述代码与解题思路官方解法 结语 刷题前唠嗑 LeetCode?启动!!! 题目:下一个更大的数值平衡数 题目链接:2048. 下一个更大的数值平衡数 …

C++11原子操作atomic

文章目录 原子操作atomic原子操作的相关函数原子操作的特点“平凡的”与“合格的” 原子操作atomic 前面我们介绍了互斥锁等一系列多线程相关操作,这里我们来说下原子操作atomic。 可以理解为原子变量就是将上面的操作进行了整合的一个全新变量,但是实际…

Qt 容器QGroupBox带有标题的组框框架

控件简介 QGroupBox 小部件提供一个带有标题的组框框架。一般与一组或者是同类型的部件一起使用。教你会用,怎么用的强大就靠你了靓仔、靓妹。 用法示例 例 qgroupbox,组框示例(难度:简单),使用 3 个 QRadioButton 单选框按钮,与QVBoxLayout(垂直布局)来展示组框的…

远程控制如何赋能智能制造?贝锐向日葵制造业场景案例解析

随着数字化转型在制造业的不断深入,企业在产线端也逐渐投入更多智能化设备,数字化、智能化设备其中一个比较显著的优势就是可以依托互联网实现远程运维和调试,大大提升产线设备的稳定性和工作效率;而远程调试运维一个重要的实现方…

数据表排序

指针用的有点少了&#xff0c;有点不适应 用的冒泡排序 代码如下&#xff1a; #include<stdio.h> int num[100][100]; int * p[100], jud[100]; int judge(int i, int j, int rank); int m, n, k;int main(void) {scanf("%d%d%d", &m, &n, &k);f…

飞天使-linux操作的一些技巧与知识点

命令行光标移动到行首行尾 ctrl a 跳到首 ctrl e 跳到尾/etc/passwd rpm 包格式 RPM&#xff08;Red Hat Package Manager&#xff09;是一种常用的Linux软件包管理系统&#xff0c;它使用特定的命名规则来标识和命名软件包。RPM包的名称格式通常遵循以下规则&#xff1a;…

Flutter 开发问题摘要

系统&#xff1a;MacOS 14 开发工具&#xff1a;vscode Flutter版本&#xff1a;3.16.3 1.Error: To set up CocoaPods for ARM macOS, run: 解决方式&#xff1a; 在项目的ios文件目录下面执行下面的命令&#xff1a; arch -x86_64 pod install 执行结果&#xff1a;

SVPWM原理及simulink

关注微♥“电击小子程高兴的MATLAB小屋”获得专属优惠 一.SVPWM原理 SPWM常用于变频调速控制系统&#xff0c;经典的SPWM控制主要目的是使变频器的输出电压尽量接近正弦波&#xff0c;并未关注输出的电流波形。而矢量控制的最终目的是得到圆形的旋转磁场&#xff0c;这样就要求…

pr抖音素材42个手机竖屏抖音视频转场特效PR剪辑模板

酷炫、富有创意的Premiere Pro 视频转场动画过渡效果pr模板免费下载。增强内容演示、幻灯片、抖音、社交媒体广告、预告片、促销等视频画面切换效果。 来自PR模板网&#xff1a;https://prmuban.com/36404.html

TCP对数据的拆分

应用程序的数据一般都比较大&#xff0c;因此TCP会按照网络包的大小对数据进行拆分。 当发送缓冲区中的数据超过MSS的长度&#xff0c;数据会被以MSS长度为单位进行拆分&#xff0c;拆分出来的数据块被放进单独的网路包中。 根据发送缓冲区中的数据拆分情况&#xff0c;当判断…

12.8 作业

1&#xff0c; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#…

PyQt6 QCalendarWidget日历控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计39条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

Python random模块及用法

random 模块主要包含生成伪随机数的各种功能变量和函数。 在 Python 的交互式解释器中先导入 random 模块&#xff0c;然后输入 random.__all__ 命令&#xff08;__all__ 变量代表了该模块开放的公开接口&#xff09;&#xff0c;即可看到该模块所包含的全部属性和函数&#x…

第二十一章网络通信总结

21.1 网络程序设计基础 Java网络程序设计基础涉及使用Java编程语言创建网络应用程序。这通常涉及到使用Java的网络API&#xff0c;如java.net包&#xff0c;以建立客户端和服务器之间的通信。 基本步骤包括&#xff1a; 1.创建服务器&#xff1a; 使用ServerSocket类创建服务…

Day05 linux高级系统设计 - 管道

复制文件描述符 dup函数 作用&#xff1a; 文件描述符复制 语法&#xff1a; #include <unistd.h> int dup (int oldfd); 参数&#xff1a; 所需复制得文件描述符 返回值&#xff1a; 复制到的文件描述符 功能&#xff1a; 从文件描述符表中&#xff0c;找一个最小…

SSH原理与应用与探索

Secure Shell(SSH 安全外壳协议) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议&#xff0c;可有效弥补网络中的漏洞。通…