IIR滤波器
IIR滤波器原理
IIR的特点是:非线性相位、消耗资源少。
IIR滤波器的系统函数与差分方程如下所示:

由差分方程可知IIR滤波器存在反馈,因此在FPGA设计时要考虑到有限字长效应带来的影响。差分方程中包括两个部分:输入信号x(n)的M节延时网络,相当于FIR的网络结构,实现系统的零点;输出信号y(n)的N节延时网络,作为系统的反馈,实现系统的极点。
直接由差分方程得到的IIR滤波器称为直接I型结构,如下图所示,左边为零点部分,右边为极点部分:

如果由IIR的系统函数出发,视作两个系统的级联,并且合并公共的延时支路,得到的IIR滤波器称为直接II型结构,如下图所示:

很明显,直接I型结构需要2N个延时单元;直接II型结构仅需要N个延时单元,使用FPGA设计时采用直接II型结构可以节省一些资源。

级联型结构与直接型结构相比:
1.每一个级联部分中的反馈网络很少,易于控制有限字长效应带来的影响,且IIR滤波器的阶数一般较小。
2.便于准确实现数字滤波器的零/极点,每一级分开调整。
3.运算速度快;占用资源少(除法采用移位)。
4.若除法采用移位,每一级都需要用近似移位实现除法运算,与理想误差较大。
IIR滤波器设计
设计一个4阶IIR低通滤波器,采样频率为8MHz,截至频率为2MHz,阻带衰减为40dB,滤波器量化位数12bits。

级联设计
第一级滤波器
其中系数乘法用移位和加法代替,有利于减少乘法器资源。
module FirstTap (rst,clk,Xin,Yout);input rst; //复位信号,高电平有效input clk; //FPGA系统时钟,频率为2kHzinput signed [11:0] Xin; //数据输入频率为2kHZoutput signed [11:0] Yout; //滤波后的输出数据//零点系数的实现代码///将输入数据存入移位寄存器中reg signed[11:0] Xin1,Xin2;always @(posedge clk or posedge rst)if (rst)//初始化寄存器值为0beginXin1 <= 12'd0;Xin2 <= 12'd0;end elsebeginXin1 <= Xin;Xin2 <= Xin1;end//采用移位运算及加法运算实现乘法运算wire signed [23:0] XMult0,XMult1,XMult2;assign XMult0 = {{6{Xin[11]}},Xin,6'd0}+{{7{Xin[11]}},Xin,5'd0}-{{11{Xin[11]}},Xin,1'd0}; //*94assign XMult1 = {{5{Xin1[11]}},Xin1,7'd0}+{{9{Xin1[11]}},Xin1,3'd0}+{{10{Xin1[11]}},Xin1,2'd0}; //*140 (2^7+ 2^3 + 2^2)assign XMult2 = {{6{Xin2[11]}},Xin2,6'd0}+{{7{Xin2[11]}},Xin2,5'd0}-{{11{Xin2[11]}},Xin2,1'd0}; //*94//对滤波器系数与输入数据乘法结果进行累加wire signed [23:0] Xout;assign Xout = XMult0 + XMult1 + XMult2;//极点系数的实现代码///wire signed[11:0] Yin;reg signed[11:0] Yin1,Yin2;always @(posedge clk or posedge rst)if (rst)//初始化寄存器值为0beginYin1 <= 12'd0;Yin2 <= 12'd0;endelsebeginYin1 <= Yin;Yin2 <= Yin1;end//采用移位运算及加法运算实现乘法运算wire signed [23:0] YMult1,YMult2;wire signed [23:0] Ysum,Ydiv;assign YMult1 = {{2{Yin1[11]}},Yin1,10'd0}+{{5{Yin1[11]}},Yin1,7'd0}+{{6{Yin1[11]}},Yin1,6'd0}-{{11{Yin1[11]}},Yin1,1'd0}-{{12{Yin1[11]}},Yin1}; //*1213=1024+128+64-2-1assign YMult2 = {{4{Yin2[11]}},Yin2,8'd0}+{{9{Yin2[11]}},Yin2,3'd0}+{{10{Yin2[11]}},Yin2,2'd0}; //*268=256+8+4//第一级IIR滤波器实现代码///assign Ysum = Xout+YMult1-YMult2; assign Ydiv = {{11{Ysum[23]}},Ysum[23:11]};//2048//根据仿真结果可知,第一级滤波器的输出范围可用9位表示assign Yin = (rst ? 12'd0 : Ydiv[11:0]);//增加一级寄存器,提高运行速度reg signed [11:0] Yout_reg ;always @(posedge clk)Yout_reg <= Yin;assign Yout = Yout_reg;endmodule
第二级滤波器
module SecondTap (rst,clk,Xin,Yout);input rst; //复位信号,高电平有效input clk; //FPGA系统时钟,频率为2kHzinput signed [11:0] Xin; //数据输入频率为2kHZoutput signed [11:0] Yout; //滤波后的输出数据//零点系数的实现代码///将输入数据存入移位寄存器中reg signed[11:0] Xin1,Xin2;always @(posedge clk or posedge rst)if (rst)//初始化寄存器值为0beginXin1 <= 12'd0;Xin2 <= 12'd0;end elsebeginXin1 <= Xin;Xin2 <= Xin1;end//采用移位运算及加法运算实现乘法运算wire signed [23:0] XMult0,XMult1,XMult2;assign XMult0 = {{1{Xin[11]}},Xin,11'd0}; //*2048assign XMult1 = {{4{Xin1[11]}},Xin1,8'd0}+{{6{Xin1[11]}},Xin1,6'd0}+{{10{Xin1[11]}},Xin1,2'd0}; //*324=256+64+4assign XMult2 = {{1{Xin2[11]}},Xin2,11'd0}; //*2048//对滤波器系数与输入数据乘法结果进行累加wire signed [23:0] Xout;assign Xout = XMult0 + XMult1 + XMult2;//极点系数的实现代码///wire signed[11:0] Yin;reg signed[11:0] Yin1,Yin2;always @(posedge clk or posedge rst)if (rst)//初始化寄存器值为0beginYin1 <= 12'd0;Yin2 <= 12'd0;endelsebeginYin1 <= Yin;Yin2 <= Yin1;end//采用移位运算及加法运算实现乘法运算wire signed [23:0] YMult1,YMult2;wire signed [23:0] Ysum,Ydiv;assign YMult1 = {{1{Yin1[11]}},Yin1,11'd0}-{{5{Yin1[11]}},Yin1,7'd0}-{{9{Yin1[11]}},Yin1,3'd0}-{{10{Yin1[11]}},Yin1,2'd0}-{{12{Yin1[11]}},Yin1}; //*1907=2048-128-8-4-1assign YMult2 = {{2{Yin2[11]}},Yin2,10'd0}+{{5{Yin2[11]}},Yin2,7'd0}+{{8{Yin2[11]}},Yin2,4'd0}+ {{11{Yin2[11]}},Yin2,1'd0}+{{12{Yin2[11]}},Yin2}; //*1171=1024+128+16+2+1//第一级IIR滤波器实现代码///assign Ysum = Xout+YMult1-YMult2; assign Ydiv = {{11{Ysum[23]}},Ysum[23:11]};//2048//根据仿真结果可知,第一级滤波器的输出范围可用9位表示assign Yin = (rst ? 12'd0 : Ydiv[11:0]);//增加一级寄存器,提高运行速度reg signed [11:0] Yout_reg ;always @(posedge clk)Yout_reg <= Yin;assign Yout = Yout_reg;endmodule
顶层模块
module IIRCas (rst,clk,Xin,Yout);input rst; //复位信号,高电平有效input clk; //FPGA系统时钟,频率为8MHzinput signed [11:0] Xin; //数据输入频率为8MHZoutput signed [11:0] Yout; //滤波后的输出数据//实例化第一级滤波器运算模块wire signed [11:0] Y1;FirstTap U1 (.rst (rst),.clk (clk),.Xin (Xin),.Yout (Y1));//实例化第二级滤波器运算模块SecondTap U2 (.rst (rst),.clk (clk),.Xin (Y1),.Yout (Yout));endmodule
仿真结果
FIR和IIR比较

参考:
如何快速设计一个IIR滤波器
相关文章:
IIR滤波器
IIR滤波器原理 IIR的特点是:非线性相位、消耗资源少。 IIR滤波器的系统函数与差分方程如下所示: 由差分方程可知IIR滤波器存在反馈,因此在FPGA设计时要考虑到有限字长效应带来的影响。差分方程中包括两个部分:输入信号x(n)的M节…...
【QT】使用qml的QtWebEngine遇到的一些问题总结
在使用qt官方的一些QML的QtWebEngine相关的例程的时候,有时在运行会报如下错误: WebEngineContext used before QtWebEngine::initialize() or OpenGL context creation failed 这个问题在main函数里面最前面加上: QCoreApplication::setAttr…...
230902-部署Gradio到已有FastAPI及服务器中
1. 官方例子 run.py from fastapi import FastAPI import gradio as grCUSTOM_PATH "/gradio"app FastAPI()app.get("/") def read_main():return {"message": "This is your main app"}io gr.Interface(lambda x: "Hello, …...
Ubuntu本地快速搭建web小游戏网站,公网用户远程访问【内网穿透】
文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网:我们通常说的是互联网&am…...
【LeetCode-中等题】199. 二叉树的右视图
文章目录 题目方法一:层序遍历取每一层最后一个元素方法二:深度优先搜索 题目 方法一:层序遍历取每一层最后一个元素 // 方法一 :层序 集合(取每层子集合最后一个元素)// List<List<Integer>> Rlist new ArrayList…...
【调试经验】Ubuntu22.04 安装和配置MySQL 8.0.34
本文共计1469字,预计阅读时间5分钟 在安装新版本的MySQL到电脑时,按着网上一些教程执行发现错误繁多,最后索性自己摸索并把服务装好了。自己也整理了一下在操作时的笔记,上传上来希望能帮助到大家。 目录 正文 安装MySQL 配置…...
Android 使用OpenCV实现实时人脸识别,并绘制到SurfaceView上
1. 前言 上篇文章 我们已经通过一个简单的例子,在Android Studio中接入了OpenCV。 之前我们也 在Visual Studio上,使用OpenCV实现人脸识别 中实现了人脸识别的效果。 接着,我们就可以将OpenCV的人脸识别效果移植到Android中了。 1.1 环境说…...
【自然语言处理】关系抽取 —— GDPNet 讲解
GDPNet 论文信息 标题:GDPNet: Refining Latent Multi-View Graph for Relation Extraction 作者:Fuzhao Xue, Aixin Sun, Hao Zhang, Eng Siong Chng 期刊:AAAI 2021 发布时间与更新时间:2020.12.12 主题:自然语言处理、关系抽取、对话场景、BERT、GCN arXiv:[2012.0678…...
【小沐学NLP】Python使用NLTK库的入门教程
文章目录 1、简介2、安装2.1 安装nltk库2.2 安装nltk语料库 3、测试3.1 分句分词3.2 停用词过滤3.3 词干提取3.4 词形/词干还原3.5 同义词与反义词3.6 语义相关性3.7 词性标注3.8 命名实体识别3.9 Text对象3.10 文本分类3.11 其他分类器3.12 数据清洗 结语 1、简介 NLTK - 自然…...
Angular安全专辑之三 —— 授权绕过,利用漏洞控制管理员账户
这篇文章是针对实际项目中所出现的问题所做的一个总结。简单来说,就是授权绕过问题,管理员帐户被错误的接管。 详细情况是这样的,我们的项目中通常都会有用户身份验证功能,不同的用户拥有不同的权限。相对来说管理员账户所对应的…...
使用Sumo以及traci实现交叉口信号灯自适应控制
使用Sumo以及traci实现交叉口信号灯自适应控制 文章目录 使用Sumo以及traci实现交叉口信号灯自适应控制 使用Sumo以及traci实现交叉口信号灯感应控制一、什么是交叉口感应控制二、Traci中的感应控制实现流程1.感应控制逻辑2.仿真过程 使用Sumo以及traci实现交叉口信号灯感应控制…...
自定义类型:结构体、枚举、联合
目录 结构体 结构体的基础知识 结构的声明 特殊的声明 结构体的自引用 结构体变量的定义和初始化 结构体内存对齐 修改默认对齐数 结构体传参 位段 什么是位段 位段的内存分配 位段的跨平台问题 位段的应用 枚举 枚举类型的定义 枚举的优点 联合体(共…...
如何使用ZIP方式安装MySQL:简单、快速、高效的安装方法
下载MySQL的zip文件:从官方网站 https://dev.mysql.com/downloads/mysql/ 下载适用于您的操作系统的MySQL zip压缩包。 版本介绍(zip一般选第ZIP Archive版本) “Windows (x86, 64-bit), ZIP Archive” 是MySQL的发布版本,提供了MySQL服务器和相关的工具…...
python嵌套循环
在 Python 中,你可以使用嵌套循环来创建双循环,也就是一个循环包含在另一个循环中。通常有两种类型的双循环:嵌套循环和同时迭代多个迭代器的循环。我会详细说明这两种情况。 1. 嵌套循环: 嵌套循环是指一个循环嵌套在另一个循环…...
一文速学-让神经网络不再神秘,一天速学神经网络基础(五)-最优化
前言 思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,…...
【AWS实验】 配置中转网关及对等连接
文章目录 实验概览目标实验环境任务 1:查看网络拓扑并创建基准任务 2:创建中转网关任务 3:创建中转网关挂载任务 4:创建中转网关路由表任务 4.1:创建路由表关联任务 4.2:创建路由传播 任务 5:更…...
47、springboot 的 国际化消息支持--就是根据浏览器选择的语言,项目上的一些提示信息根据语言的选择进行对应的显示
springboot的国际化也是基于spring mvc 的。 springboot 的 国际化消息支持–就是根据浏览器选择的语言,项目上的一些提示信息根据语言的选择进行对应的显示。 总结下国家化自动配置: 功能实现就是: 比如一个登录页面,我们在浏览…...
重要变更 | Hugging Face Hub 的 Git 操作不再支持使用密码验证
在 Hugging Face,我们一直致力于提升服务安全性,因此,我们将修改 Hugging Face Hub 的 Git 交互认证方式。 从 2023 年 10 月 1 日 开始,我们将不再接受密码作为命令行 Git 操作的认证方式。我们推荐使用更安全的认证方法…...
为什么删除Windows 11上的Bloatware可以帮助加快你的电脑速度
如果你感觉你的电脑迟钝,彻底清除软件会有所帮助,而且这个过程对Windows用户来说越来越容易。 微软正在使删除以前难以删除的其他预装Windows应用程序成为可能。专家表示,这项新功能可能会改变用户的游戏规则。 科技公司Infatica的主管Vlad…...
PCL点云处理之计算两条直线间最短连线的端点 (二百零三)
PCL点云处理之计算两条直线间最短连线的端点 (二百零三) 一、算法目的二、具体实现1.代码2.结果一、算法目的 条件:给定两条直线,直线采用直线上一点和直线方向来确定 要求:求两条直线间的最短连线线段,获取它的两个端点 具体的算法实现如下,提供了示例直线和计算结果进…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
