DSP实验报告.docx

上传人:b****5 文档编号:3989372 上传时间:2022-11-27 格式:DOCX 页数:33 大小:1.35MB
下载 相关 举报
DSP实验报告.docx_第1页
第1页 / 共33页
DSP实验报告.docx_第2页
第2页 / 共33页
DSP实验报告.docx_第3页
第3页 / 共33页
DSP实验报告.docx_第4页
第4页 / 共33页
DSP实验报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

DSP实验报告.docx

《DSP实验报告.docx》由会员分享,可在线阅读,更多相关《DSP实验报告.docx(33页珍藏版)》请在冰豆网上搜索。

DSP实验报告.docx

DSP实验报告

 

DSP课程实验报告

—利用DSP实现实时信号IIR滤波

 

学院:

指导教师:

学生:

班级:

 

DSP课程设计:

实现信号IIR滤波---结题报告

在信号与信息处理中,提取有用信息需要对信号进行滤波。

借助DSP数字信号处理器的高速运算能力,可以实时地对信号进行数字滤波。

本设计要求利用DSP的DMA方式进行信号采集和信号输出,同时对外部输入的信号进行数字滤波,用DSP实验工具箱实现IIR信号滤波器,调用55xdspx.lib中的IIR滤波程序iircas5(),实现信号IIR滤波仿真。

一、实验目的

掌握DSP集成开发环境CCS的使用和调试方法。

掌握DSP片上资源和片外资源访问的基本方法。

通过对DSP处理器及CODEC的编程,培养C语言编程能力。

学会利用Matlab对信号进行IIR滤波,掌握Matlab的信号仿真方法。

掌握利用DSP实现信号实时IIR滤波设计方法。

提高使用DSP硬件平台实现数字信号处理算法的能力。

二、实验内容

(1)用MATLAB软件产生一个两个叠加的正弦信号,并采样生成输入数据;

(2)使用MATLAB软件中的工具箱设计一个IIR滤波器,获得相应系数值;

(3)在CCStudiov3.3软件中建立仿真工程;

(4)在DMA中断程序中,调用DSPLIB中的IIR滤波程序iircas5()实现对输入信号的滤波,观察输入输出波形。

发挥部分

(1)比较加不同窗和阶数时滤波器的滤波效果。

(2)测试所设计滤波器的幅频特性和相频特性,并与MATLIB下的设计结果进行比较。

三、实验原理

IIR滤波原理

IIR数字滤波器差分方程的一般形式为:

式中ai、bi为滤波系数。

当bi全为零时,该滤波器为FIR数字滤波器;当bi不全为零时,则为IIR滤波器。

IIR数字滤波器可用直接型、级联型和并联型三种基本结构实现,其基本组成单元如图1所示。

图1.1IIR滤波器的二阶结构

对于二阶IIR数字滤波器,其传递函数为:

n时刻IIR数字滤波器输出和输入关系为:

其中x[k]是输入序列,y[k]是输出序列,ai、bI为滤波器系数。

因此滤波器的输出可以用硬件乘法器和加法器实现。

在本实验中将IIR滤波器的系统函数H(z)分解为n个二阶IIR滤波器级联的形式进行运算,这样可以减小量化误差。

IIR滤波函数

IIR函数调用格式:

iircas5(DATA*x,DATA*h,DATA*r,DATA**d,ushortnbiq,ushortnx);

iircas5函数用于二阶级联直接II型滤波器,每项含5个系数;调用matlab产生滤波器系数时,由于a0始终为1,所以可以产生二阶级联型系数,每项调用a1,a2,b0,b1,b2五个系数。

iircas5用于通过各部分的放缩系数使各部分增益小于1的情况同时防止溢出的情况。

在IIR数字滤波器的实现中,直接II型相比直接I型节省了一半的延迟单元,因而成为IIR滤波器实现最常用的形式。

综上,我们采用irrcas5()函数实现信号的滤波。

调用参数说明:

iircas5(DATA*x,DATA*h,DATA*r,DATA**dbuffer,ushortnbiq,ushortnx)

其中:

x[k]为输入数组;

h[k]为H(z)系数数组,按照a11a21b21b01b11....a1ia2ib2ib0ib1i的顺序输入,其中i为biquad的个数;

r[nx]为输出数组;

dbuffer为延迟数据区;

nbiq为H(z)分成二阶滤波器的个数;

nx为输入长度。

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

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

二、将MATLAB产生的系数写入数据段中,在程序中调用,此过程涉及到IIR滤波器的系数被截取,量化,调整和量化误差的产生。

信号与滤波器系数的运算也有两种方法:

一、调用DSPLIB中的IIR、调用函数。

二、利用C语言,编辑一段程序进行运算。

系数的导入与量化

滤波器的系数可以用FDATOOL进行计算出来,也可以导出到MATLAB的workspace中去计算量化。

系数的转化

经过查阅资料,对于滤波器的量化,一般采取将系数向量除以一个数,使他满足Q15数据格式的要求,一般这个数值要大于最大的系数,往往是2的幂,这样在进行转化的时候,能够减小因四舍五入截断时的误差。

对于a1>1的情况,我才用了如下的公式来进行量化和数据格式转换:

a=[];

b=[];

a=a/2*32767*g;

b=b/2*32767

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

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

四、实验步骤

本设计可以分为两部分:

(1)信号仿真

(a)首先利用Matlab的fdatool工具箱设计滤波器,在sptool工具箱进行信号分析与滤波。

(b)利用CCS进行信号滤波算法的仿真,即利用simulator进行仿真。

调用DSPLIB库中的

iir()滤波函数实现信号FIR滤波,或自行编写IIR滤波程序实现信号IIR滤波。

(2)利用Emulator在DSP实验板上采用DMA方式实现信号采集与传输。

(3)在DSP实验板上,结合IIR滤波算法,实现信号的实时IIR滤波。

4.1MATLAB部分

4.1.1信号叠加与其参数

产生两个正弦信号相加的波形,得到一个混合有1000Hz和4500Hz频率的正弦信号。

f1=1000;

f2=4500;

fs=16000;//采样率为16000Hz

N=256;//采样点为256个

A=1000;//幅值1000

t=(0:

N-1)/fs;

x=A*sin(2*pi*f1*t)+A*sin(2*pi*f2*t);//采集信号

plot(t,x);

图形如下:

m(find(m<0))=m(find(m<0))+65536;//将采样数值中的负值取反

y=fix(x);//将采样值去整

a=dec2hex(y);//把采样值转变成16进制的数值

采样取整后转化为16进制输出为:

数据为:

val=

00000

00553

00144

0005C

006AB

005C7

0FF27

000BB

003E8

0FDBE

0F9A1

0FE8F

0FEDB……等一系列值

4.1.2IIR滤波器的生成,并且提取参数

利用fdatool工具设计如图所示的滤波器:

IIRBW型,6阶,Fs=16000Hz,Fc=2000Hz

选中analysis中的filtercoefficients,可以看到滤波器的具体参数,参数无法复制,选择export,生成两个workspace,“SOS”存放分子分母系数,“G”存放增益值。

Sos参数为:

SOS=

1.00002.00001.00001.0000-1.27340.8008

1.00002.00001.00001.0000-1.07050.5140

1.00002.00001.00001.0000-0.94280.3333

1.00002.00001.00001.0000-0.86760.2270

1.00002.00001.00001.0000-0.83270.1776

G的参数为:

G=

0.1319

0.1109

0.0976

0.0898

0.0862

1.0000

将滤波器参数量化取整,程序为:

fori=1:

3

forj=1:

3

a1(i,j)=SOS(i,j)/2*32767*G(i,1);

end

end

//量化分母,并存放在a1数组中

fori=1:

3

forj=4:

6

b1(i,j-3)=SOS(i,j)/2*32767;

end

end

//量化分子,并存放在b1数组中

a2=fix(a1);

b2=fix(b1);

取整量化以后的分子分母如下所示:

分母:

a2=

216043202160

181636321816

159931991599

分子:

b2=

16383-2086213119

16383-175398420

16383-154465461

最后,按照a11a21b21b01b11....a1ia2ib2ib0ib1i的顺序得到滤波器的系数向量是:

{-13767,3086,1425,1425,2851,

-19585,11314,1756,1756,3513,

-15446,5461,1846,1846,3693};

将数据转化为16进制:

分母:

q=dec2hex(a2)

q=

0870

0718

063F

10E0

0E30

0C7F

0870

0718

063F

分子:

m=b2;

m(find(m<0))=m(find(m<0))+65536;

p=dec2hex(m)

p=

3FFF

3FFF

3FFF

AE82

BB7D

C3AA

333F

20E4

1555

4.1.3利用滤波器进行滤波

采用sptool工具进行,输入信号和滤波器均为上提提到的正弦信号与滤波器

输入信号:

滤波器特性:

滤波输出波形:

4.2CCStudio仿真部分:

4.2.1IIR仿真部分:

建立工程,名为iirtest,

将这三个基本文件55x,data.h,IIRfilter.C复制在新建的文件夹中,再进行相应的编译,装载程序,发现仍需要一些必要文件:

TMS320.H,rts55x.lib,dsplib.h,55xdspx.lib,发现可以通过编译、装载。

原始数据输入图形如下(地址为SINE_TABLE):

输入信号频谱如下:

输出波形(地址为out_buffer):

输出频谱:

下面列出simulator中仿真的各阶滤波器的结果:

生成虚拟输入测试信号的MATLAB程序如下:

f1=1000;

f2=4500;

fs=16000;%采样率为16000Hz

N=1024000;%采样点为256个

A=1000;%幅值1000

t=(0:

N-1)/fs;

x=A*sin(2*pi*f1*t)+A*sin(2*pi*f2*t);%采集信号

待滤波的测试信号波形如图所示:

图1

待滤波信号的为双频信号,f1=1000Hz,f2=4500Hz,如图所示:

图2

(1)使用6阶Fc为1500Hz的BW型iir滤波器,对测试信号进行滤波之后的时域波形如图所示:

图3

使用6阶Fc为1500Hz的BW型iir滤波器,对测试信号进行滤波之后的频谱如图所示:

图4

(2)四阶FC为1500Hz的BW滤波器滤波后时域波形如图所示:

图5

滤波后的频谱如图所示:

图6

(3)八阶截频为1500Hz的BW型滤波器滤波后输出时域波形如图所示:

图7

输出信号频谱如图所示:

图8

六阶Fc为1500Hz的切比雪夫I型滤波器滤波后输出信号波形和频谱如图所示

图9

六阶Fc为1500Hz的椭圆型滤波器滤波后输出信号波形和频谱如图所示

图10

比较图4和图6可知,相同类型的滤波器,阶数小的滤波器滤波性能较差;比较图4和图8,图9,图10可知,CCS中的iircas5()函数对非Butterworth滤波器和高阶的滤波器的实现能耐有限,引入了新的频率分量。

4.2DMA-split部分:

将dma-split中的程序进行部分修改,将原先的滤波函数fir变为iircas5函数,并且改正其相应的格式,并且将data.h中的滤波函数系数改为matlab中自行设计的参数,我们采用的是用虚拟示波器显示滤波的波形。

产生波形并观察:

虚拟信号源发生器,分别产生左右声道的信号,这种方法的好处是左右声道信号没有串扰,频谱很干净;缺点是,每一个声道都只能产生一个单频信号。

本次测试使用的滤波器系数为6阶BW低通滤波器(fc=2000),程序中对左声道数据不做任何处理,作为参考信号;用虚拟信号源产生输入信号,左声道4000Hz,右声道先为1000Hz,后改为6000Hz;用虚拟示波器观察DSP实验板的滤波效果如图1,图2所示其中下面的频谱为右声道经过滤波器后的信号。

图1

图2

4.3程序分析

1)缓冲区定义

#pragmaDATA_SECTION(gBufferXmtPing,"buffer_sect");

Int16gBufferXmtPing[BUFFSIZE];//TransmitPINGbuffer

#pragmaDATA_SECTION(gBufferXmtPong,"buffer_sect");

Int16gBufferXmtPong[BUFFSIZE];//TransmitPONGbuffer

#pragmaDATA_SECTION(gBufferRcvPing,"buffer_sect");

Int16gBufferRcvPing[BUFFSIZE];//ReceivePINGbuffer

#pragmaDATA_SECTION(gBufferRcvPong,"buffer_sect");

Int16gBufferRcvPong[BUFFSIZE];//ReceivePONGbuffer

#pragmaDATA_SECTION(leftXmtPing,"buffer_sect");

Int16leftXmtPing[BUFFSIZE];//TransmitPINGbuffer

#pragmaDATA_SECTION(leftXmtPong,"buffer_sect");

Int16leftXmtPong[BUFFSIZE];//TransmitPONGbuffer

#pragmaDATA_SECTION(leftRcvPing,"buffer_sect");

Int16leftRcvPing[BUFFSIZE];//ReceivePINGbuffer

#pragmaDATA_SECTION(leftRcvPong,"buffer_sect");

Int16leftRcvPong[BUFFSIZE];//ReceivePONGbuffer

#pragmaDATA_SECTION(rightXmtPing,"buffer_sect");

Int16rightXmtPing[BUFFSIZE];//TransmitPINGbuffer

#pragmaDATA_SECTION(rightXmtPong,"buffer_sect");

Int16rightXmtPong[BUFFSIZE];//TransmitPONGbuffer

#pragmaDATA_SECTION(rightRcvPing,"buffer_sect");

Int16rightRcvPing[BUFFSIZE];//ReceivePINGbuffer

#pragmaDATA_SECTION(rightRcvPong,"buffer_sect");

Int16rightRcvPong[BUFFSIZE];//ReceivePONGbuffer

由以上语句可知,为了实现实时性和左右声道数据的分别处理,定义了12个缓冲区。

其中gBufferXmtPing,gBufferXmtPong为数据的回放缓冲区;gBufferRcvPing,gBufferRcvPong为数据的接收缓冲区。

发送与接收缓冲区均采用pingpong冗余备份方式,以提高数据处理的实时性:

当DMA往接收缓冲区pingpong中一个缓冲区存数据时,cpu不用等待,而利用这段时间去处理pingpong中另一个一个缓冲区存数据,对发送缓冲区而言,道理一样。

对每一个接收发送pingpong缓冲区,均配以左右两个临时缓冲区,以将左右声道数据分开来,分别处理。

2)DMA初始化

DMA_ConfigdmaRcvConfig={/*configreceiver*/

DMA_DMACSDP_RMK(//ConfigDMACSDPregister

DMA_DMACSDP_DSTBEN_NOBURST,//DSTBEN=00b,目的方不突发(burstingdisabled)

DMA_DMACSDP_DSTPACK_OFF,//DSTPACK=0,目的方不打包

DMA_DMACSDP_DST_DARAMPORT1,/*DST=01b,目的方为DARAM,通过内部存储器口1*/

DMA_DMACSDP_SRCBEN_NOBURST,//SRCBEN=00b,目的方不突发(burstingdisabled)

DMA_DMACSDP_SRCPACK_OFF,//DSTPACK=0,源方不打包

DMA_DMACSDP_SRC_PERIPH,//SRC=11b,源方为外设,通过外设总线

DMA_DMACSDP_DATATYPE_16BIT//DATATYPE=10b,传输数据类型为16bit*/

),/*DMACSDP*/

DMA_DMACCR_RMK(//ConfigDMACCRregister

DMA_DMACCR_DSTAMODE_POSTINC,//DSTAMODE=01b,目的方寻址模式,访问后目的地址后增加酱每个元素传输完后,地址将增?

如果16bit,则地址增加2*/

DMA_DMACCR_SRCAMODE_CONST,/*SRCAMODE=00b,源方寻址模式,访问后源地址不变*/

DMA_DMACCR_ENDPROG_ON,//ENDPROG=1,DMA寄存器编程结束

DMA_DMACCR_WP_DEFAULT,/*WP=0,写记录(writeposting)禁止,DMA控制器等待来自存储器接口的完成写数的应答*/

DMA_DMACCR_REPEAT_OFF,/*REPEAT=0,自动初始化RepeatonlyifENDPROG=1*/

DMA_DMACCR_AUTOINIT_OFF,/*AUTOINIT=0,DMA控制器不进行自动初始化*/

DMA_DMACCR_EN_STOP,//EN=0,通道传输禁止

DMA_DMACCR_PRIO_LOW,//此DMA通道的优先级低

DMA_DMACCR_FS_DISABLE,//元素同步,而不是帧同步

DMA_DMACCR_SYNC_REVT1/*SYNC=101b,DMA同步事件是McBSP1接收事件*/

),/*DMACCR*/

DMA_DMACICR_RMK(

DMA_DMACICR_AERRIE_ON,/*AERRIE=1,当源或目的端口的地址发生错误,DMA向CPU发送通道中断请求*/

DMA_DMACICR_BLOCKIE_OFF,/*0,当前所有块已经传输到目的端口时,DMA不向CPU发送通道中断请求。

*/

DMA_DMACICR_LASTIE_OFF,/*0,最后一帧时,DMA控制器如何从?

DMA不向CPU发送通道中断请求。

*/

DMA_DMACICR_FRAMEIE_ON,//1,当前所有帧已经传输到目的端口时,DMA向CPU发送通道中断请求。

DMA_DMACICR_FIRSTHALFIE_OFF,//0,当前帧的前一半已经传输到目的端口时,DMA不向CPU发送通道中断请求。

DMA_DMACICR_DROPIE_OFF,//发生同步事件丢弃时,DMA不向CPU发送通道中断请求。

DMA_DMACICR_TIMEOUTIE_OFF//TIMEOUTIE=0.DMA不向CPU发送超时中断(TIMEOUTIE=1,传输在512个SYSCLK1周期未完成,产生超时中断)

),/*DMACICR*/

(DMA_AdrPtr)(MCBSP_ADDR(DRR11)),/*DMACSSAL,源地址低位(LOW),为McBSP1接收寄存器DRR11*/

0,/*DMACSSAU,源地址高位(HIGH),为0*/

NULL,/*DMACDSAL,目的地址低位(LOW)tobeloadedbysubmit*/

0,/*DMACDSAU*/

BUFFSIZE,/*DMACEN,元素个数*/

1,/*DMACFN,帧个数*/

/*如果

(1)ForCHIP_5510PG2_x(x=0,1,2),5509A,5502需要最后4个0参数;*/

/*如果

(2)ForCHIP_5509,CHIP_5510PG1_x(x=0,2)则只需要最后2个0参数*/

0,/*dmacsfifor

(1);DMACFIfor

(2);*///DMA通道源帧索引(for5502)

0,/*dmacseifor

(1);DMACEIfor

(2);*///DMA通道源元素索引(for5502)

0,/*dmacdfionlyfor

(1)*///DMA通道目的帧索引(for5502)

0/*dmacdeionlyfor

(1)*///DMA通道目的元素索引(for5502)

};

DMA_ConfigdmaXmtConfig={

DMA_DMACSDP_RMK(

DMA_DMACSDP_DSTBEN_NOBURST,

DMA_DMACSDP_DSTPACK_OFF,

DMA_DMACSDP_DST_PERIPH,//DST=11b,目的方为外设,通过外设总线

DMA_DMACSDP_SRCBEN_NOBURST,

DMA_DMACSDP_SRCPACK_OFF,

DMA_DMACSDP_SRC_DARAMPORT0,//SRC=00b,源方为DARAM,通过内部存储器口0

DMA_DMACSDP_DATATYPE_16BIT

),/*DMACSDP*/

DMA_DMACCR_RMK(

DMA_DMACCR_DSTAMODE_CONST,//DSTAMODE=00b,目的寻址模式为恒量,即每个元素传输完后,目的地址不变。

DMA_DMACCR_SRCAMODE_POSTINC,//SRCMODE=01b,源方寻址模式,访问后源地址后增加方式,即每个元素传输完后,地址将增加.如果16bit,则地址增加2

DMA_DMACCR_ENDPROG_ON,

DMA_DMACCR_WP_DEFAULT,

DMA_DMACCR_REPEAT_OFF,

DMA_DMACCR_AUTOINIT_OFF,

DMA_DMACCR_EN_STOP,

DMA

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1