IIR与FIR滤波器设计与比较 - 图文
更新时间:2024-03-30 08:46:01 阅读量: 综合文库 文档下载
- iir数字滤波器设计推荐度:
- 相关推荐
DSP课程设计
实 验 报 告
FIR与IIR滤波的DSP 实现以及二者的比较
指导教师:高海林 院(系): 电信学院
设计人员: 白雪 学号:07211225 邵辰雪 学号:07211243
成绩: 工程设计50 报告20 评语:
指导教师签字: 日期:
答辩30 总分
目 录
一、设计任务书??????????????????????2
二、设计内容???????????????????????2
三、设计方案、算法原理说明????????????????2
四、程序设计、调试与结果分析???????????????11
五、设计(安装)与调试的体会???????????????32
六、参考文献???????????????????????34
2 / 35
一、设计任务书
在信号与信息处理中,提取有用信息就要对信号进行滤波。利用DSP可以实时地对信号进行数字滤波。本设计要求利用DSP的DMA方式进行信号采集和信号输出,同时对外部输入的信号进行数字滤波。在滤波时同时用fir与iir滤波器进行滤波,并比较二者的区别。
二、设计内容
(1) 对DMA进行初始化; (2) 对A/D、D/A进行初始化;
(3) 编写DMA中断服务程序,实现信号的实时滤波;
(4) 利用CCS信号分析工具分析信号的频谱成分,确定滤波器的参数,利用MATLAB设计数字滤波器,提取滤波器参数;
(5) 设计数字滤波算法,或调用DSPLIB中的滤波函数,实现对信号的fir滤波。
(6) 比较加不同窗和阶数时fir滤波器的滤波效果;
(7) 设计数字滤波算法,或调用DSPLIB中的滤波函数,实现对信号的iir滤波。
(8) 比较fir数字滤波器与iir数字滤波器的效果
三、设计方案、算法原理说明
(一)硬件原理:
McBSP是多通道缓冲串行口,他支持全双工通信,双缓冲数据寄存器,允许连续的数据流。支持传输的数据字长可以是8位、12位、16位、20位、24位或32位。并且内置u律和A律压扩硬件。
McBSP在结构上可以分为一个数据通道和一个控制通道。数据通道完成数据的发送和接受。控制通道完成的任务包括内部时钟的产生、帧同步信号产生、对这些信号的控制及多通道的选择等。控制通道还负责产生接口信号送往CPU,产生同步事件通知DMA控制器。
在CCS集成开发环境中,与McBSP相关的头文件有:regs54xx.h、mcbsp54.h。在这两个头文件中,定义了McBSP串行口的寄存器资源及使用方法。
TLC320AD50C是TI公司生产的SIGMA-DELTA型的16位A/D、D/A转换电路,他的采样速率最高可达22.05kb/s,内涵抗混叠滤波器和重构滤波器,属于模拟接口芯片(AIC),它有一个能与多种昂DSP芯片相连的同步串行通信接口,其采样速率课通过DSP编程来设置。在DAC之前有一个插值滤波器一保证输出信号平
3 / 35
滑,在ADC之后有一个抽取滤波器以提高输入信号的信噪比。AD50C片内还包括一个定时器(调整采样率和帧同步延时)和控制器(可编程的增益放大器,锁相环PLL,通信协议等)。AD50有28脚的塑料SOP封装(带DW后缀)和48脚的塑料扁平QFP封装(带PT后缀),体积较小,适用于便携设备。AD50C的工作温度范围是0-70摄氏度,单一5V电源供电或5V模拟电源和3.3V数字电源供电,最大功耗为120mW。
在CCS集成开发环境中,与TLC320AD50C CODEC相关的头文件是codec.h。在这个头文件中,定义了与ad50CODEC相关的枚举变量和库函数。除了可以调用codec.h中提供的库函数之外,还可以利用这些枚举变量自己重新编写codec函数,使用枚举变量相互产生所需要的ad50寄存器的初始化值。Codec.h中的库函数位于函数库dsk5402.lib和drv5402.lib中。 (二)滤波器的理论设计分析 1.直接存储器访问DMA:
直接存储器访问(Direct Memory Access,简称DMA)是C54x DSP非常重要的片上外设,
DMA控制器可以完成数据传输而不影响CPU,因此数据传输速度快。在要求信号实时采集和处理的系统中常采用DMA方式进行信号采集与传输。
本实验利用DMA通道2与McBSP1通道结合来读取A\\D转换数据,利用DMA通道3与McBSP1通道结合来将处理后的数据发送至D\\A。
当一组数据处理完后,将数据存放在存储区out_buffer+frame*0x100中,选择out_buffer+frame*0x100为DMA通道3传送数据首地址,并选择源地址工作在不调整模式。
2.IIR滤波原理:
IIR数字滤波器差分方程的一般形式为:
式中ai、bi为滤波系数。当bi全为零时,该滤波器为FIR数字滤波器;当bi不全为零时,则为IIR滤波器。IIR数字滤波器可用直接型、级联型和并联型三种基本结构实现,其基本组成单元如图1所示。
对于二阶IIR数字滤波器,其传递函数为: 器输出和输入关系为:
其中x(n)是输入序列,y(n)是输出序列,ai、bI为滤波
器系数。因此滤波器的输出可以用硬件乘法器和加法器实现。
在本实验中将IIR滤波器的系统函数H(z)分解为n个二阶IIR滤波器级联的形式进行运算,这样可以减小量化误差。
4 / 35
n时刻IIR数字滤波
3.IIR滤波函数
本实验信号滤波算法是直接从TMS320c54XDSPLIB库中调用IIR函数。
IIR函数调用格式:
iircas4(DATA *x,DATA *h,DATA *r,DATA **d, ushort nbiq, ushort nx); iircas5(DATA *x,DATA *h,DATA *r,DATA **d, ushort nbiq, ushort nx); iircas51(DATA *x,DATA *h,DATA *r,DATA **d, ushort nbiq, ushort nx); iir32(DATA *x,LDATA *h,DATA *r,LDATA **d, ushort nbiq, ushort nx); 其中,iircas32函数用于双精度IIR滤波器;iircas4函数用于二阶级联直接II型滤波器,每项含4个系数;iircas5函数用于二阶级联直接II型滤波器,每项含5个系数; iircas51二阶级联直接I型滤波器,每项含五个系数。
调用matlab产生滤波器系数时,由于a0始终为1,所以可以产生二阶级联型系数,每项调用a1,a2,b0,b1,b2五个系数。iircas5用于通过各部分的放缩系数使各部分增益小于1的情况同时防止溢出的情况。在IIR数字滤波器的实现中,直接II型相比直接I型节省了一半的延迟单元,因而成为IIR滤波器实现最常用的形式。
综上所述,我们采用irrcas5函数实现信号的滤波。 调用参数说明:
iircas5(DATA *x, DATA *h, DATA *r, DATA **dbuffer, ushort nbiq,ushort nx)
x[k]为输入数组,
h[k]为H(s)系数数组,按照a11 a21 b21 b01 b11 ....a1i a2i b2i b0i b1i的顺序输入,其中i为biquad的个数; r[nx]为输出数组, dbuffer为延迟数据区,
nbiq为H(s)分成二阶滤波器的个数 nx为输入长度.
相比较与其他几种调用函数, 4.Fir滤波原理:
假设FIR滤波器的单位脉冲响应为h[0]、h[1]、...、h[N-1],x[k]为待滤波的输入信号,则滤波器输出为y[k]=h[k]*x[k]=
进行信号滤波实际上师计算序列的线性卷积。在实验中滤波器单位脉冲响应h[k]是有限长N,而x[k]一般是外部输入的长序列,因而采用重叠像假发计算卷积。重叠相加法是求解段序列与长序列卷积的一种方法。首先将输入长序列分解为短序列,这些短序列分别于h[k]卷积,将每段计算结果中后N-1个数据保留在一个缓冲区中,以便于下一段卷积结果进行重叠相加。
5.FIR滤波函数
本实验信号滤波算法是直接从TMS320c54XDSPLIB库中调用FIR函数。 FIR函数调用格式:
oflag = short fir(DATA *x, DATA *h, DATA *r, DATA **dbuffer, ushort nh, ushort nx)
功能 用FIR滤波器对信号滤波 调用参数说明:
5 / 35
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通道的初始化 IIR DMA方式接收A/D数据,将数据存储 FIR 波形的产生 信号的滤波函数调用 经DMA输出 等待DMA接收中断 MATLAB中FDATOOL设计滤波器
利用硬件实现滤波器的信号滤波,就是将MATLAB所产生的系数,与被取样的实时信号进行运算。
将滤波器系数导入程序当中一般有两种方式:
一、是将MATLAB产生的系数,生成头文件,在程序中进行调用。
二、将MATLAB产生的系数写入数据段中,在程序中调用,此过程涉及到
IIR滤波器的系数被截取,量化,调整和量化误差的产生。 信号与滤波器系数的运算也有两种方法:
一、调用DSPLIB中的IIR、FIR调用函数。 二、利用C语言,编辑一段程序进行运算。
6 / 35
(四)系数的导入与量化
1. 头文件方式导入
在MATLAB中利用FDATOOL产生所需滤波器,选择菜单Targets一>Export to Code Composer Studio?IDE.打开Export to C Header File对话框,选择C header file,指定变量名(滤波器阶数和系数向量),输出数据类型可选浮点型或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的Export to C Header File方式来进行转化。
但是与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: 1 2 1
Denominator: 1
-1.195433962890738 0.69059892324149696 Gain:
0.12379124008768973
-------------------------- Section #2
-------------------------- Numerator: 1 2 1
10 / 35
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Denominator: 1
-0.94280904158206336 0.33333333333333343 Gain:
0.09763107293781749
-------------------------- Section #3
-------------------------- Numerator: 1 2 1
Denominator: 1
-0.84028692165132679 0.18834516088404471 Gain:
0.087014559808179473
-------------------------- Output Gain: 1
其中Numerator就是分子部分,也就是b,其中Deneminator就是分母部分也就是a,Gain就是增益,一般计算系数,只需将分子部分乘以各部分增益,在转化为定点数。分母部分只需将其转化为定点部分就可以了。但是,这个系数中,存在着一项a1<-1,就是第二部分的a1,所以直接转化,就会出现巨大的错误,就需要先对其进行量化,防止这个系数所造成的溢出情况。
Q14,Q15数据格式Q后的数字分别表示小数的位数,Q15表示的是15位小数,由于16位的系统,所以只有一位是标志位,其余的15位全部表示的是小数,所以Q15表示的数值范围近似于是(-1,1)。同理可见,Q14所表示的位数为14位,其数值范围近似为(-2,2)。于是MATLAB产生的浮点数的大小是不确定的,这要根据所设计的滤波器的系数产生。Q14浮点数向Q15定点数的转化,往往采取以下公式,
B=A/2*32767;
其中B为Q15格式,A位Q14格式。
B.系数的量化
由上面的IIR滤波器的理论分析可知其原理,D(n)作为中间变量,如果系数中出现了比1大或是比-1小的情况,如若存在在分子上面可以通过调整各部分增益来减少溢出的产生,就会造成IIR滤波器的溢出,而这大于1的系数往往存在在a1的系数上,无法类似于采用级联方式改变增益和衰减来调整,这对于DSP的影响是毁灭性的,所以IIR滤波器的系数量化是非常重要的。
11 / 35
经过查阅资料,对于滤波器的量化,一般采取将系数向量除以一个数,使他满足Q15数据格式的要求,一般这个数值要大于最大的系数,往往是2的幂,这样在进行转化的时候,能够减小因四舍五入截断时的误差。对于a1>1的情况,我才用了如下的公式来进行量化和数据格式转换:
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转换器的字长仅10 b或12 b。在软件程序中事先要把数据化为相同的字长位数,再送到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)、-l rts.lib等库文件。
(二)程序清单:
通过理解iir的基本原理,也可以通过c语言或是汇编语言进行编写,同样可以达到滤波的效果。
12 / 35
因为有调用函数,使用起来比此程序方便,所以只是用了函数来实现。 1.主程序: /*声明头文件*/
#include
/*****************************************************************************/ /* Function Prototypes */ /*****************************************************************************/
void delay(s16 period);
extern void DMAC2ISR();/*声明DMAC2ISR为外部函数*/
/*****************************************************************************/
/*全局变量的定义*/
/*****************************************************************************/
HANDLE hHandset;
unsigned int dmsefc, dmmcr, dmctr, src_addr, dst_addr; unsigned int dmpre, dmsrcp, dmdstp, dmidx0, dmidx1, dmfri0, dmfri1, dmgsa, dmgda, dmgcr, dmgfr;
/*给输入缓冲区建立字段 */
#pragma DATA_SECTION(inp_buffer,\int inp_buffer[0x200];
/*给输出缓冲区建立字段 */
#pragma DATA_SECTION(out_buffer,\int out_buffer[0x200];
/*为系数建立字段 */
#pragma DATA_SECTION(coeffs,\
/* iir,butterworth低通滤波器fs=16000 fc=2000Hz*/ int coeffs[15]={ -13765, 3085, 1425, 1425,
13 / 35
2851, -19585, 11314, 1756, 1756, 3513, -15446, 5461, 1846, 1846, 3693 };
/*fir hann低通fs=16000,fc=2000*/ //int coeff[16]={ -43, -178, -407, -353, 671, 2968, 5860, 7903, 7903,
5860, 2968, 671, -353, -407, -178, -43 }; #pragma DATA_SECTION(delaybuff,\int delaybuff[6]={0}; //int delaybuff[16]={0}
/* 给中断服务寄存器定义变量 */
int frame=0; int flag=0; int temp;
int currbuff = 0;
/* delayptr指针变量指向延迟缓冲区的首地址*/
int *delayptr1 = &(delaybuff[0]);
interrupt void DMAC2ISR();
/*****************************************************************************/
/*主程序*/
/*****************************************************************************/
void main() {
s16 cnt=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); /* DAC 15位模式*/
codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* ADC 15位模式 */
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 <<12));//与McBSP1接收事件同步 dmmcr = ((AUTOINIT_ENABLE << 15) | (DINM_ENABLE << 14) |
(IMOD_HALFBLOCK <<13) | (CTMOD_DEC <<12) | (INDEXMODE_NOMOD << 8) | (SPACE_DATA << 6) | (INDEXMODE_INC << 2) | (SPACE_DATA)); //设置传输控制模式寄存器DMMCR,帧结束DMA中断; //15bit AUTOINIT_ENABLE=1 使能自动初始化 //14bit DINM_ENABLE=1 根据IMOD位产生中断 //13bit IMOD_HALFBLOCK=1 帧和块结束时都产生中断 //12bit CTMOD_DEC=0 减量计数模式(多帧模式) //10-8bit INDEXMODE_NOMOD=000 源地址模式No modify //7-6bit SPACE_DATA=01 源地址空间为数据空间
//4-2bit INDEXMODE_INC=01 目的地址模式, 传输之后加1 //1-0bit SPACE_DATA=01 目的地址空间为数据空间
dmctr = 0xFF;//单元记数
src_addr = DRR1_ADDR(HANDSET_CODEC);//设置源地址 dst_addr = (unsigned int) &inp_buffer;//设置目的地址
dma_init(DMA_CH2, dmsefc, dmmcr, dmctr, SPACE_DATA, src_addr, SPACE_DATA, dst_addr);
/* 设置通道2帧数*/
DMA_FRAMECOUNT(DMA_CH2, 1);
/*为通道2输入设置全局自动初始化寄存器*/
dmgsa = src_addr; dmgda = dst_addr; dmgcr = 0xFF; dmgfr = 1;
/* 设置全局优先级和使能控制寄存器 */
16 / 35
dmpre = ((HIGH_PRIORITY << 10) | (INTSEL_01 << 6)); dmsrcp = SPACE_DATA; dmdstp = SPACE_DATA; dmidx0 = 0; dmidx1 = 0; dmfri0 = 0; dmfri1 = 0;
dma_global_init(dmpre, dmsrcp, dmdstp, dmidx0, dmidx1, dmfri0, dmfri1, dmgsa, dmgda, dmgcr, dmgfr);
/* 通道 2使能 */
DMA_ENABLE(DMA_CH2);
/* 开始前端串行端口接收数据流*/
temp = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC);
/* 通道2中断使能 */
INTR_ENABLE(DMAC2);
/* 全局中断使能 */
INTR_GLOBAL_ENABLE;
/* 等待中断 */
for(;;); }
/*****************************************************************************/
/*延迟 */
/*****************************************************************************/
void delay(s16 period) {
int i, j;
for(i=0; i for(j=0; j 17 / 35 2. 终端服务程序dma2isr.c代码及分析 #include extern void delay(s16 period); extern unsigned int channel; /*DMA通道数*/ extern unsigned int dmsefc; /*设置同步时间和帧计数寄存器值*/ extern unsigned int dmmcr; /*设置模式控制寄存器值*/ extern unsigned int dmctr; /*设置单元计数寄存器值 */ extern unsigned int src_page; /*设置源页寄存器值 */ extern unsigned int src_addr; /*设置源地址寄存器值 */ extern unsigned int dst_page; /*设置目的页寄存器值 */ extern unsigned int dst_addr; /*设置目的地址寄存器值*/ extern int inp_buffer[0x200]; extern int out_buffer[0x200]; extern int coeffs[16];/*若是iir滤波器,需要改为coeffs[15]*/ extern int delaybuff[16]; /*若是iir滤波器,需要改为delaybuff[6]*/ extern int frame; extern int flag; extern int currbuff; extern int *delayptr1; int L=0; void init_dma3(void) { while(DMPREC&0x0008) {}; //DMA3的传送是否结束 /* 初始化通道3 */ dmsefc = ((DSYNC_REVT1 <<12)); dmmcr = 0x4141; dmctr = 0xFF; //256 单元/帧 src_addr = (unsigned int) &out_buffer+((unsigned int)frame*0x100); dst_addr = DXR1_ADDR(HANDSET_CODEC); dma_init(DMA_CH3, dmsefc, dmmcr, dmctr, SPACE_DATA, src_addr, SPACE_DATA, dst_addr); /* 设置通道3的帧数 */ DMA_FRAMECOUNT(DMA_CH3, 0); //2 frame/block /* 使能通道3 */ DMA_ENABLE(DMA_CH3); } interrupt void DMAC2ISR(void) { int *p_inp,*p_out; p_inp=inp_buffer+frame*0x100; 18 / 35 p_out=out_buffer+frame*0x100; //iircas5(p_inp,coeffs,p_out,&delayptr1,3,256);/*调用IIR滤波函数*/ fir(p_inp,coeffs,p_out,&delayptr1,16,256);/*调用FIR滤波函数*/ init_dma3(); frame^=1; } 3.中断向量C5402vec.asm代码及其分析 .title \ .ref _c_int00, _DMAC2ISR .sect \ RESET: BD _c_int00 ; 初始化CPU寄存器,分支指向_c_int00,BD占2个字节 NOP NOP NMI: BD NMI ; ~NMI NOP NOP ********************************************************************* 软件S/W中断 ********************************************************************* SINT17 BD SINT17 NOP NOP SINT18 BD SINT18 NOP NOP SINT19 BD SINT19 NOP NOP SINT20 BD SINT20 NOP NOP SINT21 BD SINT21 NOP NOP SINT22 BD SINT22 NOP NOP 19 / 35 SINT23 BD SINT23 NOP NOP SINT24 BD SINT24 NOP NOP SINT25 BD SINT25 NOP NOP SINT26 BD SINT26 NOP NOP SINT27 BD SINT27 NOP NOP SINT28 BD SINT28 NOP NOP SINT29 BD SINT29 NOP NOP SINT30 BD SINT30 NOP NOP ********************************************************************* 其他中断 ********************************************************************* INT0: BD INT0 NOP NOP INT1: BD INT1 NOP NOP INT2: BD INT2 NOP NOP TINT0: BD TINT0 NOP 20 / 35 NOP BRINT0: BD BRINT0 NOP NOP BXINT0: BD BXINT0 NOP NOP DMAC0: BD DMAC0 NOP NOP TINT1: BD TINT1 NOP NOP INT3: BD INT3 NOP NOP HPINT: BD HPINT NOP NOP DMAC2: BD _DMAC2ISR ;BRINT1/DMAC2 NOP NOP DMAC3: BD DMAC3 NOP NOP DMAC4: BD DMAC4 NOP NOP DMAC5: BD DMAC5 NOP NOP 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窗: 系数:const int16_T B[7] = { 278, 2286, 8029, 11582, 8029, 2286, 278}; 28 / 35 Han窗: 系数:const int16_T B[7] = { 0, 1954, 8291, 12278, 8291, 1954, 0 }; Blachman窗: 系数:const int16_T B[7] = { 0, 1179, 8081, 14247, 8081, 1179, 0 }; 29 / 35 Iir:6阶:同样的输入信号 int coeffs[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的采样率对于自身滤波效果的影响分析 Iir 8000采样率 {0,566,8333,8333,16665, 0,19293,1272,1272,22544, 0,5623,11082,11082,22164, } 31 / 35 Iir 3阶 7500采样率 Iir 4阶 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滤波器设计的时候,由于在教材上有相关的参考程序,所以实验进行得很顺利,之后我们也进行了一系列的加窗后的滤波现象的分析比较。 直到我们开始着手进行IIR滤波器设计时,问题出现了。由MATLAB产生的IIR滤波器的系数无法想FIR的一样直接导入程序中。在经过了漫长繁复的资料查找过程之后我们终于解决了系数导入的相关问题,即系数归一化以及有限字长效应等,终于成功的完胜的IIR滤波器的设计。 这次实验应该说是我所经历的小学期课程中难度系数最高,实验过程最为复杂的一次,虽然没有焊接电路那种细致并需要绝对的耐心的手工制作,但是实验里所需要的是对于几种不同的语言的熟练运用以及程序编辑时的缜密的逻辑能力以及分析能力。讨论在这次实验中很有帮助,它可以纠正错误的想法,启发新的方法。而每次上机实验都会出现各种各样的不同情况。有时进入就会出错,板子没插好,但是再运行时就能正常进入。有时添加不进去头文件,有时是无法导入x.out文件,却发现忘记了重新编译。到了操作后期这种小毛病终于不再出现。为了查询所需要的资料,我们充分利用了网络、图书馆等资源。 此次实验,一方面巩固了我们对DSP知识知识的掌握,对CCS软件的应用有了进一步的了解,还锻炼了我们的细心程度和团队合作能力。在实验中,我们二人分工合作,并与其他小组相互讨论和交流,对实验的整个要求都有了一个很好的了解。可以说我们这次实验是比较成功的。 白雪: 这次课程设计我们下了很多功夫,但同时也体会到了DSP的强大。在原来,滤波之类的只是在书本上见到过,我们会做很多滤波器的题,实践最多也只是在MATLAB上模拟一下,但从没过做过如此直接的滤波实验。 刚开始的时候由于书上没有写有关IIR滤波器的任何东西,于是选择了制作IIR,但是开始做了之后才发现,并不像FIR滤波器那么简单,一开始只认为调用个系数就可以。做了之后就发现,许多的问题不断出现,系数的归一化会造成量化误差,致使极点移动,这样设计时稳定的系统会变为不稳定的系统,所以系数的调整就耗去了许多天的时间,一直没有弄明白这些数制以及量化的问题。当解决了量化的问题,却发现硬件无法实现,调整系数顺序后,还是不对,接下来发现了音量大小对于整个系统的影响问题。终于解决这一系列问题之后,才开始进行实验的主体部分,就是IIR设计。在解决问题上,我们去图书馆,上网查找,得到许多不同的解决办法,不知正确与否只能一个一个的试。另外,采样频率,阶数这些数值在做题时我都不是很重视,当运用到实践时我才感到他们的重要性。还有溢出的问题,我们要时刻考虑芯片所能处理的最大数,这是我们原来做题时完全没有想到的问题。 我们把每个书本上的每个知识都学到了,但是真的用起来的时候并不就是像书上写的那么理想化。现实中有许多的东西是书本上学不到的,经验就是这些之一。在查阅这些资料时候,国内的资料不是收费就是没有提到,我只好上国外的网站上看,我看得那个论坛就是有许多书本上没有写到的东西,我从中获得一点 34 / 35 启发,才解决了系数量化的问题,不然这个问题不知道要想多久。所以,动手做做东西,把学到的知识联系到现实当中,是我这次试验得到的最真切的体会。 六、参考文献 [1]钱满义.高海林.《DSP技术及其应用》 [2] 王秀芳.关凌涛.《基于MatLab与DSP的滤波器的快速设计方法》. [3] 张晓光.徐钊.《IIR数字滤波器的优化设计和DSP实现》.江苏:中国矿业大学. [4] 郝小江.唐宇.《IIR数字滤波器设计及DSP实现》.四川:攀枝花学院电气信息工程学院. [5] 刘舒帆.张小虹.任姝婕.《IIR数字滤波器在定点DSP中可实现性的仿真分析》. [6] 王飞.《基于DSP技术的IIR数字滤波器的设计》. [7] 武卫华. 《基于matlab 的IIR数字滤波器的设计》. [8] 王新金. 顾冬华.《基于定点DSP的IIR滤波器溢出分析》. [9] 杨达亮.王巨丰.《基于DSP的IIR数字滤波器的设计与实现》. 相关网站:http://www.dsprelated.com http://www.hellowdsp.com http://www.ilovematlab.cn 35 / 35
正在阅读:
IIR与FIR滤波器设计与比较 - 图文03-30
婚宴新郎父亲祝酒词02-06
关于苏宁易购客户满意度的调查问卷10-11
统计学第七章12-22
八年级英语下册第六单元基础知识05-20
个人与团队管理课程网考练习题212-21
简论大学生创业面临的机遇与挑战10-15
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 滤波器
- 比较
- 图文
- 设计
- IIR
- FIR
- 培育和践行社会主义核心价值观活动总结
- 公安学下设二级学科目录及简介
- 2019版高考地理一轮复习 专题二 大气与气候 高频考点11 等温线的
- 贯彻执行领导干部操办婚丧喜庆事宜落实情况的汇报
- 《政府预算》课程习题
- 智能差压变送器的一般应用
- 自考外国文学史复习总结
- 2013年9月份考试结构力学(二)第一次作业
- 世界七大数学难题与Hilbert的23个问题
- 硬膜外血肿的护理查房
- 百花齐放开启幼儿阅读兴趣
- C12022财富管理系列课程之二投资组合管理和久期90分
- 操作题汇总
- 全国各地处理历史遗留违章建筑的基本做法
- 2015年中国葛根投资策略报告 - 图文
- 常见光引发剂
- MATLAB 函数解优化问题
- 多种企业介绍范文
- 关于舟山市海洋经济发展中存在的 - 图文
- 2018部编人教版语文七年级下册复习资料(最新添加文体知识)