1 引 言
目前FIR滤波器的实现方法主要有3种:利用单片通用数字滤波器集成电路、DSP器件和可编程逻辑器件实现。单片通用数字滤波器使用方便,但由于字长和阶数的规格较少,不能完全满足实际需要。使用DSP器件实现虽然简单,但由于程序顺序执行,执行速度必然不快。
FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,相对于串行运算为主导的通用DSP芯片来说,其并行性和可扩展性更好。但长期以来,FPGA一直被用于系统逻辑或时序控制上,很少有信号处理方面的应用,其原因主要是因为在FPGA中缺乏实现乘法运算的有效结构。本文利用FPGA乘累加的快速算法,可以设计出高速的FIR数字滤波器,使FPGA在数字信号处理方面有了长足的发展。
2 Matlab设计滤波器参数
利用Matlab为设计FIR滤波器提供的工具箱,选择滤波器类型为低通FIR,设计方法为窗口法,阶数为16,窗口类型为Hamming,Beta为0.5,Fs为8.6 kHz,FC为3.4 kHz,导出的滤波器系数如下:
3 快速FIR滤波器算法的基本原理
(1) 分布式算法
分布式算法在完成乘加功能时是通过将各输入数据每一对应位产生的部分积预先相加形成相应的部分积,然后再对各部分积进行累加得到最终结果。
对于一个N(N为偶数)阶线性相位FIR数字滤波器,输出可由式(1)表示:
(2) 乘法器设计
高性能乘法器是实现高性能的FIR运算的关键,分析乘法器的运算过程,可以分解为部分积的产生和部分积的相加两个步骤。部分积的产生非常简单,实现速度较快,而部分积相加的过程是多个二进制数相加的加法问题,实现速度通常较慢。解决乘法器速度问题,需要分别从这两个方面入手,减小部分积的个数,提高部分积相加运算的速度。
3.1 Booth算法
Booth算法针对二进制补码表示的符号数之间的相乘,即可以同时处理二进制正数/负数的乘法运算。Booth算法乘法器可以减少乘法运算部分积个数,提高乘法运算的速度。
下面讨论一个M b×N b乘法器基本单元的设计。设乘数为A,为M比特符号数,2的补码表示,相应各比特位的值为ai(i=0,1,…,M-2,M-1),用比特串可表示为:
A=aN-1aN-2…a2a1a0 (2)
设被乘数为B,为N比特符号数,2的补码表示,相应各比特位的值为bi(i=0,1,…,N-2,N-1),用比特串可表示为:
B=bN-1bN-2…b2b1b0 (3)
MacSoley提出了一种改进Booth算法,将需要相加的部分积数减少为一半,大大提高了乘法速度。改进Booth算法对乘数A中相邻3个比特进行编码,符号数A可表示为:
因此,应用改进Booth算法的乘法器运算过程仍然包括Booth编码过程,即部分积产生过程和部分积相加过程。所不同的是,其产生的部分积个数减少到原来的一半。