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