梁春芳 宋伟伟
摘要:文章针对如何利用有符号DA算法实现FIR滤波器进行了详细的介绍,主要讨论了有符号DA算法的原理和FIR滤波器的实现。并采用VHDL语言编程来实现算法中的查表和乘累加运算。
关键词:有符号DA算法VHDLFPGAFIR滤波器
1. 引言
随着科学技术的迅速发展,数字信号处理技术的应用领域不断扩大,逐渐成为应用最广和最有潜力的技术之一。与此同时现场可编程逻辑门阵列(FPGA)也迅速的发展起来,成为了与数字信号处理密切相关的技术。数字滤波器是处理数字信号时必不可少的一部分,而FIR滤波器是其中的一种。FIR滤波器的实现方法有许多,可用DSP芯片,或者是专用的FIR滤波器集成电路(ASIC)等来实现。其中使用FPGA实现时可以在速度、设计周期和可编程性等方面有明显的优势,在FPGA实现的过程中分布式算法为乘累加运算提高了速度与此同时也节省了资源。
2. 有符號分布式FIR滤波器
2.1 有符号DA算法
数字信号处理的对象为数字信号,而处理方式可归结为一些基本的数学运算(如加法、累加、乘法、比较以及开方等运算。乘累加运算是乘法和累加运两种算的结合,其中分布式算法(DA)在乘累加运算中被广泛应用,分布式算法又分为无符号DA算法和有符号DA算法。
乘累加运算可写为 。假设c(n)为固定的常数, 为有符号数,则
其中, 表示用二进制数表示 的第b位。若令,则 。
2.2 FIR滤波器
数字滤波器分类方式有很多,其中根据系统的时域性能可分为有限脉冲响应数字滤波器(FIR)和无限脉冲响应数字滤波器(IIR)。其中IIR滤波器保留了模拟滤波器的幅度特性的特点,但是在线性相位特性方面却被忽视,为了保证滤波器有良好的线性相位特性引入了FIR滤波器。FIR滤波器的脉冲响应由有限个采样值构成。抽头数为(N)阶数为(N-1)的FIR系统的差分方程为 上式表明完成一次的滤波要进行N次的乘法和N-1次的加法运算。
2.3 有符号DA在FIR滤波器中的应用
因为 所以现假设B=5然后对x(n)进行整理
由上式可知滤波器的输出与查找表的结果有一定的关系,即查表输出右移后与反馈相加再左移,此查表方法比传统的乘累加算法省去了许多过程。
3. FIR滤波器的实现
3.1查找表的建立
由于 ,假设 、 、 , 最高为8,则建立的表如下
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
3.2 VHDL语言部分程序设计
本程序是以4位二进制的有符号数x0_in,x1_in,x2_in为例编写的,通过建立查询表来获取f(b)。并通过状态机来分别对变量和信号初始化和移位,当状态为s0时,对变量和信号初始化;当状态为s1时,对信号移位和对变量累加。其主要部分程序如下:
建立查询表:
case table_in is
when"000"=>table_out<=0; when"001"=>table_out<=-2; when"010"=>table_out<=3;
when"011"=>table_out<=1; when"100" =>table_out<=1; when"101"=>table_out<=-1;
when"110"=>table_out<=4; when"111"=>table_out<=2; When others=>table_out<=0;
end case;
初始化变量和信号(状态为s0时):
state<=s1; count:=0; p:=0; x0<=x_in0; x1<=x_in1; x2<=x_in2;
移位并累加(状态为s1时):
if count=4theny<=p;
else if count=3thenp:=p/2-table_out*8;
elsep:=p/2+table_out*8;
end if;
for k in 0 to 2 loop
x0(k)<=x0(k+1); x1(k)<=x1(k+1); x2(k)<=x2(k+1);
end loop;
count:=count+1;
end if;
4. 结束语
本文介绍了有符号DA算法实现FIR滤波器的设计过程。讲述了有符号DA算法的原理和告诉实现乘累加的原理,采用一种循环移位相加的算法来实现FIR滤波器。并用VHDL语言编程实现。FPGA的出现使具有线性相位特性的FIR滤波器的实现变得简单,而且也成为以后数字信号处理技术中不可或缺的重要部分。
5. 参考文献
[1] 《数字信号处理》(第三版) 高西全、丁玉美编著 西安电子科技大学出版社2008-08
[2] 《基于FPGA的数字信号处理》 高亚军编著 电子工业出版社 2012-02
[3]《数字信号处理的FPGA实现》 刘凌、胡永生编著清华大学出版社 2002—06