靳鹏
(中国电子科技集团公司第二十研究所,西安 710068)
作为数字信号处理中常用的一种基本处理模块,数字滤波器在数字信号处理中有着重要地位。相比模拟滤波器,数字滤波器具有精度高、稳定性好、设计灵活等优点,可以实现模拟器件很难达到的严格线性相位关系,还能避免模拟滤波器难以克服的温度漂移、电压漂移和噪声等问题。常用的数字滤波器有FIR(Finite Impulse Response)滤波器和IIR(Infinite Impulse Response)滤波器。FIR滤波器在满足设计要求的幅频响应的同时,还可以保证严格的线性相位特性。并且,由于采用非递归结构,不论在理论上还是在实际的有限精度运算中都是稳定的。因此,在通信、模式识别、图像处理、频谱分析等领域都得到了广泛的应用[1]。
FIR滤波器的实现方法主要有以下几种:专用数字滤波器集成电路、DSP和可编程逻辑器件。其中,FPGA的并行处理结构和可编程特性,可以兼顾处理的实时性和设计的灵活性要求,使其成为实现FIR滤波器的优良载体,得到了广泛应用[2]。
目前,基于FPGA实现FIR滤波器主要有乘累加结构和分布式算法结构。乘累加结构需要使用乘法器,在乘法器资源较为紧张的情况下使用会受到限制;分布式算法利用查找表将固定系数的乘累加操作转换成查找表操作,减少了乘法器资源的消耗。本文基于分布式算法设计了一个低通 FIR滤波器,并在FPGA上实现了该滤波器。
分布式算法(Distributed Arithmetic,DA),最早由Croisier于1973年提出,是一种专门针对乘加运算的技术,广泛应用于卷积、相关等乘积和计算中[3]。FIR滤波器是一个标准的乘加运算,采用分布式算法来实现FIR滤波器可以很方便地实现流水线处理,提高电路的运行速度,减小电路规模。不同于传统乘加算法,分布式算法在完成乘加运算时,通过将输入数据每一个对应位产生的积预先进行相加形成相应的部分积,然后再对各部分积进行累加得到最终结果。
一个典型的乘加运算可以用式(1)表示:
式(1)中, Ak为常数,xk(n)为输入变量。xk(n)可以用B位二进制补码进行表示:
式(2)中,xb(n)表示 x(n)的第b位,xB(n)是符号位。将式(2)带入式(1)可得:
图1 DA算法实现结构框图
由式(3)可以看出,这一表达式是将一个输入项是常数的乘累加运算操作转换为查找表操作和累加,用查找表实现一个映射,然后再将此映射经过相应的二次幂加权,即可得到输出结果,其实现结构框图如图1所示。
一个N阶FIR滤波器的数学表达式如式(4)所示:
式中, ()yn为滤波器在n时刻的输出; ()xn为滤波器的采样输入; ()hk为滤波器系数, ()xnk-为经过k阶延迟的采样输入。其中滤波器系数 ()hk为常数,这样就可以将式(4)转换为式(3)所示的结构,利用分布式算法来进行运算,实现对输入数据的滤波处理。
在设计时,首先根据系统具体性能指标要求,生成相应的滤波器系数,之后按照表1构造一个查找表,该表中存储着式(3)中乘积项所有可能的组合值。通过所有输入变量相对应位的组合向量对该表进行寻址,并对输出结果按照图1所示进行二次幂加权累加,即可得到滤波器输出结果。
在FPGA中,表1可以通过寄存器或者Rom来实现。查找表的深度与滤波器阶数N相关,当阶数较大时,查找表的规模将很庞大,会消耗过多资源,并影响运行速度,不利于实现。为了减小规模,可以对查找表进行分割,利用部分表计算。由于FIR滤波器是线性滤波器,因此可以对低阶滤波器的输出进行相加,从而得到高阶滤波器的输出。
在使用FPGA实现时,可以将整个滤波器划分为以下三个模块:状态控制模块、输入数据处理模块和数据累加模块,如图2所示。
图2 滤波器实现结构框图
各个模块的功能如下:
状态控制模块用来产生其它模块的控制信号,实现对输入数据处理,滤波器系数读取和数据累加的控制,使各个模块能按照一定的时序执行各自的功能,完成滤波。
表1 查找表构造规则
输入数据处理模块的主要功能是完成对输入信号的处理,包括对输入数据的串并转换,移位寄存,为后续的处理做准备。
数据累加模块的主要功能是根据控制信号实现对数据的累加输出。
本文基于分布式算法,设计了一个低通FIR滤波器,并在 FPGA中实现了该滤波器。在设计时,首先使用MATLAB中的滤波器设计工具,设计生成一组滤波器系数,并根据表1进行查找表的构造。之后在Xilinx公司的vivado编译设计工具中按照图2所示的结构框图实现该滤波器,并完成仿真验证。图3和图4分别是在vivado中的仿真结果和将处理数据导入MATLAB中进行验证的结果。
图3 vivado中仿真结果
图4 MATLAB中仿真验证结果
本文就 FPGA 器件实现 FIR 数字滤波器进行了研究,基于分布式算法设计了一个FIR滤波器,并在FPGA中实现了该滤波器,经过仿真验证,符合设计预期。分布式算法是实现常系数乘累加运算的高效方法,FPGA内部有丰富的查找表和存储器资源,非常适合来实现分布式算法,将二者结合起来可以有效应用于FIR滤波器的设计实现