【FPGA】FIR数字滤波器设计心得

发布时间 2023-11-27 19:14:07作者: Baiyug

【FPGA】FIR数字滤波器设计心得

0 前言

学校的课程设计要求设计FIR滤波器,FPGA芯片是Xilinx的Artix 7,板卡是依元素科技有限公司做的拓展板,2017年的,目前搜不到了,估计是被迭代了。

本文作为课程设计的复盘和总结。

1 FIR滤波器设计

1.1 原理

输入输出特性: FIR(Finite Impulse Response)滤波器是其冲激响应为有限长度的滤波器,针对因果离散时间的N阶滤波器,输出序列的每一个值都是最近输入的加权和:

\[y[n]=h_0x[n]+h_1x[n-1]+···+h_Nx[n-N]=\sum_{i=1}^Nh_i x[n-i] \]

线性相位: 当FIR滤波器的抽头系数具有对称性(奇对称/偶对称)时,FIR滤波器的相频响应具有线性特征,即输入信号的各组份频率之间的相位关系经过滤波器后不发生改变。
线性相位FIR滤波器的系数存在四种情况,如下图(h[k]为抽头系数,M为阶数):

1.1 一般结构框图

1.2 简单分析

FIR滤波器的十分简单,从输入输出方程来看就是系数h和输入x之间的卷积操作,拆解开来就是,存储,相乘,相加。

1.2.1 存储

  • 对于M阶FIR滤波器,需要M+1个寄存器来暂存M+1个输入数据,并且这M+1寄存器需要组成一个FIFO。
  • 对于M阶FIR滤波器,需要M+1个寄存器来存储M+1个抽头系数,系数决定了滤波器的截止频率,通带特性等等。

1.2.2 相乘

相乘很简单,在verilog中就是两个寄存器值的相乘,值得一提的是,如果系数符合对称特性,我们可以通过对称式结构设计来减少一半的相乘操作,此外,还可以减少一半的抽头系数的存储。

1.2.3 相加

累加操作是比较消耗时间的,需要加的数越多,消耗的时钟周期就越多。一半单纯的累加,x个数据需要消耗x-1个时钟周期来完成,本次使用的是喜闻乐见的所谓多级流水线累加,即增加并行的加法语句,同周期内尽可能增加加法语句来缩短消耗的时间,代价是增加了相关的资源消耗。

1.3 设计结构框图

以阶数N=16为例,如图

以上是一个16阶的对称式FIR设计图,总的来讲,对于偶数阶N的FIR滤波器设计,需要N+1个移位寄存器暂存连续数据,需要N/2+1个乘法器用于数据相乘运算,以及若干加法器用于数据的累加,累加的结果即为FIR滤波的输出结果。

2 模数转换

2.1 ADC10080

ADC10080是板卡上的ad芯片型号,速率最高80MSPS,数字位宽10bits,并行输出。该芯片的理论输入电压规范是1.45V offset,2.00Vpp,输出数据符合Offset Binary格式,即输出数字为非负数,输入电压最小值对应0000000000,输出电压最大值对应1111111111 。

2.2 DAC900

DAC900是板卡上的da芯片型号,速率最高165MSPS,数字位宽10bits,并行输入。该芯片的理论输入数据是标准正二进制编码。需要留意,该芯片的Bit1管脚数据位是MSB(Most Significant Bit),即最高位。

3 系数生成

系数使用matlab的filter designer辅助设计并量化。

4 仿真

仿真输入数据为7.5MHz和250KHz的叠加波,具体滤波效果如下.
低通:

高通:

5 实测

低通:

高通:

6 尚留疑问

对于128阶的FIR滤波器,我发现滤波器的过渡带宽比较大,从通带到阻带大概有几百KHz,在不增加阶数的条件下,如何减小过渡带宽是一个问题。

参考资料:
https://blog.csdn.net/k331922164/article/details/117536723
https://www.runoob.com/w3cnote/verilog-fir.html