需要注意的是,本次所要讲的内容是内插滤波器(Interpolated FIR,IFIR)的FPGA实现 ,而不是我们熟知的插值滤波器(Interpolaton FIR)。
首先来介绍一下内插滤波器的结构原理和作用。内插滤波器(IFIR)和传统的 FIR 滤波器或者插值滤波器有类似的结构,唯一的区别就是将单位延迟替换为了 k -1个延迟单元,其中 k 称为 0填充因子。 这种结构的滤波器在功能上相当于在原型滤波器的系数集的系数之间插入了k-1个零。内插滤波器的最终的数据输出采样率与输入数据采样率一致,而不改变数据采样率。所以内插滤波器(Interpolated FIR,IFIR)对于实现窄带滤波器和宽带滤波器的高效实现是非常有用的。用内插滤波器实现普通窄带FIR滤波器或者宽带FIR滤波器的时候能够节省非常可观的DSP资源。下面是Xilinx 用户手册关于该滤波器的简介,如图1所示。
图 1
该内插滤波器在实现时,Xilinx FPGA开发环境中已经集成了该内插滤波器IP核类型可供我们选择。在指定IFIR体系结构时,在coefficient文件中提供了完整的原型系数集,而不包含零填充因子所暗示的零。零填充因子是通过过滤器用户界面定义的,如图2所示。图 2
在Xilinx平台实现该内插滤波器时可以通过IP来实现,但是在Intel的Quartus开发环境中没有集成该IP,要想实现该结构的滤波器需要手动的方式编写的方式实现该内插滤波器。
因此本文通过Verilog的代码来进行设计实现。设计的内插滤波器工作时钟为300MHz,数据采样率为150MHz,原型滤波器的抽头数为83阶。内插4倍相当于在每个抽头之间插入3个0,相当于328阶的效果。与其他类型的插值滤波器一样,插值会产生镜像频谱。由于工作时钟是数据采样率的两倍,因此可以考虑对乘法器进行复用,可以节省一半的DSP资源。最终只使用21个DSP即可实现。如图3所示。图3
这里我设计了一种高通滤波器方案,先通过Matlab设计需要的高通滤波器,并导出抽头系数进行量化为16bit。然后如图4所示。
图4
这里我们是通过对称加法树结构来进行编写Verilog代码,并对加法树的输出进行分组复用。部分代码如图5所示。
图5
最终通过输入一组点频数据源通过Modelsim仿真可以得到输出的结果。如图6所示。对Modelsim仿真输出的数据进行Matlab画图可以得到内插滤波器的频谱响应为,图7所示。
图7
此时通过频谱图我们可以得知,数据经过4倍内插滤波器之后,输出的数据产生了镜像频谱,后续可以通过叠加滤波器的方式来进行滤除,并可以根据你所需要的效果定制所需的滤波器结构。
下次我们分享一下,通过这种内插滤波器的方式设计其他宽带滤波器的方案,该种设计方案使得我们能够采用最少的DSP资源获得与高阶滤波器等效的效果。