IIR滤波器

这篇具有很好参考价值的文章主要介绍了IIR滤波器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

IIR滤波器原理

IIR的特点是:非线性相位、消耗资源少。

IIR滤波器的系统函数与差分方程如下所示:

IIR滤波器,农夫笔记,fpga开发

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

直接由差分方程得到的IIR滤波器称为直接I型结构,如下图所示,左边为零点部分,右边为极点部分:

IIR滤波器,农夫笔记,fpga开发

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

很明显,直接I型结构需要2N个延时单元;直接II型结构仅需要N个延时单元,使用FPGA设计时采用直接II型结构可以节省一些资源。
IIR滤波器,农夫笔记,fpga开发

级联型结构与直接型结构相比:

1.每一个级联部分中的反馈网络很少,易于控制有限字长效应带来的影响,且IIR滤波器的阶数一般较小。

2.便于准确实现数字滤波器的零/极点,每一级分开调整。

3.运算速度快;占用资源少(除法采用移位)。

4.若除法采用移位,每一级都需要用近似移位实现除法运算,与理想误差较大。

IIR滤波器设计

设计一个4阶IIR低通滤波器,采样频率为8MHz,截至频率为2MHz,阻带衰减为40dB,滤波器量化位数12bits。

IIR滤波器,农夫笔记,fpga开发

级联设计

第一级滤波器

其中系数乘法用移位和加法代替,有利于减少乘法器资源。

module FirstTap (
	rst,clk,Xin,
	Yout);
	
	input		rst;   //复位信号,高电平有效
	input		clk;   //FPGA系统时钟,频率为2kHz
	input	 signed [11:0]	Xin;  //数据输入频率为2kHZ
	output signed [11:0]	Yout; //滤波后的输出数据
	
	//零点系数的实现代码/
	//将输入数据存入移位寄存器中
	reg signed[11:0] Xin1,Xin2;
	always @(posedge clk or posedge rst)
		if (rst)
			//初始化寄存器值为0
			begin
				Xin1 <= 12'd0;
				Xin2 <= 12'd0;
		   end	
		else
		   begin
				Xin1 <= 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};        //*94
	assign 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)
			//初始化寄存器值为0
			begin
				Yin1 <= 12'd0;
				Yin2 <= 12'd0;
			end
		else
		   begin
				Yin1 <= 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-1
	assign 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系统时钟,频率为2kHz
	input	 signed [11:0]	Xin;  //数据输入频率为2kHZ
	output signed [11:0]	Yout; //滤波后的输出数据
	
	//零点系数的实现代码/
	//将输入数据存入移位寄存器中
	reg signed[11:0] Xin1,Xin2;
	always @(posedge clk or posedge rst)
		if (rst)
			//初始化寄存器值为0
			begin
				Xin1 <= 12'd0;
				Xin2 <= 12'd0;
		   end	
		else
		   begin
				Xin1 <= Xin;
				Xin2 <= Xin1;
			end
			
   //采用移位运算及加法运算实现乘法运算
	wire signed [23:0] XMult0,XMult1,XMult2;
	assign XMult0 = {{1{Xin[11]}},Xin,11'd0};    //*2048
	assign XMult1 = {{4{Xin1[11]}},Xin1,8'd0}+{{6{Xin1[11]}},Xin1,6'd0}+{{10{Xin1[11]}},Xin1,2'd0};  //*324=256+64+4
	assign 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)
			//初始化寄存器值为0
			begin
				Yin1 <= 12'd0;
				Yin2 <= 12'd0;
			end
		else
		   begin
				Yin1 <= 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-1
	assign 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系统时钟,频率为8MHz
	input	 signed [11:0]	Xin;  //数据输入频率为8MHZ
	output 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滤波器,农夫笔记,fpga开发

参考:

如何快速设计一个IIR滤波器文章来源地址https://www.toymoban.com/news/detail-691576.html

到了这里,关于IIR滤波器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 滤波器设计:FIR和IIR高、低、带通滤波器的实现及Matlab代码

    滤波器设计:FIR和IIR高、低、带通滤波器的实现及Matlab代码 引言: 滤波器作为信号处理中非常重要的一部分,广泛应用于数字信号处理、音频处理、图像处理等领域。本文主要讨论FIR(有限长冲激响应)和IIR(无限长冲激响应)两种常见滤波器的设计及其实现。 FIR滤波器

    2024年02月09日
    浏览(44)
  • 【数字信号处理2】IIR 滤波器设计

    1.掌握冲激响应法和双线性变换法设计IIR滤波器的原理及具体设计方法,熟悉用双线性设计法设计低通、带通和高通IIR数字滤波器的计算机程序; 2.熟悉模拟Butterworth滤波器的设计,掌握冲激响应法和双线性变换法设计数字IIR滤波器的方法。 1、不同阶次模拟巴特沃兹滤波器的

    2024年02月05日
    浏览(50)
  • 嵌入式常用的算法 - 二阶IIR低通滤波器

    二阶IIR低通滤波算法是一种电路模拟滤波器,它通过将高频部分的信号衰减来消除噪声。这种滤波器使用了二阶差分方程来描述信号的变化,因此被称为二阶IIR低通滤波器。 具体来说,二阶IIR低通滤波器通过将高频部分的信号衰减来消除噪声。高频部分的信号是指频率高于截

    2023年04月08日
    浏览(40)
  • 数字信号处理实验:IIR数字滤波器设计及软件实现

    目录 一、实验目的 二、实验原理 三、实验设备 四、实验内容及步骤 五、实验结果及分析 六、实验主程序框图及程序清单 七、实验总结 熟悉用双线性变换法设计IIR数字滤波器的原理与方法; 学会调用MATLAB信号处理工具箱中滤波器设计函数(或滤波器设计分析工具FDATool)设

    2024年02月12日
    浏览(43)
  • 数字信号处理第四次试验:IIR数字滤波器设计及软件实现

    为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正! (1)熟悉用双线性变换法设计IIR数字滤波器的原理与方法; (2)学会调用MATLAB信号处理工具箱中滤

    2024年02月08日
    浏览(44)
  • CIC滤波器:原理、设计与FPGA开发

    CIC滤波器,全称为累积积分器滤波器(Cascaded Integrator-Comb Filter),是一种数字滤波器,通常在信号处理和通信系统中使用。本文将详细介绍CIC滤波器的原理、设计方法以及如何在FPGA上实现。 一、CIC滤波器原理 CIC滤波器由级联的积分器和组合器组成,其中积分器用于对输入信

    2024年02月04日
    浏览(53)
  • 在FPGA开发板上实现一个自适应滤波器,只需要输入于扰信号和期望信号(混合信号)即可得到滤波输出

    基于FPGA的自适应滤波器FIR IIR滤波器LMS NLMS RLS算法 FxLMS 分数阶 2023年H题 本设计是在FPGA开发板上实现一个自适应滤波器,只需要输入于扰信号和期望信号(混合信号)即可得到滤波输出,使用非常简单。 可以根据具体需要对滤波器进行定制,其他滤波器如FIR IIR滤波器等也可以制

    2024年03月18日
    浏览(74)
  • FPGA设计FIR滤波器低通滤波器,代码及视频

    名称:FIR滤波器低通滤波器 软件:Quartus 语言:Verilog/VHDL 本资源含有verilog及VHDL两种语言设计的工程,每个工程均可实现以下FIR滤波器的功能。 代码功能: 设计一个8阶FIR滤波器(低通滤波器),要求截止频率为20KHz,使用线性相位结构。 参数设计方法: 使用matlab软件设计滤

    2024年02月08日
    浏览(53)
  • 基于FPGA的FIR滤波器的实现(5)— 并行结构FIR滤波器的FPGA代码实现

    并行结构,并行实现滤波器的累加运算,即并行将具有对称系数的输入数据进行相加,而后采用多个乘法器并行实现系数与数据的乘法运算,最后将所有乘积结果相加输出。这种结构具有最高的运行速度,因不需要累加运算,因此系数时钟频率可以与数据输出时钟频率保持一

    2024年02月03日
    浏览(56)
  • (三)FPGA实现滤波器

     DDS:直接数字式频率合成器,可以根据需求产生不同频率和相位的正弦波数据,通常用于通信系统中的调制解调。 配置过程: 【IP CATALOG】à【modulation DDS complier】 Configuration Options Phase generator and SIN COS LUT 相位和查找表(本实验中选这个) Phase Generator only 只产生相位 SIN CO

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包