IIR与FIR滤波器设计与对比_第1页
IIR与FIR滤波器设计与对比_第2页
IIR与FIR滤波器设计与对比_第3页
IIR与FIR滤波器设计与对比_第4页
IIR与FIR滤波器设计与对比_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——IIR与FIR滤波器设计与对比DSP课程设计

实验报告

FIR与IIR滤波的DSP实现以及二者的比较

指导教师:高海林院(系):电信学院

设计人员:白雪学号:07211225邵辰雪学号:07211243

成绩:工程设计50报告20评语:

指导教师签字:日期:

辩论30总分

目录

一、设计任务书??????????????????????2

二、设计内容???????????????????????2

三、设计方案、算法原理说明????????????????2

四、程序设计、调试与结果分析???????????????11

五、设计(安装)与调试的体会???????????????32

六、x[nx]表示含有nx个实数的实输入信号向量;h[nh]表示含有nh个实数的系数向量,按自然顺序排列,即滤波器的单位脉冲响应。r[nx]表示含有nx个实数的输出向量;允许原位运算,即r=x。

dbuffer[nh]延迟钝冲区;对存储器的要求同h[nh]。nx向量x中实数的个数;nh向量h中系数的个数;

oflag=1有溢出;oflag=0无溢出

(三)设计流程图:

分派各数据段,并且给个数据段赋值A/D、D/A初始化IIR系数的量化、调整与变换DMA通道的初始化IIRDMA方式接收A/D数据,将数据存储FIR波形的产生信号的滤波函数调用经DMA输出等待DMA接收中断MATLAB中FDATOOL设计滤波器

利用硬件实现滤波器的信号滤波,就是将MATLAB所产生的系数,与被取样的实时信号进行运算。

将滤波器系数导入程序当中一般有两种方式:

一、是将MATLAB产生的系数,生成头文件,在程序中进行调用。

二、将MATLAB产生的系数写入数据段中,在程序中调用,此过程涉及到

IIR滤波器的系数被截取,量化,调整和量化误差的产生。信号与滤波器系数的运算也有两种方法:

一、调用DSPLIB中的IIR、FIR调用函数。二、利用C语言,编辑一段程序进行运算。

6/35

(四)系数的导入与量化

1.头文件方式导入

在MATLAB中利用FDATOOL产生所需滤波器,选择菜单Targets一>ExporttoCodeComposerStudio?IDE.开启ExporttoCHeaderFile对话框,选择Cheaderfile,指定变量名(滤波器阶数和系数向量),输出数据类型可选浮点型或32b、16b整型等。根据自己安装选择目标板板号和处理器号。单击OK。

保存该头文件,需指定文件名和路径,开启IIR工程文件夹,该滤波器系数头文件已含在工程中。该头文件用到MatLab中的tmwpytes.h,需把该文件也包含在工程中.还要在原文件中声明包含滤波器参数头文件.即:#include?头文件名称???include?tmwpytes.h??

然后编译、链接工程.添加的头文件自动在工程目录中显示.目标DSP自动为滤波器系数分派相应的存储空间。开启系数文件查看生成的滤波器系数,可看到系数是对称的,这由所选滤波器类型而定。

由于本次的设计的拓展部分主要以设计IIR滤波器为主要目标,IIR滤波器系数存在着格式转换和量化的问题,不能够直接导入到CCS中直接去进行硬件实现,这样会导致滤波器系数的信息被截断,信息丢失,导致滤波器无法实现。所以我采用其次种方法。

2.直接写入存储器

滤波器的系数可以用FDATOOL进行计算出来,也可以导出到MATLAB的

7/35

workspace中去计算量化。

我们所使用的DSK5402试验板是16位定点运算,而MATLAB所产生的系数,并不是定点数而是浮点数。所以需要将MATLAB所产生的浮点数进行转化,使其转换为浮点数,浮点数格式的导出:

8/35

一般在FIR滤波器中这种定点的转化都是使用MATLAB中FDATOOL的ExporttoCHeaderFile方式来进行转化。

但是与FIR不同的是IIR不一定是稳定的系统,即使稳定,也未必能够达到硬件实现。MATLAB提供的转化方法并没有对于越界的系数进行量化。例如:Sos=[1,2,1,1,-1.19,0.45]

本是一个稳定的高阶IIR滤波器的系数矩阵中的一维向量,表示直接II型级联形式的一部分。经过MATLAB的16位定点量化后成为了Sos=[32767,32767,32767,32767,-32768,14715]

成为了一个不稳定的系统,从而硬件实现就不可能了。A.系数的转化

MATLAB的带符号定点16位转化是,将所有大于1,小于-1的数值全部归一化,造成了巨大的量化误差,众所周知,IIR滤波器的实现过程中存在着反馈,于是累进量化误差越来越大造成了系统的不稳定。量化问题中不得不提的还有一个标准格式问题。由于MATLAB所产生的浮点系数并没有依照CCS中DSPLIB的IIR能够调用的数据格式。经过查阅资料以及屡屡的失败尝试积累出的经验,了解到我所要设计的IIR滤波器所需使用的IIRCAS5调用命令使用的是Q15数据格式,而MATLAB所产生的浮点值是Q14数据格式,而在进行定点转换时,MATLAB没有将Q14的数据格式量化,进行大误差归一化直接转化为Q15的定点形式所以造成硬件实现的失败。MATLAB产生的系数一般已经是满足ccs调用函数的second-order形式了。

9/35

一次滤波器为例,产生的系数为:

????????????????????

Section#1

Numerator:121

Denominator:1

-1.1954339628907380.69059892324149696Gain:

0.12379124008768973

Section#2

Numerator:121

10/35

??????????????????????

Denominator:1

-0.942809041582063360.33333333333333343Gain:

0.09763107293781749

Section#3

Numerator:121

Denominator:1

-0.840286921651326790.18834516088404471Gain:

0.087014559808179473

OutputGain:1

其中Numerator就是分子部分,也就是b,其中Deneminator就是分母部分也就是a,Gain就是增益,一般计算系数,只需将分子部分乘以各部分增益,在转化为定点数。分母部分只需将其转化为定点部分就可以了。但是,这个系数中,存在着一项a11的状况,我才用了如下的公式来进行量化和数据格式转换:

a=[];b=[];

a=a/2*32767*g;b=b/2*32767

其中,a为分母,b为分子;g为各项增益

这个公式所形成的矩阵就可以应用到IIRCAS5的数据格式要求中,减小了溢出的可能性。

C.误差分析

(1)对IIR数字滤波器的系数,采用定点Q0格式进行数据的处理,将引入系数量化误差;

(2)对输入的测试信号,采用定点Q0格式进行数据的处理,将引入输入信号的量化误差;

(3)由于使用的A/D,D/A转换器件为有限字长,如D/A转换器的字长仅10b或12b。在软件程序中事先要把数据化为一致的字长位数,再送到D/A转换器,也将引入量化误差。

(4)对数字滤波的运算过程编制相应的程序,其中滤波器选用直接型、级联型还是并联型,将产生不同的运算量化误差。

四、程序设计、调试与结果分析

本次试验使用的FIR与IIR滤波器程序主体大致一致,所以只是对fir_dma.c中的与IIR与FIR两种不同的滤波器的相关系数进行了修改,下面列出的是IIR滤波器的设计程序。

(一)准备工作:

需要将头文件等库函数都装入到指定位置:

1、drv5402.lib是软件仿真所用的仿真器所必需的库文件;2、dsk5402.lib是驱动DSK板所必需的库文件;

3、rts.lib,这个库提供目标DSP运行时间支持(runtime-support)。由于程序没有#include,因此本程序不需要头文件。

上图是编译成功的结果显示:无错误和警告!这是最终调试成功的结果,首次运行时有11个错误,主要是_cosx和_COSX的混淆,分号的误写等。

因此,本程序所使用的配置文件有:(1)、-c,即源程序文件;

(2)、-o,ifr_dma.out即输出文件(默认在Debug目录);(3)、-lrts.lib等库文件。

(二)程序清单:

通过理解iir的基本原理,也可以通过c语言或是汇编语言进行编写,同样可以达到滤波的效果。

12/35

由于有调用函数,使用起来比此程序便利,所以只是用了函数来实现。1.主程序:/*声明头文件*/

#include#include#include#include#include#include

/*****************************************************************************//*FunctionPrototypes*//*****************************************************************************/

voiddelay(s16period);

externvoidDMAC2ISR();/*声明DMAC2ISR为外部函数*/

/*****************************************************************************/

/*全局变量的定义*/

/*****************************************************************************/

HANDLEhHandset;

unsignedintdmsefc,dmmcr,dmctr,src_addr,dst_addr;unsignedintdmpre,dmsrcp,dmdstp,dmidx0,dmidx1,dmfri0,dmfri1,dmgsa,dmgda,dmgcr,dmgfr;

/*给输入缓冲区建立字段*/

#pragmaDATA_SECTION(inp_buffer,\intinp_buffer[0x200];

/*给输出缓冲区建立字段*/

#pragmaDATA_SECTION(out_buffer,\intout_buffer[0x200];

/*为系数建立字段*/

#pragmaDATA_SECTION(coeffs,\

/*iir,butterworth低通滤波器fs=16000fc=2000Hz*/intcoeffs[15]={-13765,3085,1425,1425,

13/35

2851,-19585,11314,1756,1756,3513,-15446,5461,1846,1846,3693};

/*firhann低通fs=16000,fc=2000*///intcoeff[16]={-43,-178,-407,-353,671,2968,5860,7903,7903,

5860,2968,671,-353,-407,-178,-43};#pragmaDATA_SECTION(delaybuff,\intdelaybuff[6]={0};//intdelaybuff[16]={0}

/*给中断服务寄放器定义变量*/

intframe=0;intflag=0;inttemp;

intcurrbuff=0;

/*delayptr指针变量指向延迟钝冲区的首地址*/

int*delayptr1=

interruptvoidDMAC2ISR();

/*****************************************************************************/

/*主程序*/

/*****************************************************************************/

voidmain(){

s16cnt=2;

/*需要用到的bois的部分定义*/

14/35

BSCR=0x8806;XPC=0;

PMST=0xA0;

brd_set_cpu_freq(100);TIMER_HALT(0);

brd_set_wait_states(7,7,9);TIMER_RESET(0);IMR=0;//阻止所有中断

if(brd_init_bios())return;

while(cnt--){

brd_led_toggle(BRD_LED0);//切换LED指示灯0的显示状态delay(1000);

brd_led_toggle(BRD_LED1);//切换LED指示灯1的显示状态delay(1000);

brd_led_toggle(BRD_LED2);//切换LED指示灯2的显示状态delay(1000);}

/*初始化codec*/

hHandset=codec_open(HANDSET_CODEC);/*给一个句柄*/

/*设置codec变量*/

codec_dac_mode(hHandset,CODEC_DAC_15BIT);/*DAC15位模式*/

codec_adc_mode(hHandset,CODEC_ADC_15BIT);/*ADC15位模式*/

codec_ain_gain(hHandset,CODEC_AIN_6dB);/*6dB的输入增益ADC*/

codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB);/*-6dB的输出衰减DAC*/

codec_sample_rate(hHandset,SR_16000);/*设置抽样频率为16000Hz*/

15/35

?/*清除DMAC2的中断标志*/

INTR_CLR_FLAG(DMAC2);

/*重置DMA通道*/

dma_reset_all();

/*初始化DMA通道2*/

dmsefc=((DSYNC_REVT1#include

externvoiddelay(s16period);

externunsignedintchannel;/*DMA通道数*/

externunsignedintdmsefc;/*设置同步时间和帧计数寄放器值*/externunsignedintdmmcr;/*设置模式控制寄放器值*/externunsignedintdmctr;/*设置单元计数寄放器值*/externunsignedintsrc_page;/*设置源页寄放器值*/externunsignedintsrc_addr;/*设置源地址寄放器值*/externunsignedintdst_page;/*设置目的页寄放器值*/externunsignedintdst_addr;/*设置目的地址寄放器值*/

externintinp_buffer[0x200];externintout_buffer[0x200];

externintcoeffs[16];/*若是iir滤波器,需要改为coeffs[15]*/

externintdelaybuff[16];/*若是iir滤波器,需要改为delaybuff[6]*/externintframe;externintflag;externintcurrbuff;externint*delayptr1;intL=0;

voidinit_dma3(void){

while(DMPREC//DMA3的传送是否终止/*初始化通道3*/

dmsefc=((DSYNC_REVT1

NOPBRINT0:BDBRINT0NOPNOP

BXINT0:BDBXINT0NOPNOP

DMAC0:BDDMAC0NOPNOP

TINT1:BDTINT1NOPNOP

INT3:BDINT3NOPNOP

HPINT:BDHPINTNOPNOP

DMAC2:BD_DMAC2ISR;BRINT1/DMAC2NOPNOP

DMAC3:BDDMAC3NOPNOP

DMAC4:BDDMAC4NOPNOP

DMAC5:BDDMAC5NOPNOP

21/35

(三)程序调试:

首先测试IIR滤波器与FIR滤波器是不是都能够使用并且能够正常滤波,首先利用matlab的sptool进行仿真试验,看是不是存在溢出或是不稳定。产生的1000Hz和4500Hz的混频信号。Fs=16000Hz

利用16阶fir滤波器滤出来的效果,可见fir滤波器参数可以正常使用。

滤波器的幅度相应:

22/35

6阶iir低通butterworth滤波器的滤波效果,不存在溢出

IIR滤波器的幅度相应

23/35

接下来用DSK5402来试验了一下,进行了对比。利用ccs中的graph工具就可以对这些信号的频谱和时域波形就行观测。声源软件使用goldwave。并通过其中的“表达式计算器〞的方法产生混频信号:

24/35

在开启工程后,对工程进行加载同文件、库文件,并成功编译之后,通过View——>Graph功能观测输入输出信号:

FIR的输入信号,输出信号和频谱。

时域波形:

25/35

频域滤出前后对比

IIR的输入信号,输出信号和频谱。

26/35

可见现实中,fir与iir的滤波效果都可以十分的接近理想中的状况。只是在IIR的滤波器的量化是还是存在的增益的改变,无法满足理想的状况,尝试增大音量来调整增益状况,就会发生如下的状况:

系统的输出出现了溢出,是dsp无法实现IIR滤波器,并且发现,由于使用的是

27/35

goldwave产生的信号,所以,计算机的声道设置必需是一端输出。关于音量屡屡试验以及失败的经验,由于板子的存储位数的原因,音量不能太大。音量过大导致了系统的不稳定,导致dsp的无法实现。

(四)滤波器的性能对比:

Fir:6阶输入:sin(2000*pi*t)+sin(16000*pi*t)

Hamming窗:

系数:constint16_TB[7]={

278,2286,8029,11582,8029,2286,278};

28/35

Han窗:

系数:constint16_TB[7]={

0,1954,8291,12278,8291,1954,0};

Blachman窗:

系数:constint16_TB[7]={

0,1179,8081,14247,8081,1179,0};

29/35

Iir:6阶:同样的输入信号

intcoeffs[15]={-13767,3086,1425,1425,2851,-19585,11314,1756,1756,3513,-15446,5461,1846,1846,3693};

30/35

这些对比可见在较低阶数的时候IIR的滤波器的性能明显强于FIR的效果,但是再设计过程中唯一的缺陷就在系数的量化时存在很大的误差,并且增益不是很好控制,并且有可能存在着溢出现象。对于高阶数的比较,由之前的16阶FIR滤波器已经很明显的看出来,FIR滤波器的滤波效果十分的完美。在进行较高阶数的比较的时候,阶数过高导致IIR的滤波器变得不稳定,已经不能够在DSP进行硬件实现,就并没有进行截图比较。

(五)IIR的采样率对于自身滤波效果的影响分析

Iir8000采样率

{0,566,8333,8333,16665,0,19293,1272,1272,22544,0,5623,11082,11082,22164,}

31/35

Iir3阶7500采样率

Iir4阶12000采样率

32/35

滤波效果明显不如之前取样率为16000的时候,并且观测其幅度相应,其衰减的增加趋势已经放缓了大量,其他两幅是在不同阶数和在不同采样率时的幅度相应,可见,采样频率对于IIR的影响是十分大的。

可以知道,IIR比较适合在采样率较高,且阶数较小的时候使用。

(六)试验结论:

一、IIR数字滤波器是针对采样率固定的系统设计的,更改系统或系统采样率改变时应重新设计。

二、用到的数据存储单元,程序开始时应对这些单元进行初始化。假使要进行连续滤波,应保存上一次滤波的结果。

三、IIR数字滤波器的滤波结果会引起相位的延迟,故对相位严格要求的场合,需加全通网络进行较正,或选用FIR滤波器实现滤波功能。

四、对于IIR系数的溢出问题,可以采取一下几种措施:

A、采用级联型,对增益进行调整。B、对系数进行量化。

C、对CCS库函数的源程序进行修改,使其满足FDATOOL中产生的系数,就可直接调用。

五、设计IIR的时候,不能够使IIR得取样频率过低,否则硬件无法实现,一般要保证Fc/Fs>0.01,并且在这个比值比较靠近1的时候,DSP也是无法实现的。

六、在IIR滤波器的设计思路中,与FIR的不同一点是,一定要在量化过后通过MATLAB来观测其是否稳定。

七、由于IIR得误差问题,一般不采用较高的阶数来实现,一是不稳定的可能性增加,二是误差会不断的积累和扩大,已造成不稳定。

八、对于FIR,IIR,较小阶数时候滤波器的效果来说,IIR要好于FIR,且运算速度是十分快的,对于较大阶数还是要使用FIR滤波器,稳定且效果是十分好的。

九、对于频率较为接近的两个信号,一般采用FIR的高阶滤波器,这样过渡带会变得很窄并且阻带的衰减会十分大。把两个信号区分出来。

五、设计(安装)与调试的体会

邵辰雪:

33/35

通过此次试验设计,我们基本了解了DSP的内部资源以及各部件的作用。通过应用DSP算法实现通过FIR及IIR两种不同的滤波器对信号进行滤波的试验过程,使我们熟悉了使用DSP工程的建设以及应用于DSP系统的C语言的编写,学会了通过MATLAB进行滤波器设计并导出我们所需要的相关系数以及头文件,并对CCS5000对程序的完整调试过程有了进一步的理解。

在试验初期,即进行FIR滤波器设计的时候,由于在教材上有相关的参考程序,所以试验进行得很顺利,之后我们也进行了一系列

温馨提示

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

评论

0/150

提交评论