基于DA算法的FIR滤波器设计与实现时间:2007-09-04来源:作者:张大智张望牟志新点击:680字体大小:【大中小】1.引言在数字信号处理系统中,FIR数字滤波器多采用专用DSP芯片(如TMS320CXX系列),这种基于DSP的处理系统存在很多优点,比如方案灵活、可操作性强、程序易于移植。但这种结构的滤波器多是根据FIR滤波器的数据移位相乘累加的算法编写相应软件,利用软、硬件相互结合完成滤波器的设计。由于软件运行时,指令都是串行执行的,这严重制约了系统的运行速率,不能满足高传输速率,大数据吞吐量的数字信号的实时性处理要求。而基于DA算法的FPGA滤波器则是一种采用纯硬件的方式实现FIR滤波器的方式,这种方法突出的优点是运算速度快,特别适合在高速、实时、快变的数字信号处理要求。2.DA算法的基本思想第一个讨论分布式算法(distributedarithmetic,DA)的可以追溯到1973年Cr0iCroisier的一篇论文,并由Peled和Liu来推广。但是直到FPGA出现以后,才在FPG计算乘积和中被广泛地应用。在FPGA芯片设计中,分布式算法(distributedarithmetic,DA)是一种很重要的技术。它在乘积和的计算中已被广泛应用,为了理解DA算法设计原理,我们考虑有一个线性时不变网络的输出可以用下式表示:假设系数c[n]是已知常数,x[n]是变量,在有符号DA系统中假设变量x[n]的表达式如下:其中xb[n]表示x[n]的第b位,即x[n]是x第n个样点。所以,内积y可以表示为:我们重新分别求和次序(这就是分布式算法的由来),结果是:y=(c[0]xB-1[0]+c[1]+⋯⋯+c[N-1]xB-1[N-1])2B-1+(c[0]xB-2[0]+c[1]+⋯⋯+c[N-1]xB-2[N-1])2B-2(2-4)...+(c[0]x0[0]+c[1]x0[1]+c[N-1]x0[N-1])20用更紧凑的形式表示为:从(2—4)式可以发现,分布式算法是一种以实现乘加运算为目的的运算方法。它与传统算法实现乘加运算的不同在于执行部分积运算的先后顺序不同。分布式算法在实现乘加功能时,是通过将各输入数据的每一对应位产生的部分积预先进行相加形成相应的部分积,然后再对各个部分积累加而得到最终的结果,而传统算法是等到所有乘积已经产生之后再来相加完成乘加运算的。与传统串行算法相比,分布式算法可极大地减少硬件电路的规模,提高电路的执行速度。3.基于DA算法的FIR数字滤波器的硬件实现由上面分析可以知道,对于任何一个线性时不变网络总可以将它转换成式(2-5)那样的形式,FIR滤波器是一个很典型的线性时不变网络,它的表达式是:我们可以将它转化成下面这样的形式:在本系统中,采用的是8位输入,所以B=8则:线性相位FIR滤波器满足系数对称条件,本系统设计的系统为16阶,那么它的系数关于h[7]偶对称,即有:h[n]=h[16-1-n]=h[15-n](3-4)由式(3-3)和(3-4)可得到实现系统硬件框图如图3-1:4.系统的VHDL描述4.1顶层模块设计Libraryieee;Useieee.std_logic_1164.a11;Useieee.std_logic_unsigned.all;EntityFIRisPort(x:instd_logic_vector(7downto0);clk:instd_logic;y:outstd_logic_vector(7downto0));endFIR;architecturebehaveofFIRiscomponentlpfirport(in:instd_logic_vector(7downto0);clk:instd_logic;out:outstd_logic_vector(7downto0));endcomponent;beginprocess(clk)beginu1:lpfirportmap(x,clk,y);endprocess;endbehave;4.2LUT查询表ROM的建立用MIF文件格式编辑的ROM初始化值WIDTH=16DEPTH=16ADDRESS_RADIX=HEX;DATA_RADIX=HEX;CONTENTBEGIN0:0000;1:0045;2:00E6;⋯⋯F:0000;END;4.3滤波器系数的设计我们利用matlab自带的滤波器设计工具FDAtool和信号处理工具Pstool设计出一个16阶窗函数FIR低通滤波器。它的具体参数是:窗函数类型:Blackman窗,信号采样频率:50KHz,通带截至频率10KHz,滤波系数h[n]见下表1,该滤波器的传输特性如下图4-1所示:5.系统的仿真与结果分析为了验证与检测该系统的效果,我们采用Cyclone公司EP1C6Q240C8芯片对系统进行了开发,并通过ALTERA公司的综合设计工具QuartusII4.2对该系统进行了综合编译与仿真,我们对该系统连续输入了16个数据(0.3,0.32,-0.79,0.45,-0.87,-0.91,-0.12,0.89,0.37,0.66,-0.57,0.75,-0.21,0.96,0.56,-0.19)进行处理,得到了如下仿真结果。5....