基于FPGA的IIR数字滤波器设计Word格式文档下载.docx
《基于FPGA的IIR数字滤波器设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的IIR数字滤波器设计Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
由IIR数字滤波器的
阶差分方程
(2)式可知,设
=
=2,则网络结构如图1所示。
x(n)
a0
b1
a2
b0
a1
y(n)
z-1
图1直接型结构
2IIR数字滤波器的设计方法
IIR数字滤波器的设计方法通常有模拟转换法、零极点累试法和优化设计法。
1.IIR数字滤波器的模拟转换设计法
利用模拟滤波器成熟的理论和设计方法来设计IIR数字滤波器是经常使用的方法。
设计过程是:
按照技术要求设计一个模拟滤波器,得到滤波器的传输函数
,再按一定的转换关系将
转换成数字滤波器的系统函数
。
将传输函数
从s平面转移到z平面的方法有多种,但工程上常用的是脉冲响应不变法和双线性变换法。
2.IIR数字滤波器的零极点累试法
上述介绍的模拟转换设计法实际上是数字滤波器的一种间接设计方法,而且幅度特性受到所选模拟滤波器特性的限制。
例如巴特沃斯低通幅度特性是单调下降,而切比雪夫低通特性带内或带外有上、下波动等,对于要求任意幅度特性的滤波器,则不适合采用这种方法。
下述介绍的在数字域直接设计IIR数字滤波器的设计方法,其特点是适合设计任意幅度特性的滤波器。
在IIR数字滤波器的直接设计法中零极点累试法较为常用,设单位脉冲响应的零极点表达式为:
(3)
按照(3)式,系统特性取决于系统零极点的分布,通过分析,我们知道系统极点位置主要影响系统幅度特性峰值位置及其尖锐程度,零点位置主要影响系统幅度特性的谷值位置及其凹下的程度;
且通过零极点分析的几何作图法可以定性地画出其幅度特性。
上面的结论及方法提供了一种直接设计滤波器的方法。
这种设计方法是根据其幅度特性先确定零极点位置,再按照确定的零极点写出其系统函数,画出其幅度特性,并与希望的进行比较,如不满足要求。
可通过移动零极点位置或增加(减少)零极点,进行修正。
3.优化设计法
IIR数字滤波器除模拟转换设计法和零极点累试法外,还有一种直接在频域或者时域中进行设计,联立方程后需要计算机作辅助运算的方法,即所谓的优化设计法。
3IIR数字滤波器的硬件实现方案
滤波器的实现主要包括两大类:
DSPTMS320系列芯片的实现和ISP器件的实现(主要包括FPGA和CPLD)。
其中利用DSPTMS320系列芯片实现滤波时速度较慢,而利用ISP器件实现时,其运算速度比DSP器件要快好多倍。
FPGA的实现包括其自带的核的实现方法和自编程实现方法。
核的实现方法虽然好用并且结构缜密,但一般情况下使用的权限都会受到注册购买的限制,因此基于FPGA的自编程实现方法成了滤波器实现的首选。
以下简要介绍IIR数字滤波器的设计方案和基于FPGA的实现方法。
1.方案一:
直接相乘累加式
对于二阶的IIR数字滤波器,其传递函数为:
(4)
滤波器信号流图见图1,在第n时刻,
是当时的输入样本;
是n时刻的IIR滤波器的输出:
(5)
因此,可以用硬件乘法器和硬件加法器来实现乘法和加法。
由式(5)可以看出,按照这种设计方法,要用到5个乘法器和6个加法器。
对于FPGA的设计来说,这种方法的缺点是比较耗费资源。
2.方案二:
基于ROM查表法的VHDL结构化设计
采用ROM查表的方法,主要是为了避免使用硬件乘法器。
二阶IIR的一般表示形式为:
(6)
其中
是输入序列,
是输出序列,
和
是系数。
假设输入序列
为
位2的补码,并以定点表示,并
<
1,对于
(7)
式中:
表示
的第
位,上标为0的是符号位,因此可以定义一个5bit为变量的函数
为:
(8)
由此可以得到:
(9)
由于
函数仅有32种可能取值,因此可以设计一个32*b位的ROM构成的如图2描述的基于ROM的实现结构。
数据输入
串行移入SR1和SR2,由抽头处得到
,每计算出一个
值后,便并行加载到SR3中,然后串行移入SR4,并在抽头处得到
ROM的输入地址由
组成。
按此方法设计的优点是避免了占主要运算量的乘法运算,节省了FPGA的硬件资源,缺点与FIR滤波器利用ROM方法设计相同,即使用不够灵活。
当系数发生变化时,更改ROM内的数据十分不便,特别是当阶数比较大时,ROM内的数据较多,程序外的运算量也很大,修改数据更为不便。
图2ROM查表法实现框图
3.方案三:
基于ROM查表法的改进型设计
此方法结合了直接相乘累加式和ROM查表法的优点,使得设计灵活,设计周期短,节省资源。
(10)
这里
设输入序列
(11)
(12)
同理可得:
(13)
(14)
令
,可以推出:
(15)
从式(15)中可以看出,可以用一个五路8位*1位乘法器在8个时钟周期内实现上述算式。
其加法可以直接调用软件的库实现。
本方案实现结构如图3所示。
图3改进型实现框图
图3中的
作为FPGA接口上的A/D器件的转换数据输入寄存器,各寄存器内的数据与各自的系数的最高位相乘后,送入累加器相加,并且其和向左移一位,以实现乘2运算。
下一个时钟,寄存器内数据与其系数的次高位相乘,再送入累加器与其数据相加,再左移一位。
接下的6个时钟进行类似的操作。
第8个时钟后,累加器将其数据输出,即
,并对累加器清零,同时将
寄存器数据送入
寄存器,将
寄存器,同理,
接着再进行下一次运算。
对上述三种方法相比较而言,方案三实现较为方便简洁,在节省了FPGA硬件资源的同时,使得设计灵活,设计周期大为缩短,故本设计在方案三为基础上作改进后,来实现IIR数字滤波器的。
二、模块的建模、设计
1时序控制模块的设计与仿真结果分析
时序控制模块主要用来产生对其它模块的时序控制信号。
模块的符号如图4所示,输入信号CLK是时钟信号,RES是复位信号,CLK_REG及CLK_REGBT是输出信号。
图4时序控制模块图
图5时序控制模块仿真图
时序控制模块仿真如图5所示,其中counter为程序内部计数信号,在clk的上升延到来时,counter以6个时钟为周期开始进行计数,clk_regbt每隔6个时钟输出一个低电平,clk_reg则每隔6个时钟后输出一个高电平。
输出的两个时钟信号正好控制延时模块、补码乘加模块和累加模块的模块的运行。
符合设计要求。
时序控制模块程序见附录。
2延时模块的设计与仿真结果分析
延时模块的符号如图6所示,其主要作用是在clk时钟作用下将差分方程的各x、y值延迟一个时钟,以实现一次延时运算,即当输入为xn和yn时,经过一次延时后其输出分别为x(n-1)和y(n-1).其中yout是反馈输入信号,xn是输入信号。
图6延时模块图
图7延时模块仿真图
延时模块仿真图如图7所示,由图3-4可以看出当输入的xn、yout都为
时,在时钟信号上升沿的作用下产生延时,经第一个时钟后x0、x1、x2、y0、y1的值分别为1,0,0,1,0。
经第二个时钟后x0、x1、x2、y0、y1的值分别为2,1,0,2,1。
经第三个时钟后x0、x1、x2、y0、y1的值分别为3,2,1,3,2。
经第四个时钟后......由此可见该模块仿真值正确。
延时模块程序见附录。
3补码乘加模块的设计与仿真结果分析
补码乘加模块主要用来实现输入序列
与系数
分别相乘后再相加的过程。
即实现
的算法。
为了避免过多地使用乘法器,本设计中乘加单元(MAC)的乘法器采用阵列乘法器,以提高运算速度。
由于MaxplusⅡ的LPM库中乘法运算为无符号数的阵列乘法,所以使用时需要先将两个补码乘数转换为无符号数相乘后,再将乘积转换为补码乘积输出[5]。
每个二阶节完成一次运算共需要6个时钟周期,而且需采用各自独立的MAC实现两级流水线结构,即每个数据经过两个二阶节输出只需要6个时钟周期。
模块的符号如图8所示。
图8补码乘加模块图
图9补码乘加模块仿真图
补码乘加模块仿真图如图9所示,clk_regbt及clk_reg为输入时钟,由时序控制模块提供。
为系数,x0、x1、x2、y0、y1为输入信号,yout为输出信号,图3-3(b)中75为x0、x1、x2、y0、y1的值15和系数
相乘后再相加的结果,完成了补码乘加的功能。
补码乘加模块程序见附录。
4累加模块的设计与仿真结果分析
补码乘加模块所输出的信号送入累加器后,与寄存于累加器中的上一步计算的中间结果相加,最后将此步的计算结果经由输出引脚输出,所得信号即为最终结果。
即该模块主要实现youtput=yout+youtput(n-1)的算法,模块的符号如图10所示。
图10累加模块图
图11累加模块仿真图
累加模块仿真图如图11,其中res为复位信号,clk为时钟信号,yout为输入信号,由补码乘加模块的输出信号yout提供,由图中可以看出当输入信号为yout=
,输出为youtput=
,实现了累加的功能。
累加模块程序见附录。
三、顶层架构及仿真
1顶层模块设计
顶层模块设计采用了原理图输入方法,原理图输入方式非常直观,便于信号观察和电路的调节。
图12顶层模块图
本文设计的顶层文件名为iir.gdf,设计生成的逻辑符号如图3-5所示。
顶层模块设计程序见附录。
四、IIR数字滤波器的仿真与结果分析
1IIR数字滤波器的系统设计
IIR数字滤波器顶层原理图如图13所示。
为了便于理解整个系统的设计,现将系统的运行过程进行说明:
图13IIR数字滤波器顶层原理图
系统先开始处于初始状态,当清零信号为“1”时,对整个系统进行清零。
在清零信号为“0”的前提,时序控制模块在时钟clk上升沿的作用下产生两个信号CLK_REG及CLK_REGBT,其中CLK_REG信号用来作为延时模块、补码乘加模块和累加模块的输入时钟,CLK_REGBT每隔6个时钟产生一个高电平作为这三个模块的复位信号。
延时模块在接收