DSP课程设计报告.docx
《DSP课程设计报告.docx》由会员分享,可在线阅读,更多相关《DSP课程设计报告.docx(32页珍藏版)》请在冰豆网上搜索。
DSP课程设计报告
实验流程及课程知识
§4.1[实验4.1]卷积运算
一、实验目的
1.掌握卷积运算的基本原理;
2.掌握用C语言编写DSP程序的方法。
二、实验设备
1.一台装有CCS软件的计算机;
2.DSP实验箱的TMS320C5410主控板;
3.DSP硬件仿真器。
三、实验原理
卷积是数字信号处理中经常用到的运算。
其基本的表达式为:
写实现程序时需要注意两点:
(1)序列数组长度的分配,尤其是输出数组y(n)要有足够的长度;
(2)循环体中变量的位置,即n和m的关系。
四、实验结果
1.自定义h、x、y的值,输出图形如下所示:
x(n):
h(n):
y(n):
2.Matlab程序:
对应的程序
closeall;clearall;
x=[15141312111098700000000000];
h=[22222222200000000000];
y=conv(h,x);
nx=0:
length(x)-1;
subplot(3,1,1);
stem(nx,x,'.');
title('x');
nh=0:
length(h)-1;
subplot(3,1,2);
stem(nh,h,'.');
title('h');
ny=0:
length(y)-1;
subplot(3,1,3);
stem(ny,y,'.');
title('卷积结果y');
对应的Matlab图形:
§4.2[实验4.2]相关运算
一、实验目的
1. 掌握相关系数的估计方法;
2. 掌握用C语言编写DSP程序的方法。
二、实验设备
1.一台装有CCS软件的计算机;
2.DSP实验箱的TMS320C5410主控板;
3.DSP硬件仿真器。
三、实验原理
相关系数是数字信号处理中的一个重要概念,包括自相关系数和互相关系数。
它们的定义是:
,k为相关系数的阶数;
和
。
根据相关系数的定义,需要求输入信号的期望值,这在实际上是不可能实现的。
因此,通常只根据一定长度的已知输入信号求相关系数的一个估计,这时采用以下的公式:
(设N为已知信号的长度)
和
既然是估计值,那么就存在一致性和有效性的问题,可以证明上面两式的估计是有偏估计,而以下的则是无偏估计:
(无偏估计),
(无偏估计)
本实验在上面公式的基础上实现各阶相关系数的估计。
3、实验结果
无偏相关估计:
有偏相关估计:
§4.3[实验4.3]快速傅里叶变换(FFT)实现
一、实验目的
1.掌握FFT算法的基本原理;
2.掌握用C语言编写DSP程序的方法。
二、实验设备
1.一台装有CCS软件的计算机;
2.DSP实验箱的TMS320C5410主控板;
3.DSP硬件仿真器。
三、实验原理
傅里叶变换是一种将信号从时域变换到频域的变换形式,是信号处理的重要分析工具。
离散傅里叶变换(DFT)是傅里叶变换在离散系统中的表示形式。
但是DFT的计算量非常大,FFT就是DFT的一种快速算法,FFT将DFT的N2步运算减少至(N/2)log2N步。
离散信号x(n)的傅里叶变换可以表示为
,
式中的WN称为蝶形因子,利用它的对称性和周期性可以减少运算量。
一般而言,FFT算法分为时间抽取(DIT)和频率抽取(DIF)两大类。
两者的区别是蝶形因子出现的位置不同,前者中蝶形因子出现在输入端,后者中出现在输出端。
本实验以时间抽取方法为例。
时间抽取FFT是将N点输入序列x(n)按照偶数项和奇数项分解为偶序列和奇序列。
偶序列为:
x(0),x
(2),x(4),…,x(N-2);奇序列为:
x
(1),x(3),x(5),…,x(N-1)。
这样x(n)的N点DFT可写成:
考虑到WN的性质,即
因此有:
或者写成:
由于Y(k)与Z(k)的周期为N/2,并且利用WN的对称性和周期性,即:
可得:
对Y(k)与Z(k)继续以同样的方式分解下去,就可以使一个N点的DFT最终用一组2点的DFT来计算。
在基数为2的FFT中,总共有log2(N)级运算,每级中有N/2个2点FFT蝶形运算。
单个蝶形运算示意图如下:
以N=8为例,时间抽取FFT的信号流图如下:
从上图可以看出,输出序列是按自然顺序排列的,而输入序列的顺序则是“比特反转”方式排列的。
也就是说,将序号用二进制表示,然后将二进制数以相反方向排列,再以这个数作为序号。
如011变成110,那么第3个输入值和第六个输入值就要交换位置了。
本实验中采用了一种比较常用有效的方法完成这一步工作__雷德算法。
四、实验结果
1.定义变量x的参数值,输出变量x及其FFT的波形图:
X(n)
FFT结果y(n)
2.对应Matlab源程序
closeall;clearall;
k=0:
63;
x=k;
y=fft(x,64);
subplot(2,1,1);
nx=0:
length(x)-1;
stem(nx,x);
title('x');
ny=0:
length(y)-1;
subplot(2,1,2);
stem(ny,abs(y),'.');
title('FFT½á¹ûy');
对应的图形如下所示:
§4.4[实验4.4]离散余弦变换(DCT)实现
一、实验目的
1. 掌握离散余弦变换的概念和实现方法;
2. 掌握用C语言编写DSP程序的方法。
二、实验设备
1. 一台装有CCS软件的计算机;
2.DSP实验箱的TMS320C5410主控板;
3.DSP硬件仿真器。
三、实验原理
尽管傅里叶变换具有很多优点,得到了广泛的应用,但是它也有缺点。
例如:
傅里叶变换需要计算的是复数而不是实数,一般进行复数运算要比进行实数运算费时得多。
如果采用其它合适的完备正交函数系来代替傅里叶变换所利用的正、余弦函数构成的完备正交函数系,就可以避免这种复数运算。
离散余弦变换就是基于实数的正交变换。
一维的离散余弦变换的定义如下:
式中F(k)为第k个余弦变换系数,f(x)为时域中的N点序列。
要进行离散余弦变换可以从它的定义出发,但这样做的计算量相当大,在实际应用中非常不便,因此需要一种快速算法。
首先,将f(x)进行延拓:
按照一维离散余弦变换的定义有:
由于
是fe(x)的2N点离散傅里叶变换,因此,在作离散余弦变换时,可以把长度为N的序列f(x)的长度延拓为2N的序列,然后对延拓的结果进行离散傅里叶变换,最后提取离散傅里叶变换的实部便是离散余弦变换的结果。
在作离散傅里叶变换时可以采用快速傅里叶变换方法(FFT)。
四、实验结果
修改FFT变换的长度N,分别取8和16,所示的窗口如下图所示:
N=8
N=16
§4.7[实验4.7]自适应滤波器(LMS)实现
一、实验目的
1.掌握自适应滤波器的原理;
2.掌握LMS算法的原理;
3.掌握用C语言编写DSP程序的方法。
二、实验设备
1. 一台装有CCS软件的计算机;
2.DSP实验箱的TMS320C5410主控板;
3.DSP硬件仿真器。
三、实验原理
图1
(图1)为自适应滤波器结构的一般形式,图中x(k)为输入信号,通过参数可调的数字滤波器后产生输出信号y(k),将输出信号y(k)与标准信号(或者为期望信号)d(k)进行比较,得到误差信号e(k)。
e(k)和x(k)通过自适应算法对滤波器的参数进行调整,调整的目的是使误差信号
最小。
反复进行上面过程,使滤波器逐渐掌握了输入信号和噪声的统计规律,并以此为根据自动调整自己的参数,从而达到最佳的滤波效果。
一旦输入信号的统计规律发生了变化,滤波器能够自动跟上输入信号的变化,自动调整滤波器的参数,这就是自适应滤波的原理。
自适应滤波器的结构可以采用FIR型或IIR型,由于IIR滤波器存在稳定性问题,因此一般采用FIR滤波器作为自适应滤波器的结构。
自适应FIR滤波器结构又可分为三种结构类型:
横向型结构(TransversalStructure)、对称横向型结构(SymmetricTransversalStructure)、格型结构(LatticeStructure)。
本实验所采用的是自适应滤波器设计中最常用的FIR横向型结构。
设w(i)为横向滤波器的一组系数,滤波器的输出与输入信号间的关系可以表示为:
自适应滤波器除了包括一个按照某种结构设计的滤波器,还有一套自适应的算法。
滤波器的参数就是依照这种自适应算法来自动调整的,最常用的自适应算法是最小均方误差算法,即LMS算法(LeastMeanSquare)。
LMS算法的目标是通过调整系数,使输出误差序列e(n)=d(n)y(n)的均方值最小化,并且根据这个判据来修改权系数。
当均方误差达到最小时,得到最佳系数w*。
为了较快地求得近似的最佳系数,可以采用最快下降法,也叫梯度算法,这是一种迭代运算。
在采用种种近似和代替后,最后可以导出如下公式:
式中的u是由系统稳定性和迭代运算收敛速度决定的自适应步长,u越小,则收敛越慢,但是u太大则会导致系统的不稳定性。
本实验就是以这个公式为基础实现自适应滤波器的。
关于算法的详细推导过程及参数的选择原则,请读者参考数字信号处理的有关资料。
四、实验原理
输出信号y(k)与标准信号(或者为期望信号)d(k)的比较
误差信号e(k)
§5.1[实验5.1]McBSP配置GPIO实验
一、实验目的
1.熟悉5410的指令系统;
2.熟悉配置GPIO的方法。
二、实验设备
1.一台装有CCS5000软件的计算机;
2.DSP实验箱;
3.DSP硬件仿真器。
三、实验原理
DSP5410能够使用的GPIO资源很少,片上现有的只有XF和BIO两个,如果需要使用较多的GPIO引脚,可以将McBSP口和HPI口配置为GPIO口使用,本实验是将McBSP2口配置为GPIO口,输出5个信号用发光二极管来显示。
模块由五个发光二极管和一个锁存器组成。
“0”“1”信号由5410模块McBSP口输入,锁存器的控制信号由5410模块片选经由CPLD模块译码后输出。
实验结果:
§5.2[实验5.2]数码管控制实验
一、实验目的
1.熟悉5410的指令系统;
2.熟悉74HC573的使用方法。
二、实验设备
1.一台装有CCS5000软件的计算机;
2.插上5410主控板的DSP实验箱;
3.DSP硬件仿真器。
三、实验原理
此模块由数码管和八个锁存器组成。
数码管为共阴极型的。
数据由5410模块的低八位输入,锁存器的控制信号由5410模块输出,但经由CPLD模块译码后再控制对应的八个锁存器。
注:
其中七片数据均由5410传输过去
实验结果:
§5.3[实验5.3]液晶显示屏(LCD)实验
一、实验目的
1.掌握液晶的使用方法;
2.掌握液晶信号之间时序的正确识别和引入。
二、实验设备
1.一台装有CCS5000软件的计算机;
2.插上5410主控板的DSP实验箱;
3.DSP硬件仿真器。
三、实验原理
1.液晶简介
1
/CS1
H/L
L:
选择芯片(左半屏)信号
2
/CS2
H/L
L:
选择芯片(右半屏)信号
3
GND
0
电源地
4
VDD
5V
+5V
5
VO
-----
液晶驱动电压
6
D/I
H/L
D/I=’H’,表示DB7——DB0为显示数据;
D/I=’L’,表示DB7——DB0为显示指令数据
7
R/W
H/L
R/W=’H’,E=’H’数据被读到DB7—DB0
R/W=’L’,E=’H’—>’L’,数据被写到IR或DR
8
E
H/L
R/W=’L’,E信号的下降沿锁存DB7--DB0
R/W=’H’,E=’H’,DDRAM数据独到DB7—DB0
9~16
DB0----DB7
H/L
数据线
液晶的使用注意事项:
(1)液晶分左右半屏,通过CS0,CS1控制,CS1或CS0一个置1的同时另一个置0,其中置1的将被选中;
(2)RS和RW配合使用
RS
R/W
Function
0
0
Instruction
1
Statusread(busycheek)
1
0
Datawrite(frominputregistertodisplaydataRAM
1
Dataread(fromdisplaydataRAMtooutputregister)
(3)向LCD里写指令或数据前应先写指令相应的位置,对行,列,页的选择写命令时,由于命令字的位都有标志,所以写时LCD会自动识别;
(4)E,每次写数据或指令前都是变高,写入数据或指令后使E变低锁存;
(5)液晶的扭曲度可以通过调节VDD和VO之间的可调电阻得到。
2.对于5410芯片I/O口有二类寄存器:
(1)控制寄存器和数据方向寄存器,使用方法如下:
首先确定引脚的功能,即IO控制器寄存器,为0表示IO功能,为1表示基本功能。
本试验使用IO功能。
(2)引脚被配置为IO功能,就需要确定它的方向:
输入还是输出。
为1表示是输出引脚,否则是输入引脚。
对于IO功能的输入或输出是通过读写相应的数据方向寄存器来实现。
输入引脚对应读操作;输出引脚对应写操作。
本试验只用写操作。
实验结果:
§5.7[实验5.7]普通语音A/D与D/A转换实验
一、实验目的
1.熟悉5410DSP的MCBSP的使用;
2.了解AD50的结构;
3.掌握AD50各寄存器的意义及其设置;
4.掌握AD50与DSP的接口;
5.掌握AD50的通讯格式;
6.掌握AD50的DA实验。
二、实验设备
1.一台装有CCS软件的计算机;
2.DSP实验箱;
3.DSP硬件仿真器;
三、实验原理
1.DSP的MCBSP接口基础
TMS320VC5402提供了三个高速、全双工、多通道缓存串行口。
它提供了双缓存的发送寄存器和三缓存的接收寄存器,具有全双工的同步或异步通信功能,允许连续的数据流传输;数据发送和接收有独立可编程的帧同步信号;能够与工业标准的解码器、模拟接口芯片或其它串行A/D与D/A设备(如AD50,AIC23)、SPI设备等直接相接;支持外部时钟输入或内部可编程时钟;每个串行口最多可支持128通道的发送和接收;串行字长度可选,包括8、12、16、20、24和32位;支持m律和A律数据压缩扩展。
McBSP通过7个引脚(DX、DR、CLKX、CLKR、FSX、FSR和CLKS)与外设接口。
DX和DR引脚完成与外部设备进行通信时数据的发送和接收,由CLKX、CLKR、FSX、FSR实现时钟和帧同步的控制。
由CLKS来提供系统时钟。
发送数据时,CPU和DMA控制器将要发送的数据写到数据发送寄存器DXR,在FSX和CLKX作用下,由DX引脚输出。
接收数据时,来自DR引脚的数据在FSR和CLKR作用下,从数据接收寄存器DRR中读出数据。
接收和发送帧同步脉冲即可以由内部采样速率产生器产生,也可以由外部脉冲源驱动,McBSP分别在相应时钟的上升沿和下降沿进行数据检测。
串行口的操作由串行口控制寄存器2SPCR和引脚控制寄存器PCR来决定;接收控制寄存器RCR和发送控制寄存器XCR分别设置接收和发送的各种参数,如帧长度等。
2.AD50结构
AD50是TI公司生产的一个16位、音频范围(采样频率为2K~22.05KHZ)、内含抗混叠滤波器和重构滤波器的模拟接口芯片,它有一个能与许多DSP芯片相连的同步串行通信接口。
AD50C片内还包括一个定时器(调整采样率和帧同步延时)和控制器(调整编程放大增益,锁相环PLL,主从模式)。
AD50有28脚的塑料SOP封装(带DW后缀)和48脚的塑料扁平封装(带PT后缀),体积较小,适应于便携设备。
AD50的工作温度范围是0~70℃,单一5V电源供电或5V和3.3V联合供电,工作时的最大功耗为120mW。
AD50的内部结构简图如下:
最上面第一通道为模拟信号输入监控通道,第二通道为模拟信号转化为数字信号(A/D)通道,第三通道为数字信号转化为模拟信号(D/A)通道,最下面一路是AD50的工作频率和采样频率控制通道。
3.AD50内部寄存器及其作用
AD50内部有7个数据和控制寄存器,用于编程控制它们的工作状态。
寄存器0:
空操作寄存器。
寄存器1:
软件复位
软件掉电
选择16位或15位工作方式
硬件或软件二次通信请求方式的选择
寄存器2:
使能ALTDATA输入端
为ADC选择16/15位方式
寄存器3:
选择FS与FSD之间延迟SCLK的个数
告诉主机有几个从机被联上
寄存器4:
为输入和输出放大器选择放大器增益
选择N来设置采样频率,fs=MCLK/(128*N)或MCLK/(512*N)
在MCLK输入端使能外部时钟输入,并旁通内部的PLL
寄存器5,6:
保留
4.AD50与DSP的接口
AD50与TMS320VC5402是以SPI方式连接的。
AD50工作在主机模(M/S=1),提供SCLK(数据移位时钟)和FS(帧同步脉冲)。
TMS320VC5402工作于SPI方式的从机模式,BCLKX1和BFSX1为输入引脚,在接数据和发数据时都是利用外界时钟和移位脉冲。
5.AD50的通讯方式
AD50有两个通信方式一种是15+1方式软件申请第二串行通信的;另一种是用FC来切换通信方式。
软件不太可靠而且15位精度小,对于音频数据处理麻烦。
故我们采用拉高FC以达到切换通信方式。
普通AD/DA语音模块控制及原理图
实验结果
波形图
大作业
一、实验目的
1、掌握FIR低通滤波器的一种编程实现方法
2、进一步掌握CCS软件各项功能操作
3、进一步了解FIR体统滤波器的特性
4、
二、实验设备
1.一台装有CCS5000软件的计算机;
3.DSP硬件仿真器。
三、实验原理
1、
4、实验步骤
编写程序
系统函数:
#include
#ifdefWIN32
#include
#endif
#defineSAMPLEdouble/*definethetypeusedfordatasamples*/
voidclear(intntaps,SAMPLEz[])
{
intii;
for(ii=0;iiz[ii]=0;
}
}
intmain(void)
{
#defineNTAPS6
staticconstSAMPLEh[NTAPS]={1.0,1.2,2.1,3.3,4.2,5.1,5.4,};
staticSAMPLEh2[2*NTAPS];
staticSAMPLEz[2*NTAPS];
#defineIMP_SIZE(3*NTAPS)
staticSAMPLEimp[IMP_SIZE];
SAMPLEoutput;
intii,state;
/*makeimpulseinputsignal*/
clear(IMP_SIZE,imp);
imp[5]=1.5;
/*createaSAMPLEdh*/
for(ii=0;iih2[ii]=h2[ii+NTAPS]=h[ii];
}
/*testFIRalgorithms*/
printf("Testingfir_basic:
\n");
clear(NTAPS,z);
for(ii=0;iioutput=fir_basic(imp[ii],NTAPS,h,z);
printf("%3.1lf",(double)output);
}
printf("\n\n");
printf("Testingfir_shuffle:
\n");
clear(NTAPS,z);
state=0;
for(ii=0;iioutput=fir_shuffle(imp[ii],NTAPS,h,z);
printf("%3.1lf",(double)output);
}
printf("\n\n");
printf("Testingfir_circular:
\n");
clear(NTAPS,z);
state=0;
for(ii=0;iioutput=fir_circular(imp[ii],NTAPS,h,z,&state);
printf("%3.1lf",(double)output);
}
printf("\n\n");
printf("Testingfir_split:
\n");
clear(NTAPS,z);
state=0;
for(ii=0;iioutput=fir_split(imp[ii],NTAPS,h,z,&state);
printf("%3.1lf",(double)output);
}
printf("\n\n");
printf("Testingfir_double_z:
\n");
clear(2*NTAPS,z);
state=0;
for(ii=0;iioutput=fir_double_z(imp[ii],NTAPS,h,z,&state);
printf("%3.1lf",(double)output);
}
printf("\n\n");
printf("Testingfir_double_h:
\n");
clear(NTAPS,z);
state=0;
for(ii=0;iioutput=fir_double_h(imp[ii],NTAPS,h2,z,&state);