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滤波器

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift 中的动态成员查找

文章目录 前言基础介绍基础示例1. 定义一个动态成员访问类&#xff1a;2. 访问嵌套动态成员&#xff1a; 使用 KeyPath 的编译时安全性KeyPath 用法示例KeyPath 进阶使用示例1. 动态访问属性&#xff1a;2. 结合可选属性和 KeyPath&#xff1a;3. 动态 KeyPath 和字典&#xff…

文本标注技术方案(NLP标注工具)

Doccano doccano 是一个面向人类的开源文本注释工具。它为文本分类、序列标记和序列到序列任务提供注释功能。您可以创建用于情感分析、命名实体识别、文本摘要等的标记数据。只需创建一个项目&#xff0c;上传数据&#xff0c;然后开始注释。您可以在数小时内构建数据集。 支持…

深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

目录 Docker 和 k8s 简介1、kubernetes 组件及其联系1.1 Node1.2 Pod1.3 Service 2、安装docker3、单节点 kubernetes 和 KubeSphere 安装3.1 安装KubeKey3.2 安装 kubernetes 和 KubeSphere3.3 验证安装结果 4、集群版 kubernetes 和 KubeSphere 安装5、kubectl 常用命令6、资…

如何在小红书进行学习直播

诸神缄默不语-个人CSDN博文目录 因为我是从B站开始的&#xff0c;所以一些直播常识型的东西请见我之前写的如何在B站进行学习直播这一篇。 本篇主要介绍一些小红书之与B站不同之处。 小红书在手机端是可以直接点击“”选择直播的。 文章目录 1. 电脑直播-小红书直播软件2. 电…

每日一题 1921. 消灭怪物的最大数量

难度&#xff1a;中等 思路&#xff1a; 已知速度和距离&#xff0c;可求时间必定先消灭时间最短的怪物求得时间数组排序&#xff0c;只要在第 i 秒时&#xff0c;time[i] > i &#xff0c;那么就可以消灭第 i 个怪物 代码&#xff1a; class Solution:def eliminateMax…

deque容器

1 deque容器基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector区别&#xff1a; vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度回比vector快vector访问…

如何利用开源工具搭建AI大模型底座

开源社区是技术发展的一个重要部分&#xff0c;对于AI大模型来说&#xff0c;也是如此。 我们在这篇文章中来尝试通过开源工具来构建AI大模型的底座&#xff0c;涉及到的技术包括&#xff1a; LangchainOpenAIFlowiseLocalAILlama 使用Langchain构建第一个对话应用 如果你使…

udig下载、安装及汉化,生成geoserver图层样式sld文件

uDig是一款开源免费的桌面地理信息系统框架软件。uDig汉化版主要采用RCP技术构建&#xff0c;内置的多专业的水文工具&#xff0c;拥有复杂专业的分析能力&#xff0c;既可以作为独立程序运行&#xff0c;还可以作为插件使用。 uDig是一个 open source (EPL and BSD) 桌面应用程…

java线程状态

图形说明: Thread.State源码注释: public enum State {/*** 新生状态&#xff1a;线程对象创建&#xff0c;但是还未start()*/NEW,/*** 线程处于可运行状态&#xff0c;但是这个可运行状态并不代表线程一定在虚拟机中执行。* 需要等待从操作系统获取到资源(比如处理器时间片…

数据艺术:精通数据可视化的关键步骤

数据可视化是将复杂数据转化为易于理解的图表和图形的过程&#xff0c;帮助我们发现趋势、关联和模式。同时数据可视化也是数字孪生的基础&#xff0c;本文小编带大家用最简单的话语为大家讲解怎么制作一个数据可视化大屏&#xff0c;接下来跟随小编的思路走起来~ 1.数据收集和…

Sublime Text汉化,主打简单明了

在Sublime中设置中文的步骤如下&#xff1a; 1.打开Sublime Text&#xff0c;使用快捷键ShiftCtrlP&#xff08;MacOS下cmdShiftP&#xff09;&#xff0c;弹出查找栏。 2.在搜索框中输入关键字"install"&#xff0c;出现下拉选项&#xff0c;点击选择其中的"P…

音频——I2S 标准模式(二)

I2S 基本概念飞利浦(I2S)标准模式左(MSB)对齐标准模式右(LSB)对齐标准模式DSP 模式TDM 模式 文章目录 I2S format时序图逻辑分析仪抓包 I2S format 飞利浦 (I2S) 标准模式 数据在跟随 LRCLK 传输的 BCLK 的第二个上升沿时传输 MSB&#xff0c;其他位一直到 LSB 按顺序传传输依…