IIR滤波器的MATLAB与FPGA的设计实现

IIR滤波器的MATLAB与FPGA的设计实现

博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨询,欢迎大家前来投稿,谢谢!
在这里插入图片描述

引言

数字滤波器是数字信号系统里面最常用、最重要、最基本的元件之一。无限脉冲响应(Infinite Impulse Response,IIR)滤波器具有很高的滤波效率,在相同的幅频响应条件下,所要求的IIR滤波器阶数会明显比FIR滤波器的低。也就是说在不介意滤波器的相位,实现同等滤波性能下的IIR滤波器会比FIR滤波器更加节省电路面积,节省电路功耗。在前面的博文中介绍了FIR滤波器的设计实现,本文将介绍无限脉冲响应IIR滤波器(Infinite Impulse Response,IIR)的原理介绍,架构研究,设计实现等。

原理介绍

IIR滤波器的结构式有直接型跟级联型结构,而级联型结构的IIR滤波器更不容易受到系统的极点零点的影响。
在这里插入图片描述
从系统函数等可以总结IIR滤波器的几个显著特性就是:
(1)IIR滤波器同时存在不为零的极点和零点。要保证IIR滤波器是稳定不振荡系统,要求系统的极点必须在单位圆内,因为系统的稳定性就是由系统函数的极点决定的。
(2)由于线性相位滤波器(FIR滤波器)所有的零点和极点都是关于单位圆对称的,所有只允许极点位于单位圆的原点。由于IIR滤波器存在不为零的极点,因此只能实现近似的线性相位特性,也就是说如果电路对滤波器的线性相位要求高的话,那IIR滤波器便不可使用了。
(3)在FPGA设计IIR滤波器的时候,由于存在反馈结构,也就是y(n)一直在累加自己前面的y(n-1),这种无限脉冲响应与我们有限的寄存器长度相矛盾。所以在设计IIR滤波器,其有限字长效应是实际工程设计应该考虑的问题。
从IIR滤波器的差分方程式可以看得出,输出信号是由两部分组成的:第一部分∑x(n-i)b(i)表示对输入信号的延时组成M阶网络,其实相当于前面博文介绍的FIR滤波器的结构,实现了系统的零点。第二部分 ∑y(n-j)a(j)表示对输出信号的延迟,组成J阶网络,每阶经延时抽头后与常系数相乘,并将乘法结果相加,由于这部分是对输出延时,故为反馈网络,实现了系统的极点。
根据系统的差分方程式跟上面的分析后,例如一阶的IIR滤波器差分方程为:y(n)=b0x(n)+b1x(n-1)-a1y(n-1);其一阶系统的架构设计图可以定为以下直接型结构:
在这里插入图片描述

MATLAB设计实现

一般来说,IIR滤波器的设计方法分为三种:原型转换设计法,直接设计法以及直接调用MATLAB函数设计法。本文主要介绍的是通过matlab来实现对IIR滤波器的设计实现。在matlab里面设计数字滤波器既可以通过窗函数自己编写程序来设计IIR滤波器,也可以通过调用工具箱来设计IIR滤波器。通过编写程序来设计IIR滤波器比较普遍,滤波器的参数等改动也比较方便,与FPGA做联合功能仿真验证也方便。而直接调用工具箱就直接了当,较节省设计时间。本文将对两种方法进行介绍,一般matlab采用的几个IIR滤波器设计函数有巴特沃斯,切比雪夫,椭圆三种低通滤波器,不过本文设计采用的是切比雪夫函数来设计IIR滤波器。
一个数字滤波器的传输函数表达式为如下所示:
在这里插入图片描述
其中H(w)叫做幅频特性 ,Ψ(w)叫做相频特性。幅频特性表示信号通过该滤波器以后频率成分幅度衰减情况,而相频特性反映各频率分量通过滤波器后在时间上的延时情况。

切比雪夫低通滤波器

巴特沃斯低通滤波器的频率特性在通带和阻带内部都是随着频率单调变化的,也就是如果在通带的边缘能够满足指标,在通带的内部肯定超过设计的指标要求从而造成设计滤波器的阶数较高。如果将指标的精度要求均匀分布在整个通带内,或者在分布在阻带内,或者同时分布在通带跟阻带内,则可以设计出满足设计需要,阶数又低的滤波器了。而切比雪夫滤波器正是如此的。
MATLAB用切比雪夫函数设计滤波器的语法为:
[b,a] = cheby1(n,Rp,Wn,‘type’);
b,a :分别为滤波器的分子,分母系数因子;
n :为滤波器的设计阶数;
Rp :为滤波器在通带内的最大衰减db
Wn :为滤波器的截止频率,当Wn为[w1,w2]的向量则代表滤波器为带通滤波器;
type:指定设计的滤波器类型,为hige或者slow;
求滤波器的极点零点增益的函数语法为:
[z,p,k] = cheby1(n,Rp,Wn,‘type’);
z,p,k分别为所设计滤波器的零点,极点,增益表达式。
利用切比雪夫函数设计滤波器的matlab工程如下所示,hb,ha分别为量化后的滤波器分子,分母系数;
在这里插入图片描述
运行设计的matlab工程可以得到IIR滤波器的输出为如下图所示,及也可得到hb,ha滤波器分子分母系数;
在这里插入图片描述
在这里插入图片描述
因为滤波器的系数量化位数,运算位长,输出量化都会对滤波器的性能产生影响。所以设计的时候也应该考虑这些因素。具体这里就不做详细介绍了,因为在前面的博文FIR滤波器的设计里面已经做详细介绍了;这里只详细结果:IIR滤波器可以采用14bit的量化位数跟14bit的量化输出,这样子其滤波器性能才是最佳的。
在这里插入图片描述

tool工具箱设计法

在matlab的应用程序里面有一个filter design & analysis tool点进去即为快速设计滤波器的工具。操作界面如下图所示,较为简单不做详细介绍。
在这里插入图片描述
点analysis里面的filter coefficient即可出现设计滤波器的FIR滤波器系数,通过file-export可以把滤波器系数导出到workplace。
在这里插入图片描述

FPGA设计实现

由上面的matlab的设计可得到IIR滤波器的极点零点,如下图所示:
在这里插入图片描述
根据上面的极点零点,来设计本文的IIR滤波器的直接型结构,如下图所示:从IIR滤波器的差分方程式可以看得出,输出信号是由两部分组成的:上面部分∑x(n-i)b(i)表示对输入信号的延时组成4阶网络,其实相当于前面博文介绍的FIR滤波器的结构,实现了系统的零点。下面部分 ∑y(n-j)a(j)表示对输出信号的延迟,组成7阶网络,每阶经延时抽头后与常系数相乘,并将乘法结果相加,由于这部分是对输出延时,故为反馈网络,实现了系统的极点。
在这里插入图片描述

直接型IIR滤波器

直接型的IIR滤波器的RTL设计图如下所示,分为两部分实现pole的极点设计及zero的零点设计。
在这里插入图片描述

极点零点的设计

极点零点的设计其实都是加法器及乘法器的设计堆砌,涉及的原理基本一致,前面也在FIR滤波器一文里面详细描述了,这里不再做详细介绍,以极点的设计为例做简单描述;如下极点函数的RTL设计图所示,对零点函数模块处理后的数据,进行延迟后于相应的系数进行相乘,然后再累加,输出滤波器的数据。
在这里插入图片描述

系数乘法器的设计模块

乘法器的设计端口介绍如下图所示:
在这里插入图片描述
乘法器的设计原理介绍如下图所示,具体的乘法设计可参考之前的博客章文:基于FPGA的乘法器原理介绍及设计实现,具体博文链接为:
https://blog.csdn.net/weixin_39015789/article/details/101430566
在这里插入图片描述
最后再将所有的乘积和进行累加便是对数据流进行低通滤波后的结果了。

直接型IIR滤波器的功能仿真

下图为零点函数的功能仿真波形图,如下所示,data_in为输入的高斯白噪声,依次经过延迟存入data_mem,然后经过与系数的相乘得到data_reg,再进行累加得到零点函数的输出结果x_data。再传到极点函数模块进行处理。在这里插入图片描述
前面经过零点函数处理得到的数据x_data存入到极点函数的data_mem,与相应的系数相乘累加得到mul_sum。再经过最后的截尾处理就可以得到滤波后的最后结果dout。
在这里插入图片描述
直接型IIR滤波器的整体功能仿真波形图如下所示:
在这里插入图片描述

直接型IIR滤波器的傅里叶变换

对直接型IIR滤波器的RTL设计输出的滤波后数据进行matalb的傅里叶变换,看其设计的滤波效果如下图所示:
在这里插入图片描述

级联型IIR滤波器

级联型的IIR滤波器的RTL设计图如下所示,其实每一个级联的滤波器相当于直接型IIR滤波器的设计,只是每一个滤波器的输入都是上一个滤波器的滤波后数据输出。
在这里插入图片描述

级联型IIR滤波器的傅里叶变换

如下图所示,直接型IIR滤波器与级联型IIR滤波器的滤波效果如下所示,直接型跟级联型的滤波效果其实相当接近,但是对于系统的稳定性来说,在实际的设计应用里面应该采用级联型滤波器的设计。
在这里插入图片描述

发布了13 篇原创文章 · 获赞 38 · 访问量 3623

猜你喜欢

转载自blog.csdn.net/weixin_39015789/article/details/103807854
今日推荐