《数字FIR滤波器设计.doc》由会员分享,可在线阅读,更多相关《数字FIR滤波器设计.doc(30页珍藏版)》请在三一办公上搜索。
1、目 录1 概述22 课程设计要求33 设计内容43.1课程设计题目及要求43.1.1 设计题目43.1.2 设计要求4 3.2数字滤波器简介及结构43.3设计方案的确定63.3.1滤波器的设计方法63.3.2 滤波器设计实现方法63.3.3 方案确定63.4设计方案的实现73.4.1利用FDATool工具设计FIR数字滤波器73.4.2 FIR数字滤波器的FPGA实现103.5 仿真测试与分析244 参考文献301 概述我们学生通过这次的课设深入理解和消化了基本理论、进一步提高综合应用能力并且锻炼独立解决问题的能力,我们将数字信号处理、集成电路原理与应用和FPGA系统设计与应用几门课程融合在一
2、起综合应用设计一个实用的数字FIR滤波器。本报告中首先讲解了这次设计的具体内容,以及所要求的数字FIR滤波器的技术指标。然后,数字滤波器的一些设计方法,并具体确定我这次设计所用的设计方案。滤波器在matlab中的设计方法应用。通过matlab得到所需滤波器的具体参数h(n),然后用这些所设计的参数,通过Quartus ii工具编程具体实现滤波器功能。这次滤波器实现过程中,用到以下小模块:延时器,加法器,乘法器,减法器。2 课程设计要求及注意事项1 设计过程以小组为单位,各组设一个组长,负责组织和协调本小组的讨论、任务分工等;2 设计过程必须在本组内独立完成,不得跨组参考或抄袭,避免方案出现雷同
3、;3 设计书一律采用专用报告纸,用统一封面装订;4 课程设计原则上在3周内做完;5 最后一周周五进行优秀设计方案评选,在各组推选代表进行方案介绍的基础上,推选出2-3个优秀设计方案。6 学有余力的学生在完成必做设计内容的基础上,可对内容进一步展开设计,以提高综合应用能力,锻炼独立解决问题的能力。3 课程设计内容3.1 课程设计题目及要求3.1.1 设计题目:基于FPGA的FIR滤波器设计3.1.2 设计要求利用所学知识,采用MATLAB和FPGA相结合完成FIR滤波器的设计仿真。采用直接法或分布式算法实现FIR数字滤波器,了解两种算法的优缺点,选择其中一种算法,得出用它来实现FIR滤波器的硬件
4、结构,对其实现方式进行研究,分别采用合适的方法来设计,最后利用FPGA器件实现FIR数字滤波器的硬件电路,并用Matlab对实现的结果进行仿真分析。设计指标:1)类型:FIR低通2)系统采样频率:Fs=10KHz;3)输入序列位宽为8位的有符号数(最高位为符号位);4)输出结果保留8位5)窗口类型为kaiser窗,=0.5;6)滤波器长度为N=16;3.2数字滤波器简介及结构 3.2.1 简介滤波器是用来进行频率选择或频率分辨操作的线性时不变系统的通称。数字滤波器通常都是应用于修正或改变时域或频域中信号的属性。最为普通的数字滤波器就是线性时间不变量(1inear timeinvariant,L
5、TI)滤波器。一个简单的数字滤波系统如图1-1所示。图中,x(t)为模拟信号,经过A/D转换器后变为一个有着先后顺序的数字序列x(n)。然后x(n)通过数字滤波系统H(z),即得到数字滤波器的输出y(n)。H(z)为该数字滤波系统的单位脉冲响应h(n)的Z变换 (3-1)若h(n)为无限长序列,则得到的数字滤波器为IIR数字滤波器,又称递归滤波器;反之,若h(n)为有限长序列,则得到的数字滤波器为FIR滤波器,也称非递归滤波器。一个线形时不变因果滤波器可表示为: (3-2)其中N为h(n)的长度,即滤波器的长度。滤波器的阶数为N-1。IIR滤波器主要是基于对模拟滤波器如巴特沃斯滤波器、椭圆滤波
6、器等的幅频响应进行逼近,而其相频响应是非线性的。与IIR滤波器不同,FIR滤波器可以把相位特性设计成线性。这使得FIR数字滤波器在信号无失真传输、数据通信、图像传输与处理、语音信号处理等有线性相位要求的领域应用广泛。FIR滤波器的优点是软硬件实现结构简单,不用考虑系统的稳定性问题;缺点是实现较高性能的频率响应需要较高的滤波器阶数。3.2.2结构FIR滤波器的单位抽样响应为有限长度,一般采用非递归形式实现。通常的FIR数字滤波器有横截性和级联型两种。FIR滤波器实现的基本结构有:(1)FIR滤波器的横截型结构表示系统输入输出关系的差分方程可写作: (3-3) 直接由差分方程得出的实现结构如图2-
7、2所示:图3-1 横截型(直接型卷积型)若h(n)呈现对称特性,即此FIR滤波器具有线性相位,则可以简化加横截型结构,下面分情况讨论:图3-2 图3-3图3-2 N为奇数时线性相位结构图 图3-3 N为偶数时线性相位结构图(2)FIR滤波器的级联型结构将H(z)分解成实系数二阶因子的乘积形式: (3-4) 这时FIR滤波器可用二阶节的级联结构来实现,每个二阶节用横截型结构实现。如图所示:图3-4 FIR滤波器的级联结构这种结构的每一节控制一对零点,因而在需要控制传输零点时可以采用这种结构。3.3设计方案的确定3.3.1 滤波器设计实现方法一般有线性相位FIR直接型结构和分布式算法的设计。3.3
8、.2方案确定经过多种方案的比较,本次设计最终的方案是:窗函数法的分布式结构FIR数字滤波器。利用MATLAB提供的FDATOOL滤波器设计工具,采用窗函数法和分布式结构,编写VHDL语言,从而实现FIR数字滤波器的设计。3.4 方案实现3.4.1 利用FDATool工具设计FIR数字滤波器FDATool(Filter Design & Analysis Tool)是MATLAB信号处理工具箱里专用的滤波器设计分析工具,MATLAB6.0以上的版本还专门增加了滤波器设计工具箱(Filter Design Toolbox)。FDATool可以设计几乎所有的基本的常规滤波器,包括FIR和IIR的各种
9、设计方法。它操作简单,方便灵活。FDATool界面总共分两大部分,一部分是Design Filter,在界面的下半部,用来设置滤波器的设计参数,另一部分则是特性区,在界面的上半部分,用来显示滤波器的各种特性。Design Filter部分主要分为:Filter Type(滤波器类型)选项,包括Lowpass(低通)、Highpass(高通)、Bandpass(带通)、Bandstop(带阻)和特殊的FIR滤波器。Design Method(设计方法)选项,包括IIR滤波器的Butterworth(巴特沃思)法、Chebyshev Type I(切比雪夫I型)法、 Chebyshev Type
10、II(切比雪夫II型) 法、Elliptic(椭圆滤波器)法和FIR滤波器的Equiripple法、Least-Squares(最小乘方)法、Window(窗函数)法。Filter Order(滤波器阶数)选项,定义滤波器的阶数,包括Specify Order(指定阶数)和Minimum Order(最小阶数)。在Specify Order中填入所要设计的滤波器的阶数(N阶滤波器,Specify OrderN-1),如果选择Minimum Order则MATLAB根据所选择的滤波器类型自动使用最小阶数。Frenquency Specifications选项,可以详细定义频带的各参数,包括采样频
11、率Fs和频带的截止频率。它的具体选项由Filter Type选项和Design Method选项决定,例如Bandpass(带通)滤波器需要定义Fstop1(下阻带截止频率)、Fpass1(通带下限截止频率)、Fpass2(通带上限截止频率)、Fstop2(上阻带截止频率),而Lowpass(低通)滤波器只需要定义Fstop1、Fpass1。采用窗函数设计滤波器时,由于过渡带是由窗函数的类型和阶数所决定的,所以只需要定义通带截止频率,而不必定义阻带参数。Magnitude Specifications选项,可以定义幅值衰减的情况。例如设计带通滤波器时,可以定义Wstop1(频率Fstop1处的
12、幅值衰减)、Wpass(通带范围内的幅值衰减)、Wstop2(频率Fstop2处的幅值衰减)。当采用窗函数设计时,通带截止频率处的幅值衰减固定为6db,所以不必定义。本次设计滤波器的系数就是采用FDATool工具设计的滤波器。在MATLAB命令窗口中,执行“FDATool”命令,就会启动FDATool滤波器设计与分析工具,其图形界面如图3-8所示。 图3-5 FDATool界面选择窗函数法设计滤波器:直接使用FDATool工具进行滤波器设计。例如首先滤波器Response type选择低通,选中FIR类型,首先根据滤波器技术指标,选择窗函数的类型、长度、采样频率和截止频率。点击DESIGN F
13、ILTER按键,即可得到设计的FIR滤波器的频率响应和滤波器的系数。保存并关闭滤波器设计分析工具回到matlab主窗口,在命令编辑区输入Num可得到工具的计算结果。对FIR滤波器的系数进行调整,做整数化操作,可得到滤波器整数化的系数。FIR滤波器设计系数的确定窗函数法低通滤波器:阶数:15 采样频率:10k 截止频率:1k 滤波器类型:窗函数法FIR滤波器幅频响应滤波器相频响应滤波器系数导出后的系数Num*(26),round(ans)求整3.4.2 FIR数字滤波器的FPGA实现采用分布式算法设计FIR滤波器1)分布式算法基础 分布式算法(Distributed Arithmetic,DA)
14、是一项重要的FPGA技术,广泛地应用于计算乘积和: (3-1)这种算法可用于滤波器、卷积、相关、DFT等凡是有乘累加运算的地方。 一个线性时不变网络的输出可用式(3-1)表示。假设为常量,为变量。对于有符号DA系统,可表示为: (3-2)将式(3-2)代入式(3-1),得 (3-3)其中x(n)为(B+1)位,称为位乘积,其中b=0,B+1。函数的实现方法是利用一个LUT实现映射,预先设定程序的LUT接收一个N位的输入向量,输出为,各个映射都由相应的二次幂加权累加,最后得到一次滤波的结果。 由上分析可知,分布式算法是将乘法运算转换成基于查找表结构的移位相加算法,从而实现多个乘法运算操作。在被乘
15、数位数较少的情况下,相比直接的乘法器结构,这种算法有明显的速度和算法优势。这种算法尤其是在乘法器资源很少的FPGA器件中有很大的应用前景。2) 并行的分布式算法 分布式算法有串行实现方式和并行实现方式。并行方式的算法结构如图3-10所示。图中ROM的输出和求和结果的输出都加上了虚线框,这些虚线框为流水线寄存器。上下级流水线寄存器之间的数字电路按照时钟频率工作而不用考虑它们本身的延迟,这使得整个系统的工作频率增加,从而加快了运算速度。但是这种并行结构增加了额外的LUT、寄存器和加法器。当输入数据位宽较少时,比如4到8位,这种实现方式会有令人满意的结果。图3-6 并行DA结构3)本文采用并行分布式
16、算法的实现方案 图3-7 并行分布式算法实现框图如图所示,各个模块的实现步骤如下:(1)输入数据预处理模块 该模块用于将A/D转换器输出的8位有符号数据转换成二进制补码形式,并进行锁存。由于在计算机中采用的数据形式是二进制补码,为了仿真方便,在仿真时可以去掉这个模块。(2)并行延时模块 输入数据输送到并行延时模块,在每个时钟周期,把一组数据顺序时延,每经过15个时钟周期,就会有一个数据移出并行延时模块。这些并行时延模块是有15组D触发器串联而成,并且共用一个时钟。(3)预相加模块 由于线性相位FIR滤波器的系数具有对称性,因此可以通过将对称的x(n)进行相加,这样可以节省(N-1)/2个乘法器
17、,从而降低了硬件的规模。(4)查找表模块该模块用于对位乘积的寻址。一个8位的地址,可以产生个数据。为了节约FPGA资源,可以采用LUT分割技术,将一个8位地址的LUT分割成两个4位地址的LUT。这样可以节省224个数据空间。因此,采用LUT分割技术,可以节省大量硬件资源,避免了大容量ROM的使用。 根据分布式算法,查找表存储的是滤波器系数的各种组合相加的结果,由于滤波器系数通常为浮点数,我们需要将其化为定点整数。(5)加法器模块 该模块用于将高4位LUT选中的数据和低4位LUT选中的数据进行相加,然后送入移位累加器模块。为了保证结果正确性,在相加前,需要对相加的两个有符号数进行符号位扩展。(6
18、)移位累加器模块 各个位产生的位乘积在这个模块中乘以各自的权重,也即左移相应的位数,然后相加得到最终结果。(7)输出处理模块由于移位累加器输出的是24位二进制数,为了得到16位字长的数据,需要对输出数据进行截去低8位,同时进行锁存输出。如果有必要,还需将输出的二进制补码转换为二进制原码。分布式结构的FPGA实现。顶层原理图如下:1 寄存器(延时器) 原理图上标有yanshi的器件。输入8位数据,通过yanshi的D触发寄存器,达到延时的作用。2 预相加 数据通过add889,就是8位数字输入,9位数字输出加法器,完成第一级相加运算,因为本设计是16阶FIR数字滤波器,它的滤波系数有对称的关系,
19、所以采用上面的第一级加法器,达到简化运算的效果。3 查找表 该步骤分为地址生成表和系数查找表,地址生成表是用来为查找系数做准备,以便尽快找到系数。4 移位根据FIR滤波器的结构式分布图,要实现系数乘以20到28,在VHDL中想乘就是向左移位。5 累加第四步骤得到移位后的结果,两两相加,利用相加器模块,得到相加结果。6 输出处理 结果输出要求8位输出,但是FPGA的结果是24位,因此要对结果进行处理,以便达到设计要求,因为之前一直是进行符号位扩展,只要截取符号位就能达到要求,用了一个D触发器和截取8位的原件图。D触发器是用来暂存24输出结果的,以防造成延时,达到输出结果错乱。二,详细说明 1 寄
20、存器(延时器)设计中用一系列D触发器组成延时器,实现延时功能。实现功能:在Clk正跳沿前接受输入信号,正跳沿时触发翻转,正跳沿后输入即被封锁。源文件:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY yanshi IS PORT( clk : IN STD_LOGIC; D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END yanshi; ARCHITECTURE hav OF yanshi IS BEGIN PROCESS(clk) BEG
21、IN IF(clkEVENT AND clk=1) THEN Q = D; END IF; END PROCESS; END hav;2 预相加实现两个二进制数字的相加运算。当到达时钟上升沿时,将两数输入,运算,输出结果。源文件:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_arith.ALL;ENTITY add889 isPORT(clk : IN STD_LOGIC; Din1,Din2 :IN signed (7 downto 0); Dout:OUT signed(8 downto 0);END add889;
22、ARCHITECTURE a of add889 isSIGNAL s1: signed(8 downto 0);SIGNAL s2: signed(8 downto 0);BEGIN s1=(Din1(7)&Din1); s2=(Din2(7)&Din2);PROCESS(Din1,Din2,clk)BEGINif CLKEVENT AND CLK= 1 THENDout=s1+s2;END IF;END PROCESS;END a;3 查找表1) 地址生成模块 生成系数地址,以便找到系数源文件:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY
23、address IS PORT( clk : IN STD_LOGIC; DIN0,DIN1,DIN2,DIN3 : IN STD_LOGIC_VECTOR(8 DOWNTO 0); s0,s1,s2,s3,s4,s5,s6,s7,s8 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END address; ARCHITECTURE a OF address IS BEGIN PROCESS(clk ) BEGIN IF(clkEVENT AND clk=1) THEN s0=(DIN3(0)&DIN2(0)&DIN1(0)&DIN0(0); s1=(DIN3(1)
24、&DIN2(1)&DIN1(1)&DIN0(1); s2=(DIN3(2)&DIN2(2)&DIN1(2)&DIN0(2); s3=(DIN3(3)&DIN2(3)&DIN1(3)&DIN0(3); s4=(DIN3(4)&DIN2(4)&DIN1(4)&DIN0(4); s5=(DIN3(5)&DIN2(5)&DIN1(5)&DIN0(5); s6=(DIN3(6)&DIN2(6)&DIN1(6)&DIN0(6); s7=(DIN3(7)&DIN2(7)&DIN1(7)&DIN0(7); s8=(DIN3(8)&DIN2(8)&DIN1(8)&DIN0(8); END IF; END PRO
25、CESS;END a;2) 系数查找模块 mif文件的生成lpm_rom(0) lpm_rom(1)4 移位 以SHIFT4为例源码如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SHIFT4 IS PORT( clk : IN STD_LOGIC; hn : IN STD_LOGIC_VECTOR(7 DOWNTO 0); Dout : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) ); END SHIFT4; ARCHITECTURE a OF SHIFT4 IS signal aa: STD_LOGIC_VECT
26、OR(11 DOWNTO 0); BEGIN PROCESS(clk ) BEGIN IF(clkEVENT AND clk=1) THEN aa=hn&0000;END IF;Dout=aa(11)&aa(11)&aa(11)&aa(11)&aa(11 DOWNTO 0);END PROCESS;END a;5累加15位相加模块源LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_arith.ALL;ENTITY add16 isPORT(clk : IN STD_LOGIC; Din1,Din2 :IN signed (1
27、5 downto 0); Dout:OUT signed(16 downto 0);END add16;ARCHITECTURE a of add16 isSIGNAL s1: signed(16 downto 0);SIGNAL s2: signed(16 downto 0);BEGIN s1=(Din1(15)&Din1); s2=(Din2(15)&Din2);PROCESS(Din1,Din2,clk)BEGINif (clkevent and clk=1) thenDout=s1+s2;END IF;END PROCESS;END a;16位相加模块源程序LIBRARY IEEE;U
28、SE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_arith.ALL;ENTITY add17 isPORT(clk : IN STD_LOGIC; Din1,Din2 :IN signed (16 downto 0); Dout:OUT signed(17 downto 0);END add17;ARCHITECTURE a of add17 isSIGNAL s1: signed(17 downto 0);SIGNAL s2: signed(17 downto 0);BEGIN s1=(Din1(16)&Din1); s2=(Din2(16)&Di
29、n2);PROCESS(Din1,Din2,clk)BEGINif (clkevent and clk=1) thenDout=s1+s2;END IF;END PROCESS;END a;17位相加模块源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_arith.ALL;ENTITY add18 isPORT(clk : IN STD_LOGIC; Din1,Din2 :IN signed (17 downto 0); Dout:OUT signed(18 downto 0);END add18;ARCHITECTU
30、RE a of add18 isSIGNAL s1: signed(18 downto 0);SIGNAL s2: signed(18 downto 0);BEGIN s1=(Din1(17)&Din1); s2=(Din2(17)&Din2);PROCESS(Din1,Din2,clk)BEGINif (clkevent and clk=1) thenDout=s1+s2;END IF;END PROCESS;END a;18位相加模块源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_arith.ALL;ENTITY
31、 add19 isPORT(clk : IN STD_LOGIC; Din1,Din2 :IN signed (18 downto 0); Dout:OUT signed(19 downto 0);END add19;ARCHITECTURE a of add19 isSIGNAL s1: signed(19 downto 0);SIGNAL s2: signed(19 downto 0);BEGIN s1=(Din1(18)&Din1); s2=(Din2(18)&Din2);PROCESS(Din1,Din2,clk)BEGINif (clkevent and clk=1) thenDou
32、t=s1-s2;END IF;END PROCESS;END a;3.4 仿真测试与分析为了测试15阶等波纹FIR低通滤波器的滤波性能,本设计加入了输入 的信号,其中是叠加在上的噪声。如图4-4所示,假设抽样频率为1000,则经过抽样的输入序列为: ,取n=0,139,由于为浮点数,本设计将扩大24倍,得到,然后再取整。具体如表3-7所示:表3-7 输入序列的处理n取整n取整n取整n取整016.00161032.00322016.001630001-13.49-1311-0.19021-18.50-1931-31.80-32220.94211231.21312211.0511320.7813-
33、8.73-913-1.74-223-23.26-2333-30.25-30425.40251428.9429246.597343.0535-4.68-415-4.6-525-27.31-2735-27.31-27628.94291625.4025263.053366.577-1.74-217-8.7-927-30.25-3037-23.26-23831.21311820.9421280.7813811.05119-0.19019-13.49-1329-31.80-3239-18.50-19抽样,放大取整后的40个输入数据如下:Din=16,-13,21 ,-9, 25,-4,29, -2, 3
34、1,0,32, 0, 31, -2,29, -5,25, -9, 21,-13,16,-19, 11,-23,7,-27,3,-30, 1, -32,0, -32,1,-30, 3,-27,7,-23,11,-19滤波系数:h=-3,-2,-1,1,5,8,11,13,13,11,8,5,1,-1,-2,-3Quartusii仿真结果如下如仿真图输出为:Dout=-1,0,-1,0,0,1,0,2,3,4,6,8,10,12,13,16,16,19,15,16,12,13,6,9,3,4,-2,-4,-10,-9,-14,-13,-10,-16,-19,-17,-17,-19,-15,-12,
35、-11,-9,-8,-5,-4,-2,0,-1,1,0Matlab中卷积结果如下:y=round(conv(h,Din)/64)仿真结果与matlab计算结果比较可知基本一样。在matlab中输出函数如图:t=0:.1:39;y=sin(0.05*pi*t)+cos(pi*t);plot(t,y);抽样40点x(n)如下:t = 0 : 1 : 39;y = sin(0.05*pi*t)+cos(pi*t);stem(t, y);在MATLAB中编程实现理想与FPGA编程实现的实际柱状图的比较figure(1);subplot(1,2,1);din=16,-13,21,-9,25,-5,29,
36、-2,31,0,32,0,31,-2,29,-5,25,-9,21,-13,16,-19,11,-23,7,-27,3,-30,1,-32,0,-32,1,-30,3,-27,7,-23,11,-19;hn=-3,-2,-1,1,5,8,11,13,13,11,8,5,1,-1,-2,-3;y=round(conv(hn,din)/64);t1=0:1:54;stem(t1,y,b-);subplot(1,2,2);yn=-1,0,-1,0,0,1,1,3,3,5,6,9,10,12,13,15,16,17,17,16,15,14,12,11,9,6,4,1,-1,-4,-6,-9,-11,-
37、12,-14,-15,-16,-17,-17,-16,-14,-14,-12,-11,-8,-7,-5,-4,-2,-1,0,0,1,0,1;stem(t1,yn,r*);柱状图比较如下:结论:蓝色代表matlab的理想结果,而红色代表实际结果。比较两图的曲线走势几乎完全一样,可得所设计是正确的。4 参考文献1刘爱荣.EDA技术与CPLD/FPGA开发应用简明教程M. 北京:清华大学出版社,2007.2潘松.EDA技术实用教程M. 北京:清华大学出版社,2006.3薛年喜. MATLAB在数字信号处理中的应用M. 北京:清华大学出版社,2003.4程佩青. 数字信号处理教程M. 北京:清华大学出版社,2003.5王正彦,范彦斌.用FPGA实现FIR滤波器算法研究j.测控技术,20046顾文奕.FIR数字滤波器的优化与验证j.电子测量技术,20087李萌,侯亚辉.一种基于Quartusii集成综合器FPGA面积优化方法j.中国传媒大学学报,20078吴继华,主编.AlteraFPGA/CPLD设计(高级篇)M.北京:人民邮电出版社,2005