1fir滤波器的原理与设计方法
1.1fir滤波器的原理
fir滤波器的数学表达式为:
式中:n为fir滤波器的抽头数;x(n)为第n时刻的输入样本;h(k)为fir滤波器第k级抽头系数。
直接型fir滤波器结构如图1所示。
由图1可见,fir的滤波过程就是一个信号逐级延迟的过程,将各级的延迟输出加权累加,即得到fir的输出,其中最主要的算法是乘累加运算。由于fir每完成一次滤波过程就需要进行n次乘法和n-1次加法操作,所以fir滤波的运算量完全依赖于n的大小。
1.2分布式fir滤波器设计
分布式算法(distributedarithmetic,da)早在1973年就已经被croisier提出,直到现场可编程门阵列(fieldprogrammablegatear-ray,fpga)的查找表(lookuptable,lut)结构出现,这种算法才重新受到重视,其主要原理如下。
为了分析简单,将fir滤波器的表达式(1)改写为:
可见,分布式算法是一种以实现乘-加单元为目的的优化解决方案。利用一个查找表(lut)实现映射,即用一个2k字宽(即2k行),预先编好程序中lut接收到的一个k位输入向量xb=[x0b,x1b,megawizard向导生成所需的模块,其界面如图2所示。
选择图中左侧arithmetic中的lpm_mult得到图3的界面,根据技术指标选择合适的参数,即可生成乘法器模块,按其向导,完成乘法器参数的设置(如乘数的位数,是否有符号数相乘等)。加法器模块的构造类似,不再详述。
以本文设计的fir滤波器为例(后面详述),输入信号的速率为2mhz(周期为500ns),滤波器的阶数为64阶,由此构造了8个乘法器(最多可以构造25个),分8次完成所有的乘法。相对分布式算法的流水速度而言,构造的乘法器完成一次乘法需要20ns,相对耗时长一点,但是完成8次乘法也只需8×20=160ns,小于输入信号一个周期的时间,因此满足设计需求。将输入数据的一个周期平均分为8个时间块,每个时间内的fir滤波设计模块的框图如图4所示。
其他7个时间块内的fir滤波器模块同图4,所不同的是参与乘法运算的信号输入数据和滤波器抽头系数不同,分别从x(n-8)到x(n-63)和h(8)到h(63)。待8个乘加模块的结果均送入寄存器后,再在最后一个时间块内完成累加得到最终的输出(相对乘法运算而言,完成累加的时间可以忽略),其实现框图如图5。
结合图4和图5,可全部完成基于lpm参数化宏功能模块的fir滤波器设计。由两图可以发现,有多个全加器,且输入数据的位数(bit数)不同,只要调节lpm宏功能模块的参数即可方便地完成设计,输出数据y(n)的位数则根据工程需要取最终累加结果的高12位。取高12位带来的误差为(最高位为符号位,不予数值考虑),这是可以接受的误差。
2基于matlab和quartusⅱ的fir滤波器设计
2.1利用matlab进行滤波器系数设计
设计指标:采样频率为2mhz,f1=200khz,f2=330khz,通带衰减1db,阻带衰减70db。通过参数指标确定所需的阶数和参数值,部分程序如下:
由图6验证设计指标。
如果设计指标不满足,则可通过调整滤波器参数直至满足设计要求。
2.2利用quartusⅱ进行设计和仿真
对matlab产生的fir滤波器抽头系数,用quartusⅱ进行仿真。quartusⅱ软件是altera公司主推的fgpa设计软件,是集设计输入、编译、综合、仿真、布线、下载于一体的设计软件。由于matlab产生的滤波器抽头系数为小数,根据工程需要将其转换为18位二进制系数使用。过程如下:
由matlab产生的fir数字滤波器系数如下:
按第2.3节提出的方法在quartusⅱ中完成fir滤波器的设计,通过编译综合功能对设计文件进行编译和综合,然后生成顶层模块,见图7。
通过quartusⅱ的波形仿真功能,对其进行波形仿真并进行定量分析。波形仿真如图8所示。其中,cp50为系统时钟,由它控制输入信号xin_data的输入速率(本例为2mhz)。data_result为滤波器未经取高位处理的乘加结果;data_result_out,为最终滤波输出结果。经验证,data_result与matlab的运算结果一致,data_result可满足工程精度的要求。
原文标题:fir滤波器原理与设计方法,如若转载,请注明出处:https://www.saibowen.com/news/7517.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「赛伯温」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。