数字滤波器设计之思路或vhdl_第1页
数字滤波器设计之思路或vhdl_第2页
数字滤波器设计之思路或vhdl_第3页
数字滤波器设计之思路或vhdl_第4页
数字滤波器设计之思路或vhdl_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 11.2 FIR数字滤波器设计FIR数字滤波器主要用来实现信号预处理、防混叠、带选、抽选/插补、滤波和视频卷积等功能的,以下简要介绍其结构原理和设计方案。 11.2.1 FIR滤波器结构与原理简要N阶的FIR滤波器系统的传递函数为 (11-1)它有N-1阶极点在z=0处,有N-1个零点位于有限z平面的任何位置。式(11-1)的系统差分方程表达式为 (11-2)式(11-2)就是输入序列x(n)与单位冲击响应h(n)的线性卷积。由式(11-2)可知n时刻的输入y(n)仅于n时刻的输入以及过去N-1个输入值有关。可以直接画出其网络结构,如图11-2所示,这种结构称直接型。如果FIR滤波器的单位冲

2、击响应h(n)对称,例如单位冲击响应h(n)满足: 图 11-2 0,1, (11-3)则该因果系统具有严格的线性相位。当为偶数时,式(11-2)可化为 (11-4)把式(11-3)代入式(11-4)得 (11-5) 图 11-3把式(11-5)画成网络结构,如图11-3。同理,当为奇数时,式(11-2)可化为(11-6)把式(11-6)画成网络结构,如图11-4。设计FIR滤波器的方法有窗函数法、频率取样法和等波纹优化设计法等。窗函数法是最简单的设计方法,也称为傅里叶级数法。先给定所要求的理想滤波器频率响应,要求设计一个FIR滤波器频率响应来逼近。但设计是在时域进行的,因而先对进行傅里叶反变

3、换得到: (11-7) 图 11-4由于是矩形频率特性,故一定是无限长的序列,且是非因果的,而要图 11-4设计的是FIR滤波器,其必然是有限长的序列,所以要用有限长的来逼近无限长的,最有效的方法是截断,或者用一个有限长的窗口函数序列来截取,即: (11-8)因而窗口函数序列的形状及长度的选择就很关键。窗口函数主要有以下几种:矩形窗:汉宁(Hanning)窗: (11-9)海明(Hamming)窗,又称为升余弦窗: (11-10)它是汉宁窗的改进,可以得到旁瓣更小的效果。布拉克曼(Blackman)窗,又称二阶升余弦窗: (11-11) 在这个窗函数中加上了二次谐波分量,可以进一步抑制旁瓣。另

4、外还有凯泽窗和三角窗等。11.2.2 FIR滤波器设计方案确定FIR滤波器的实现方案可以有多种,有的在速度上有优势,有的在资源上占优势,有的则在结构上占优势,以下介绍几种方案,以作比较选择。1. 方案一 图11-5 FIR滤波器设计方案一这个方案利用了具有严格线性FIR滤波器的单位冲击响应的对称特性,对图11-2所示的直接型结构进行简化,得到如图11-3和图11-4所示的结构。这样就可以减少一半的乘法运算,节省相当一部分资源。具体结构如图11-5所示(由图11-4的结构而来),运算采用并行方式进行。但是这种结构只能被采用在M为偶数时,当M为奇数时,则必须换用类似于图11-3的结构。可见这种结构

5、对于固定参数的FIR滤波器比较适合,对于参数可变的FIR滤波器就不大适用了。2方案二此方案就是引用如图11-2所示的直接型,它没有经过任何化简,运算也是采用并行的方式进行,设计结构如图11-6所示。这种方案速度快,通用性强,适合于参数可变的FIR滤波器;但是对于实现N阶8位的FIR滤波器,要有N个88个乘法器,从而占用大量的资源,对于资源相对紧张的FPGA来说,采用这种方案不够实际。图11-6 FIR滤波器设计方案二3方案三为了能使FPGA实现可变参数的FIR滤波器,要求其网络结构必须是通用型的,而且不能使用过多的运算,以利节省逻辑资源。基于这点,方案三在方案二的基础上进行改进,网络结果仍采用

6、直接型,在进行乘法运算时,用串行乘法来代替并行乘法,这样以牺牲时间为代价换得尽可能少的占用资源。其中的的串行乘法器是用次移位相加的方式实现的。以下是串行乘法的推导:图11-7 串行乘法器模块图假设数据、是两个位的乘数,是乘积,其中表示乘数的第位数据,则有: 乘法器结构如图11-7所示。这一方案总体上是可行的,只是其中的个乘法器仍占用了较多的资源。4方案四方案四与前3个方案有较大的不同,它不采用乘法器进行乘法运算,而是采用乘法表,用查表来得到两数相乘的积,即把两乘数作为ROM的地址,对应单元的数据就是该两乘数的乘积(ROM是事先按这种运算法则做好的)。总体结构如图11-8所示,其中从乘法表出来的

7、乘积为 图11-8 FIR滤波器设计方案四这个方案设计的滤波器速度快、精度高、结构简单,对于数据位数少,参数固定的FIR滤波器非常适用。但对于数据位数多,参数可变的滤波器就不大合适了。这是因为数据位数多和参数不固定都会使乘法表的容量变大,大容量的ROM必须外加,而且更改和外部设置也很不方便。5方案五方案一采用对称结构,没有通用性;方案二直接用并行乘法器进行计算,占用了大量资源;方案三用串行乘法器代替并行乘法器,在使用方面是改善了,但是,它是以牺牲时间为代价的,降低了速度,而且其中的N个串行乘法器也占用不少资源;方案四,对于数据位数少、参数固定的FIR滤波器非常合适,但对于参数不定的FIR滤波器

8、就不大适用。与前4种方案比,方案五有了较好的改进,此方案以方案三为基础,在其中的加法器和N个串行乘法器上进行了改进,基本原理如下:假设滤波器是N阶的,数据是W位,则系统差分方程表达式:可表示为 (11-12)由式(11-12)得出该方案的结构,其中的用串行时序来实现,用移位(左移)寄存器来完成,用N个位选1W乘法器来实现,用加法树来实现,结构如图11-9所示。其中的表示的乘积,乘法器是位选1W乘法器。当然,要实现这一方案还需一个总控制器来协调各部件的运行,使之按规定时序正常运行,完成FIR滤波器算法。以下具体介绍方案五的实现方法。图11-9 FIR滤波器设计方案五11.2.3 FIR滤波器主系

9、统设计以下就11阶8位低通滤波器为对象,介绍FIR滤波器的实现:由截止频率为1kHz,采样频率为10kHz计算得到11阶FIR滤波器的单位脉冲响应序列h(n)如表11-3所示。 表11-3 11阶FIR滤波器的单位脉冲响应序列h(n)原值乘1024 十六进制二进制h(0)、h(10)00 00H00000000h(1)、h(9)0.046847.923 30H00110000h(1)、h(9)0.046847.923 30H00110000h(2)、h(8)0.1010103.424 67H01100111h(3)、h(7)0.1515155.136 9bH10011011h(4)、h(6)0

10、.1872191.692 c0H11000000h(5)0.2001204.902 cdH11001101现以表11-3中的单位脉冲响应序列为参数来设计FIR滤波器,它的主体部分由总控制器、加法树、移位累加器、移数寄存器和位选18乘法器5个部件组成。下面分别介绍各部件的实现。1总控制器的实现 根据方案五的滤波器的总体结构,要求总控制器有接收复位信号、产生移数时钟、产生运算控制时钟等功能。这必须要用一个计数器来控制时序。FIR滤波器是8位的,所以完成一次序列运算要经过8个运算控制时钟脉冲,再加一个移数时钟脉冲,总共是9个时钟脉冲周期,所以要用一个9进制计数器。总控制器部件的主程序如下:Clk_r

11、egbt=not clk and clk_en; -作为运算控制时钟Clk_reg=not clk and not clk_en; -作为移数时钟Process(clk,res) Beginif(res=1)then -进行复位操作counter=0;count_bt=0;elsif(clkevent and clk=1)then -时钟的上升沿if(counter8)then -前8个时钟周期里完成以下操作clk_en=1; -运算控制时钟使能counter=counter+1; -计数器加计数count_bt=count_bt-1; -计数器减计数else -第9个时钟完成以下操作ount

12、er=0; count_bt=0; clk_en=0;end if;end if;end process;图 11-10在上面这段程序中,信号clk是全局时钟,即系统工作时钟;信号res是系统复位信号,在这里作为计数器清零信号;这里产生的信号counter和count_bt的数据类型是整数,counter用来记录时序,9个时钟为一个周期,count_bt在位选乘法器中作位选信号;信号clk_regbt和clk_reg也是在这里产生的,clk_regbt作为运算控制时钟,使运算部件按时序进行运算,clk_reg作为移数时钟,在运算时,也有控制的作用。这些信号所起的作用将分散在各部件中介绍。这些信

13、号的时序主要是由一个进程来实现的,在这个进程中,系统工作时钟clk和复位信号res作为敏感信号,这个进程的功能是在前8个时钟周期里,count_bt减法计数,运算控制时钟使能信号clk_en为高电平,第9个时钟周期clk_en为低电平。clk_en在进程外面用来控制clk_regbt和clk_reg的输出,在程序中用的是not clk而不是直接用clk是因为这样可以巧妙地避开clk_en的延时而产生的时钟错位。总的时序仿真如图11-10所示。2移数寄存器的实现这一部件的任务是,在一次序列运算结束后,原先存放x(n-N+1)的寄存器存入x(n-N+2),而原先存放x(n-N+2)的寄存器存入x(

14、n-N+3),原先存放x(n)的寄存器存入由端口进来的新数据,相当于x序列向前移了一个数,从寄存器组中移出去一个数,同时移进一个新的数,主程序如下:process(clk_reg,clr,res)beginif(res=1 or clr=1)then -以下进行清零操作for I in 0 to 10 loopreg_xn(i)=00000000;end loop;elsif(clk_regevent and clk_reg=0)then-当移数时钟下降沿来时移数for I in 10 to 1 loop reg_xn(i)=reg_xn(i-1);end loop;reg_xn(0)=dat

15、a_xn; -新数移进来end if;end process;这个部件用一个进程来实现,reg_xn是数组,在这里可以理解为位寄存器组,它有11个单元,每个单元存放一个8位的数据。当清零信号或复位信号为高电平时,寄存器组清零;当清零信号和复位信号都为低电平,且当移数时钟信号clk_reg的下降沿来时,x序列向寄存器组深处移一个数,原先最深那个单元reg_xn(10)里的数据被移走,第一个reg_xn(0)里的数据由端口来的数据data_xn来代替;clk_reg为低电平时,寄存器组里的数据供位选18乘法器调用。3位选18乘法器的实现这个部件的任务是,当运算控制时钟信号来时,数据h(n)的相应位

16、与x(n)相乘,并把结果送给加法树。主程序如下:process(clk)beginif(clkevent and clk=0)then -系统时钟的下降沿for I in 0 to 10 loop -完成位选相乘if (reg_hn(i)(count_bt)=1)then -选中的位为1 add_xn(i)=reg_xn(i); -积为reg_xn(i)else -选中的位为1add_xn(i)=00000000; -积为00000000end if;end loop;end if;end process;这个部件也是采用一个进程来实现的,这个进程的敏感信号是系统时钟clk,而不是运算控制时钟

17、clk_regbt。这是因为clk_regbt是由clk产生的,之间有一定的延时,clk的下降沿刚好落在clk_regbt上升沿的前面(见图11-10),在这个时候进行位选乘法,可以和后面的加法树(clk_regbt上升沿进行运算)很好地衔接。这里的reg_hn和add_xn的数据类型和reg_xn的数据类型一样是数组,这里也可以理解为寄存器组。reg_hn寄存的是h(n)序列,add_xn寄存的是h(n)的指定位与x(n)的乘积。这里的位选直接由信号count_bt进行。语句reg_hn(i)(count_bt)就是表示寄存器组reg_hn的第i+1个单元的数据的第count_bt位,即h(

18、i)的第count_bt位,在一个运算周期里,count_bt由7到0共8个值,h(i)的8位相继与x(i)相乘,并把结果送给加法树。4加法树的实现 图11-11 加法树加法树实际上就是多个数据同时相加的一种结构,即把所有加数两个一组分别进行相加(各组同时进行),然后所有和两个一组进行相加,直到只剩余下一个数,它就是所有加数的和。这样把全并行的多个数相加,转换成串并结合的结构(如图11-11 所示),在速度和资源上进行折中,其结果是速度上影响不大,而资源却节省了许多,这正是采用加法树的主要原因,其程序见移位累加器部分。5移位累加器部分移位累加器的功能是完成式(11-12)中的,它将加法树得出的

19、结果 进行逐个累加移位,其结构见图11-9,相当于在一个运算周期里使左移了次,即乘上其权重,程序如下:process(clk_regbt,clk_reg,clr,set)beginif(clr=1 or set=1) then-清零sum 0);data_yn 0);elsif(clk_reg=1)then-运算结束data_yn=result(18 downto 11); -结果输出sum0); -累加器清零elsif(clk_regbt=1)then -运算控制时钟为 -高电平时进行以下的加法树运算sum91=add_xn(0)+add_xn(1);sum92=add_xn(2)+add_

20、xn(3);sum93=add_xn(4)+add_xn(5);sum94=add_xn(6)+add_xn(7);sum101=sum91+sum92;sum102=sum93+sum94;sum11=sum101+sum102;sum=result+sum11; -把加法树结果进行累加elseresult=sum(17 downto 0)&0; -把累加结果左移end if;end process; 在这段程序里,用一个进程完成,其中表示第个运算控制时钟信号来时,处理的位选乘法器出来的结果。当清零信号来时,累加器清零,否则,当移数时钟信号来时,累加器结果的高8位输出,累加器清零。否则当运算

21、控制时钟为高电平时,进行一次加法树运算并把结果累加,当运算控制时钟为低电平时,把累加器结果左移一位。 以上5个部件,在总控制部件的协调下,进行正常运算,完成FIR滤波器算法。实际上,还有一个部件没有单独指出,那就是用来存放的寄存器组。在程序编写时,由于它只是一组信号,在组织上也没有特别的设计,故没有单独提出。11.2.4 FIR滤波器附加功能实现主体部分的功能在于实现FIR滤波器算法,它只是完成特定运算的硬件结构,为了能完成实际的滤波功能,还必须增加一些外围的功能模块,其中包括工作时钟设置模块、工作模式设置模块、键盘模块、显示器模块、数模转换和模数转换模块6个部分。1工作时钟设置模块此模块的功

22、能是改变工作时钟频率,达到改变序列处理速度,使之在不改变参数的基础上,就可以改变选通频段。它由两部分组成,一部分是在FPGA内部实现,另一部分在FPGA外部实现,即通过改变外接的时钟源来实现。内部模块的程序如下:process(clk)beginif(clkevent and clk=1)then-上升沿有效if(pcountpmax & 0)then-不到阈值pcount:=pcount+1;-计数器加1if(pcountpmax)then-不到半阈值clkout=0;-时钟为0elseclkout=1;-过半阈值,时钟为高电平end if;else-过阈值,计数器清零 pcount:=0;

23、end if;end if;end process;在这段程序中,pmax是设置时钟输入的1/2阀值,阀值数值越大clkout的频率越低,在程序中间用1/2阈值进行判断,使clkout为占空比为50%的时钟。2工作模式设置模块此模块用于设置工作模式,如高通模式、低通模式、带通模式、带阻模式、另设参数模式(用于另设参数工作模式)等。当系统工作在前4个模式时,系统分别完成高通、低通、带通、带阻滤波的功能,当系统工作在另设参数模式时,系统可以通过外设来设置,以实现其它指标的滤波器。当系统工作在另设参数工作模式时,系统就用上一模式设置的参数进行工作。其程序如下:process(set,enter,mode)beginif(set=1)then-以下为设置模式if(mode=00)then-设置为低通模式reg_hn(0)=00000001;-这些参数都是reg_hn(10)=00000001;-事先算好的reg_hn(9)=00110000;reg_hn(1)=00110000;reg_hn(2)=01100111;reg_hn(8)=01100111;reg_hn(3)=10011011;reg_hn(7)=10011011;reg_hn(4)=11000000;reg_hn(6)=11000000;reg_hn(5)=11001101;elsif(mode=01)the

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论