FIR滤波器程序设计

FIR滤波器程序设计

中文摘要

21世纪是数字化的时代,随着信息处理技术的飞速发展,DSP(数字信号处理器)技术逐渐发展成为一门主流技术,它在电子信息、通信、软件无线电、自动控制、仪表技术、信息家电等高科技领域得到了越来越广泛的应用。相对于模拟滤波器,数字滤波器没有漂移,能够处理低频信号,频率响应特性可做成非常接近于理想的特性,且精度可以达到很高,容易集成等,这些优势决定了数字滤波器的应用越来越广泛,工程上常用它来做信号处理、数据传送和抑制干扰等。。同时DSP的出现和迅速发展也促进了数字滤波器的发展,并为数字滤波器的硬件实现提供了更多的选择。

本课题主要应用MATLAB软件设计FIR数字滤波器,并对所设计的滤波器进行仿真;应用DSP集成开发环境—CCS调试汇编程序,用TMS320C5402来实现了FIR数字滤波。具体工作包括:对FIR数字滤波器的基本理论进行了分析和探讨;采用MATLAB软件来学习数字滤波器的基本知识,计算数字滤波器的系数,研究算法的可行性,对FIR低通数字滤波器进行前期的设计和仿真;系统介绍了TI公司TMS320C54x系列数字信号处理器的硬件结构、性能特点和DSP的集成开发环境CCS;应用DSP集成开发环境—CCS调试汇编程序,用TMS320C5402来实现了FIR数字滤波。

关键词:频率抽样,FIR滤波器,Matlab,TMS320C5402,CCS,仿真

FIR滤波器程序设计

1设计任务和目的

1.1设计题目

FIR滤波器程序设计

1.2设计目的

1)掌握DSP编程的过程和指令的使用;

2)熟悉运用CCS集成开发环境进行仿真和TMS320C5402的基本功能和使用方法;

3)熟悉FIR滤波器的实现方法和设计过程。

2设计思路

DSP是一种实时、快速、特别适合于实现各种数字信号处理运算的微处理器。由于它由具有丰富的硬件资源、改进的哈佛结构、高速数据处理能力和强大的指令系统。

数字滤波器的设计可分为5个独立的阶段:滤波器技术规范、系数计算、实现结构、误差分析和滤波器实现。滤波器技术规范与应用有关,且应该包括振幅和相位特性的规范。

系数计算本质上就是求出满足所期望的规范的h(n)值。计算FIR滤波器系数最常用的方法有三种:窗口方法,频率抽样方法,最佳方法。窗口方法是最容易的,但是缺乏灵活性,特别是当通带波纹和阻带波纹不同时更是如此。频率抽样方法非常适合FIR滤波器的递归实现,频率抽样法也适合那些除了要求标准频率选择性滤波器(低通、高通、带通和带阻)之外的滤波器。最佳方法是最高效和灵活的一种设计方法。三中最常用的FIR滤波器结构是横向结构、频率抽样结构和快速卷积结构。横向结构包含一个使用滤波器系数的直接卷积;频率抽样结构直接同系数计算的频率抽样方法相联系。结构的选择与具体的应用有关。此处选择横向结构。

长字长的或者高阻带衰减的FIR滤波器的性能可能会受到有限字长的影响。例如,系数量化后他们的频率响应可能会发生变化。因而应当对这些滤波器的特性进行检查以确保允许的合适的字长。

在完成好前四步后,通常要考虑实现问题,以及考虑软件编程或选择结构的硬件实现。

而我们主要考虑软件的实现过程。

3 FIR滤波器设计步骤流程图

图2-1 FIR滤波器设计步骤流程图

FIR滤波器程序设计

4软件流程图

图4-1 qgf.asm程序流程

5设计部分

5.1硬件的整体设计和规划

CPU选择TI公司的16位定点DSP,具体型号为TMS320C5402是为实现低功耗、高性能而专门设计的定点DSP芯片,其主要应用时无限通信系统等。

TMS320C5x的主要特点包括:运算速度快,内部有一个算术逻辑单元,2个累加器、2个加法器、1个乘法器、1个桶形移位器、4条内部总线和2个地址产生器。内部还集成了维特比加速器,用于提高维特比编译码的速度。它是低功耗方式,可以在3.3V或2.7V电压下工作,3个低功耗方式可以节省DSP的功耗,TMS320C5402特别适合于无线移动设备。

5.2 FIR滤波器的特点

数字滤波器是由一系列滤波器系数定义的方程。这些方程构成数字滤波程序部分,滤波程序接收原始数据,并且输出滤波后的数据。这种程序的最大优点在于滤波器的再设计不需要硬件方面的更改,只要简单地改变滤波器的系数表即可完成滤波器特性的修改。数字滤波程序可在任何处理器上实现,但最有效的是在专门设计用来进行高速滤波或其他DSP处理的硬件上实现。DSP硬件可使非常复杂的任务在极短的时间内完成,因此它经常作为大计算量的系统核心。

DSP具的有较大灵活性,可以进行编程或再编程来执行许多功能而不需要修改硬件,这或许是DSP系统最主要的特征,同时拥有优良的性能,DSP可以执行许多模拟系统不可能完成的性能,例如可以实现线性相位响应,复杂的自适应滤波算法可以利用DSP技术来实现。

5.2 FIR滤波器的结构选择

首先对其结构进行选择,结构的选择取决于多种因素和折中考虑,其中包含实现的容易程度,也就是软件和硬件的复杂度,求冲击响应或传递函数系数的难易程度,以及它们对系数量化的相对敏感度。在实际中,系数描述的精度受限于所用处理器的字长。使用有限的位数来表示描述每个系数趋向于将零从期望的位置移出,这会导致频率响应上的偏差。响应中偏差的大小取决于位数和所用的结构。

横向结构非常易于编程,且可由大多数DSP芯片有效的实现,因为这些芯片有针对横向FIR滤波器的指令。直接构造是实现非递归滤波器的最常用方法,它的最主要的优点是其简单性,要求的器件最少,且数据的存储不复杂。串联结构对系统误差和量化噪声不敏感,但是系数值需要做更大的努力才能求出,且程序设计不适合DSP芯片的结构。快速卷积结构能提供出比他方法更好的计算优势,但需要有效的FFT。

对于窄带频率选择滤波器来说,频率抽样结构比等价的横向结构计算更有效,在此滤波器中,仅有相对少量的频率抽样值不为零,因此每输出一个值仅需非常少的乘法。然而,频率抽样结构可能要求更为复杂的编程,因为在其差分方程中固有的对数据的复杂索引。为了避免稳定问题,频率抽样结构的零点和极点应该位于单位圆稍内一点。当要求FIR滤波器递归实现时,这种结构是一种自然的选择。这种结构易于模块化,并有利于并行处理。总之,除非规范要求采用频率抽样结构,或者需要计算数据的谱采用快速卷积,那么采用横向结构不失为一个好的选择。

采用横向结构,对于这种结构,滤波器的输入x(n)与输出y(n)之间的关系如下:

FIR 滤波器程序设计

下面两个公式刻画出基本的FIR 滤波器

1

()()()N i y n h i x n i -==-∑

(5-1) 对式(4-1)进行Z 变换,整理后可以得到FIR 滤波器的传递函数为:

110()

()()()N i Y z H z h i z X z --===∑

(5-2)

图5-1所示是FIR 滤波器的一般结构。

图5-1 FIR 滤波器结构图

式中h(i)(i=0,1,…,N-1),是滤波器的冲击响应系数。符号1z -代表一个抽样延迟或单位时间延迟。对于横向结构,每一个输出抽样值y(n)的计算要求:N-1个存储位置来保存N-1个输入抽样值;N 个存储位置来保存N 个系数;N 个乘法器;N-1个加法器。H(z)是滤波器的传递函数,N 是滤波器长度,即滤波器系数的数目。

式(5-1)是FIR 时域差分方程,它使用非递归形式描述了FIR 滤波器:当前输出信号y(n)只是过去和当前的输入值x(n)的函数。那么做x(n-1)到x(n-N)的加权和。当FIR 滤波器利用这种形式实现时,即直接根据(5-1)式进行计算,那么滤波器总是稳定的。

式(5-2)是滤波器的传递函数,它提供了分析滤波器的一种方法,例如评估频率响应。FIR 滤波算法实际上是一种乘法累加运算。它不断输入样本,经延时1z -,作乘法累加,再输出滤波结果y(n)。系统的单位冲激响应h(n)在有限个n 值处不为零; 系统函数H(z)在|z|>0处收敛,在|z|>0处只有零点,有限

z

平面只有零点,而全部极点都在z=0处。、

结构主要是非递归结构,FIR 滤波器最主要的特点是没有反馈回路,因此它是无条件稳定系统。它的单位脉冲响应h(n)是一个有限长序列,脉冲响应顾名思义,滤波器的脉冲响应就是滤波器对脉冲输入的响应;换句话讲,当滤波器的输入为单位脉冲时,滤波器的输出就是单位脉冲响应。脉冲响应反映了滤波器的基本特性,由于所有的数字信号可以由脉冲函数构成,所以脉冲响应可用来求各种输入时的输出。如果h(n)是实数,且满足偶对称或奇对称的条件,即h(n)=h(N-1-n)或h(n)=-h(N-1-n),则滤波器具有线性相位特性的充要条件。对于非递归FIR 滤波器,系数的存储空间和算术运算次数几乎减少了2倍,对于递归滤波器系数转变为简单整数,提高了处理速度。在线性相位滤波器中,所有频率分量通过滤波器时会遇到同样大小的延迟,即没有相位失真。

5.3 FIR 滤波器的延迟用线性缓冲区法实现

在这里用线性缓冲区法实现1z - ,它的优点是新老数据在存储器中存放的位置直接明了,算法便于理解,以幅度特性随意设计的同时,保证精确、严格的线性相位,由于FIR 滤波器的单位脉冲响应h(n)是有限长序列,因此FIR 滤波器没有不稳定问题,FIR 滤波器一般为非递归结构,因此在有限精度运算下,不会出现递归型结构中的极限震荡等不稳定现象,误差较小,可以用FFT 实现过滤信号,可大大提高运算效率。其特点是:对于N 级的FIR 滤波器,在数据存储区中开辟一个称之为滑窗的N 个单元的缓冲区,存放最新的N 个输入样本。 从最老的样本开始,每读一个样本后,将此样本向下移位。读完最后一个样本后,输入最新样本至缓冲区的顶部。

以上过程,可以用N=6的线性缓冲区存储器图来说明,如图5-2所示。图中线性缓冲区顶部是存储器的低地址单元,底部为高地址单元。参看图5-2(a),当第一次执行5

0()()()i y n h i x n i ==-∑ 时,由ARx 指向线性缓冲区的底部,并开始取数、运算。每次乘法累加运算之后,还要将该数据向下(高地址)移位。求得y(n)以后,从I/O 口输入一个新数据x(n+1)至线性缓冲区的顶部单元,再将ARx 指向底部单元,开始第二次执行5

0(1)()()i y n h i x n i =+=-∑ ,如图5-2(b)所示。之后,再计算y(n+2)……依次循环下去。

FIR滤波器程序设计

图5-2 N=6的线性缓冲区存储器图

5.4 误差问题

因为在用定点DSP实现时,所有的数据都是定长的,运算也都是定点运算,因而会产生有限字长效应。所产生的误差主要包括:系数量化引起的误差以及运算过程中的舍入误差,还有溢出误差。任何一种近似方法得到得滤波器系数通常精确到小数点的几位。

系统量化误差:为了实现滤波器,滤波器系数必须有固定的位数表示并且这个固定的位数常常是由使用的处理器的字长决定的。滤波器中我们使用16位DSP处理机,则滤波器系数就由16位字长来表示,然而这样做会自动的引入误差,这种误差使得有限字长滤波器的频率响应偏离期望的响应。在某些情况下,这种偏离意味着初始的规范不再满足。系数量化在本质上将未量化的滤波器变换成一套新的规范,由于它会使阻带或通带波纹衰减,然后用新规范来求系数。这种变换必须是系数量化后仍满足原来的规范。

舍入误差:滤波器的输出是由h(i)和x(n-i)的乘积和得到的。每一个相乘后,积包含的位数要比h(i)和x(n-i)都多。例如12位输入乘以16位系数,结果有28位长,在存储到存储器之前需要将该28位的结果量化回16位,这种量化产生误差,它的影响类似于ADC噪声,但是可能更为严重。量化算术运算结果常用的方法是把结果截断,得到高的有效位而放弃低位,或者对结果舍入,即选择最接近未舍入结果的高位数据,这是通过给结果加1/2LSB来实现的。用两倍长的寄存器准确的表示所有的乘积,然后在得到最终和后对结果进行舍入,即在得到y(n)后对y(n)做舍入,这样可使舍入误差达到最小。这种方法要比另一种在求和前每个积都做舍入引入的误差小。

溢出误差发生在两个数求和时,通常符号相同的两个大数之和会超出允许的字长。如果输出y(n)超出允许的限制,那么很显然,样本值会发生错误,这需要采取一定措施避免这种情况发生。

在用定点DSP时,产生误差是不能避免的,但是可以通过一些方法减小误差。如,可以用两个存储单元来表示一个数,运算时使用双字运算;可以根据需要要将滤波器系数都用双字表示,也可以只将一半的系数用双字表示,视需要而定。FIR数字滤波器主要采用非递归结构,因而在有限精度的运算中都是稳定的。除了有限字长效应以外,不同结构引入的误差也有所不同。在实际设计中,要注意实现中的误

差问题。在选择不同的结构时,应考虑它们所引入的误差,并用高级语言进行定点仿真,以比较不同结构下误差的大小,从而作出合理选择。

5.5程序分析

这部分为未初始化段,在TMS320C54x的目标存储器中保留空间以供程序运行过程中的变量作为临时存储空间使用。在目标文件中,在这些段中没有确切的内容,通常将他们定位到RAM区中,其中未初始化段为命令定义,由.usect汇编器伪指令来编写语法,符号对应于保留的存储空间第一个字的变量名称,这个符号可以在其他段引用,为每一个符号留一个存储空间,程序如下:

.title "qgf.asm"

.mmregs

STACK .usect "STACK",40H

.def _main

.bss y,19

XN .usect "XN",1

XNM1 .usect "XN",1

XNM2 .usect "XN",1

XNM3 .usect "XN",1

XNM4 .usect "XN",1

XNM5 .usect "XN",1

. . .

. . .

. . .

XNM18 .usect "XN",1

H0 .usect "H0",1

H1 .usect "H0",1

H2 .usect "H0",1

. . .

. . .

. . .

H3 .usect "H0",1

H4 .usect "H0",1

H5 .usect "H0",1

H18 .usect "H0",1

给程序中的未初始化部分保留存储空间后为每一个保留存储空间赋值,在

FIR 滤波器程序设计

table 中给出数值,赋值过程先把XN 送到AR1,table 中的值依次给*AR1中,循环28次每循环一次之后*AR1加一,赋值完成之后把指针DP 指向#XN ,y 送入AR2中,程序如下:

.text

_main: SSBX FRCT

STM #XN,AR1

RPT #37

MVPD table,*AR1+

STM #XN+18,AR3

STM #H0+18,AR4

STM #30,BK

STM #-1,AR0

LD #XN,DP

STM #y,AR2

具体运算过程如下:

FIR1: LD @XNM18,T

;x(n-18)放入T 中 MPY @H18,A

;A=18H *x(n-18)18H LTD @XNM17

;x(n-17)放入T 中

;x(n-17) 放入 x(n-18) MAC @H17,A

;A=A+17H *x(n-18) LTD @XNM16

MAC @H16,A

LTD @XNM15

MAC @H15,A

LTD @XNM14

MAC @H14,A

LTD @XNM13

MAC @H13,A

LTD @XNM12

MAC @H12,A

LTD @XNM11

MAC @H11,A

LTD @XNM10

MAC @H10,A

LTD @XNM9

MAC @H9,A

LTD @XNM8

MAC @H8,A

LTD @XNM7

MAC @H7,A

LTD @XNM6

MAC @H6,A

LTD @XNM5

MAC @H5,A

LTD @XNM4

MAC @H4,A

LTD @XNM3

MAC @H3,A

LTD @XNM2

MAC @H2,A

LTD @XNM1

MAC @H1,A

LTD @XN

MAC @H0,A

STH A,*AR2+ ;保存y(n)

ST #0H,@XN

B FIR1 ;循环

.END

链接器命令文件的编写和使用:链接器命令文件是将连接的信息放在一个文件中,这样,如果需要多次使用同样的链接信息可以方便的调用。在命令文件中使用两个重要的伪指令MEMORY和SECTIONS,指定实际应用中的存储器结构和进行地址的映射,其中MEMORY用来指定目标存储器结构,SECTIONS用来控制段的构成与地址分配。MEMORY伪指令的PAGE(页面)选项来分开构成程序存储器区域和数据存储器区域的地址空间。在默认的方式下,PAGE0为程序存储器,PAGE1为数据存储器链接器将这两个空间当做完全分开的存储器空间来处理。伪指令SECTIONS可说明如何将输入的段结合成输出段,也可在执行程序中定义输出段,同时指定输出段放在存储器中的位置,并且允许对输出段重新命名。

MEMORY伪指令一般和SECTIONS伪指令一起使用,控制输出段的分配。在用MEMORY伪指令定义目标存储器的模型之后,可以使用段伪指令SECTIONS将输出段分配到具有指定名称或属性的存储器中,将.text和.data段分配进命名为ROM的存储器区间,而将.bss段分配进称为SPRAM的区间。

MEMORY

{

PAGE 0: /* program space */

EPROM: org = 0x0E000, len = 0x0800

VECS: org = 0x0FF80, len = 0x0080

PAGE 1: /* data space */

SRAM: org=0x60,len=0x0200

DRAM: org = 0x0280, len = 0x1000 /* */

}

SECTIONS

{

FIR 滤波器程序设计

.vectors : {} > VECS PAGE 0 /* interrupt vector table */ .text : {} > EPROM PAGE 0 /* program code */ .data : {} > EPROM PAGE 0 /* initialized data */

.bss : {} > SRAM PAGE 1 /* uninitialized vars for applications */

stk : {} > DRAM PAGE 1

}

其中直接寻址线性缓冲区数据分配如下图:

图5-3 直接寻址线性缓冲区数据分配

5.6计算机芯片上实现过程

CCS 集成开发环境:CCS 是TI 推出的用于开发其DSP 芯片的集成开发环境。CCS 是一个开发环境,可以通过设置不同的驱动程序来完成对不同环境的支持。它的配置过程很简单,双击桌面上的“Setup CCS2(’C5000)”图标使用C54xx 软件仿真器,则选择C5402 Device Simulator 选项,然后单击Import 按钮,单击Close 按钮,保存设置,这样就完成了配置。在File 菜单下保存设置,调出CCS 集成开发用户界面。在源程序编辑调试窗口中先建立一个新的工程,再编写程序,包括.asm 和.cmd 源文件,把源文件和库文件添加到工程中。

当程序加载成功后,CCS 会自动打开一个反汇编窗口。在CCS 中可以观察某个特定地址内存单元数据。执行菜单命令“View ”到”Memory ”在“Address ” 中显示存储器首地址为0x0060,其中设置的各种属性如下图:

图5-4 存储器窗口

执行完此过程后,源程序窗口如下:

图5-5 寄存器窗口

接下来设置图形窗口:CCS可以将数据按图形化方式显示出来,数据准备好后,执行菜单命令“View”到“ Graph”到“Time/Frequency”,显示如图所示的对话框,设置相应的显示类型和显示参数,即按希望的图形类型显示数据。

一共取20个点,设置首地址,DSP Data Type都要进行从新设定,具体设置如图:

图5-6 图形窗口

FIR滤波器程序设计

生成的图形如下:

图5-7 滤波器输出波形

工作过程分析

按传统的划分滤波器的实现可分为软件和硬件,但就现在而言滤波器中用到的大多数器件都是可编程的,几乎没有纯硬件的解决方案,构建专用算法来来执行FIR滤波器。根据滤波器的工作要求,通过MATLAB来计算系数h(n),再与单位冲击响应脉冲来进行加权和。

每个抽样时刻,首先将程序初始化,为下一次数据抽样检查ADC,将数据移到缓冲区内,读出并保存最新的输入抽样值x(n),更新数据存储器,用差分方程计算当前的输出抽样值,将输出抽样值送出DAC。

参考文献

[1]Emmanuel C.lfeachor.数字信号处理实践方法.北京:电子工业出版社,2004.11

[2]赵红怡.DSP技术与应用实例.北京:电子工业出版社,2010.1

[3]胡庆钟,李小刚,吴钰淳.TMS320C55x DSP原理、应用和设计.北京:机械工业出版社,2005.10

[4]周霖.DSP系统设计与实现.北京:国防工业出版社,2003.10

[5]刘丽钧,周英钢,刘本伟.数字信号处理技术及其应用.北京:机械工业出版社,2004.12

相关主题
相关文档
最新文档