DSP实习报告.docx
《DSP实习报告.docx》由会员分享,可在线阅读,更多相关《DSP实习报告.docx(53页珍藏版)》请在冰豆网上搜索。
DSP实习报告
DSP实习报告
——离散余弦变换(DCT)算法设计
姓名:
张慧
班级:
信息10-1
学号:
201016050136
指导老师:
刘柏生董胜刘岩
引言
在信息世界快速发展的今天,人们对计算机实时处理图像信息的要求越来越高。
如何在保证图像质量的前提下,同时兼顾实时性和高效性成了一个值得关注的问题。
于是对图像信息进行一定的压缩处理成了一个不可或缺的环节。
图像压缩是关于用最少的数据量来表示尽可能多的原图像的信息的一个过程。
在有关图像压缩的众多正交变换中,离散余弦变换(DCT)是十分有效的一种,其性能极为接近最佳的K-L变换。
通过采用行列分解方法,人们只需使用少量的乘法就能完成二维离散余弦变换。
正因为如此,DCT就被众多标准广泛使用。
离散余弦变换(DiscreteCosineTransform,简称DCT)常被认为是对语音和图像信号进行变换的最佳方法。
为了工程上实现的需要,国内外许多学者花费了很大精力去寻找或改进DCT的快速算法。
由于近年来DSP的发展,加上专用集成电路设计上的优势,这就牢固地确立DCT在目前图像编码中的重要地位,成为H.261、JPEG、MPEG等国际上公用的编码标准的重要环节。
MATLAB是由美国Math-Works公司推出的用于数值计算和图形处理的科学计算软件,它集数值分析、矩阵计算、信号处理和图形显示多种功能于一体,构成了一个方便的界面友好的用户环境。
MATLAB中的图像处理工具箱是许多基于MATLAB技术计算环境的函数包的集合,图形功能完备。
本文主要讨论了DCT变换方法,并讨论了应用MATLAB中的图像处理工具箱中的相关函数和命令来实现离散余弦变换的图像压缩算法的仿真。
一、实习题目。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
二、实习目的。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
三、实习任务与要求。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
四、软件介绍。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
4.1、CCS软件介绍。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
4.2、TMS320VC5509A开发板介绍:
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
五、DCT算法原理及设计思路。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
5.1、DCT算法原理。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
5.2、设计思路:
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
5
六、离散余弦变换的具体步骤和实现。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
5
七、源程序代码。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
11
八、硬件电路设计。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
35
九、实习心得。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
37
十、参考文献。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
38
一、实验题目:
离散余弦变换(DCT)算法设计
二、实验目的:
1、熟练掌握数字信号处理的典型设计方法与技术手段;
2、熟悉电子CAD制图与PCB板的制作方法;
3、掌握常用电子仪器设备的使用方法;
4、亲自动手完成一个DSP系统的设计与实现。
5、学习DCT算法的实现方法。
三、实习任务与要求:
(1)利用C语言或汇编语言编写一个实现DCT的DSP程序
(2)在CCS上仿真运行
(3)查看分析结果,记录必要参数
四、软件介绍:
4.1、CCS软件介绍:
CodeComposerStudio(CCS或CCStudio)是一种针对TI的DSP、微控制器和应用处理器的集成开发环境。
CCS包括一套用于开发和调试嵌入式应用程序CCS包括套用于开发和调试嵌入式应用程序的工具。
它包括用于各种TI设备系列的编译器、源代码编辑器项目生成环境调试程序探源代码编辑器、项目生成环境、调试程序、探查器、模拟器和其他许多功能。
CCS提供一个单一用户界面,指导用户完成应用程序开发流程的每一步骤。
CCS提供了基本的代码生成工具,它们具有一系列的调试、分析能力。
CCS集成的软件工具:
(1)代码生成工具(包括C6000的C编译器、汇编优化编和连接化器、汇编器和连接器)
(2)软件模拟器(Simulator)。
(3)实时基础软件DSP/BIOS。
(4)主机与目标机之间的实时数据交换软件RTDX机与目标机间的实时数据交换软件•Real‐Time Data Exchange提供了实时的和连续的途径,以观察目标应用程序的真实运行情况。
它允许系统开发者在主机和目标设备间传输数据而不对目标应开发者在主机和目标设备间传输数据而不对目标应用造成影响。
实时分析与数据可视化
4.2、TMS320VC5509A开发板介绍:
DSP5509开发板是一套功能齐全的基于TMS320VC5509ADSP的学习开发平台,DSP5509开发板既可作为开发板供用户学习使用,也可作为系统板嵌入到用户的产品供用户进行二次开发以便缩短产品开发周期。
能进行声音的处理。
图像的压缩等。
是迄今为止市面上性价比最高的5509开发板。
五、DCT算法原理及设计思路:
5.1、DCT算法原理
离散余弦变换(DiscreteCosineTransform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算,属于正弦类正交变换,由于其优良的去冗余性能及高效快速算法的可实现性,被广泛用于语音及图象的有损和无损压缩。
在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出余弦变换,因此称之为离散余弦变换。
对于给定的实际数据序列x(0),X
(1),x
(2)....X(N-1)的DCT(FDCT)算法如下:
正变换:
其中:
二维离散余弦变换(FDCT):
其逆运算是:
本实习中,我们只进行一维变换。
5.2、设计思路:
对于这个题目,首先得弄明白三个问题:
1、什么是离散余弦变换?
离散余弦变换(DiscreteCosineTransform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算,属于正弦类正交变换。
2、要进行离散余弦变换,途径是什么?
离散余弦变换可通过公式来进行算法实现。
3、怎么去实现?
通过程序的编写,进行软件和硬件的结合来实现离散余弦变换的仿真的观察。
弄清楚这三个问题,就可以去具体实现的设计了,余弦变换的前提是得有信号输入,所以,首先通过5509硬件的搭接,通过5509的音频输入从外界输入一个音频信号,通过5509键盘选择好通道,将音频信号进行A/D转换,然后将所编写的程序下载到5509开发板上,最后将A/D转换后的输入信号进行DCT变换,仿真出波形。
而在程序的编写上,关键是DCT变换公式的编写,首先定义好长度,要进行正变换和逆变换需要设置三个变量,一个用于信号的输入,一个用于表示对输入信号的正变换,一个用于对变换后的信号进行重构,也就是DCT逆变换,然后对输入的语音信号进行采集,将采集的语音信号进行累加求和、取平均值等一系列处理,最后通过对公式进行程序编写,让其实现离散余弦的正变换和逆变换。
六、离散余弦变换的具体步骤和实现:
1、CCS的设置
打开CCS软件,选择C55XX系列,选择C5509TDS510USB2.0Emulate,右键单击CPU_1,value栏选择C5509.gel——打开——ok——save&quite——是
2、新建工程
新建一个文件夹,名为DCT,新建一个项目project——New——example,所建项目保存到新建文件夹下
3、建立源程序
File——New——sourcefile,然后进行程序编写,并且保存在工程文件夹下
4、导入源程序:
Project——AddFiletoProject将程序导入到当前工程下,在example的source下能看到程序
5、编译构建:
Project工具栏下的RebuildAll,将在构建窗口显示结果
6、链接5509
Debug——connecte
7、加载:
File——LoadProgram——工程下的Debug——example.out
8、设置断点:
在m=0处设置断点
9、回到主函数
Debug——Gomain
10、观察仿真波形
用View/Graph/Time/Frequency打开两个图形观察窗口;采用双踪观察在启始地址分别为x和y,长度为128的单元中数值的变化,数值类型为32位浮点型,这两个数组分别存放的是经A/D转换的输入信号和对该信号进行DCT变换的结果
再打开一个图形观察窗口,设置观察变量为y和z;变量z为输入信号的DCT变换及逆DCT变换的结果,长度128,32位浮点型,即输入信号的重构信号
单击“Animate”运行程序,调整各图形观察窗口,动态观察变换结果;改变输入信号的波形、频率、幅值,动态观察变换结果
正变换波形
逆变换波形
七、源程序代码
1主程序
//*********************************************************
#include"reg5509a.h"
#include
//*********************************************************
#definepi3.1415927
#defineLen128
//-----------------------------------------------------------
voiddct1c2(doublex[Len],doubley[Len]);
voididct1c2(doubley[Len],doublez[Len]);
//-----------------------------------------------------------
doublex[Len],y[Len],z[Len],temp[Len];
intin_x[Len];
intm=0;
intintnum=0;
doublexmean=0;
inti=0;
intflag=0;
/**********************************************************/
voidmain()
{
unsignedintii;
//-----------------------------------
initial_sys();
mcbsp2_close();
asm("bit(st1,#11)=1");
initial_aic23();
delayMs_SYS
(1);
mcbsp2_init();
mcbsp2_open();
//------------------------------------
while
(1)
{
for(ii=0;ii!
=Len;ii++)
{
mcbsp2_read_rdy();
//read_data2=DRR2_2;
in_x[ii]=DRR1_2;
}
{
xmean=0.0;
for(i=0;i{
xmean=in_x[i]+xmean;
}
xmean=1.0*xmean/Len;
for(i=0;i{
x[i]=(double)(in_x[i]-xmean);
}
dct1c2(x,y);
idct1c2(y,z);
}
m=0;//设置断点
m=0;
}
}
//----------------------------------------------------------
voiddct1c2(doublex[Len],doubley[Len])
{
doubles,t;
inti,j;
s=0.0;
for(i=0;i{
s=s+x[i];
}
for(i=1;i{
t=0.0;
for(j=0;j{
t=t+x[j]*cos((2.0*j+1)*i*pi/(2.0*Len));
}
y[i]=sqrt(2.0/Len)*t;
}
y[0]=s/(sqrt(Len/1.0));
}
voididct1c2(doubley[Len],doublez[Len])
{
doublet;
inti,j;
for(i=0;i{
t=0.0;
for(j=0;j{
t=t+y[j]*cos((2.0*i+1)*j*pi/(2.0*Len));
}
z[i]=y[0]/(sqrt(Len/1.0))+sqrt(2.0/Len)*t;
}
}
/*****************end*************************************/
/*****************end*************************************/
2、aic_23芯片程序
//--------------------------------------------------------
#include"codec.h"
#include"reg5509a.h"
unsignedintcpld_ctrl_back=0xe7;
//--------------------------------------------------------
#defineAIC23_ADDR0x34
externvoiddelayMs_SYS(unsignedintmsecond);
externvoiddelayUs_SYS(unsignedintusecond);
externvoidmcbsp2_init(void);
externvoidmcbsp2_write_rdy(unsignedintout_data1,unsignedintout_data2);//MCBSP1发送一个数据32位
externvoidmcbsp2_read_rdy(void);
externvoidmcbsp2_open(void);
externvoidmcbsp2_close(void);
externvoidDelay(intnumbers);
/****************************************************************/
//-------------------------------------------------------------
voidmcbsp2_init(void)
{
SPCR1_2=0;
SPCR2_2=0;
delayUs_SYS(10);
RCR1_2=0x00A0;
RCR2_2=0x00A0;
XCR1_2=0x00A0;
XCR2_2=0x00A0;
PCR2=0x000D;
}
voidmcbsp2_write_rdy(unsignedintout_data1,unsignedintout_data2)
{
while((SPCR2_2&0x0002)==0);
DXR2_2=out_data2;
DXR1_2=out_data1;
}
voidmcbsp2_read_rdy(void)
{
while((SPCR1_2&0x0002)==0);
}
voidmcbsp2_open()
{
SPCR1_2=SPCR1_2|0x0001;
SPCR2_2=SPCR2_2|0x0001;
}
voidmcbsp2_close()
{
SPCR1_2=SPCR1_2&0xFFFE;
SPCR2_2=SPCR2_2&0xFFFE;
}
//----------------------------------------------------------------
voidAIC23_CLK(unsignedintflag)
{
if(flag==0)cpld_ctrl_back&=~B5_MSK;
elsecpld_ctrl_back|=B5_MSK;
CPLD_CTRL_REG=cpld_ctrl_back;
}
voidAIC23_DIN(unsignedintflag)
{
if(flag==0)cpld_ctrl_back&=~B6_MSK;
elsecpld_ctrl_back|=B6_MSK;
CPLD_CTRL_REG=cpld_ctrl_back;
}
voidAIC23_DIN_EN(unsignedintflag)
{
if(flag==0)cpld_ctrl_back&=~B7_MSK;
elsecpld_ctrl_back|=B7_MSK;
CPLD_CTRL_REG=cpld_ctrl_back;
}
//----------------------------------------------------------------
voidSCLK_DIN23(unsignedintflag_clk,unsignedintflag_din,unsignedintflag_din_en)
{
if(flag_clk==0)
cpld_ctrl_back&=~B5_MSK;
else
cpld_ctrl_back|=B5_MSK;
if(flag_din==0)
cpld_ctrl_back&=~B6_MSK;
else
cpld_ctrl_back|=B6_MSK;
if(flag_din_en==0)
cpld_ctrl_back&=~B7_MSK;
else
cpld_ctrl_back|=B7_MSK;
CPLD_CTRL_REG=cpld_ctrl_back;
}
//----------------------------------------------------------------
voidset_aic23_sci_mode()
{
//AIC23_CS(0);
AIC23_DIN_EN
(1);
AIC23_DIN
(1);
AIC23_CLK
(1);
delayMs_SYS(3);
AIC23_DIN_EN
(1);
AIC23_DIN
(1);
delayMs_SYS(10);
}
//----------------------------------------------------------------
voidsend_aic23_bit(unsignedintdat)
{
delayMs_SYS
(2);
SCLK_DIN23(0,dat,1);
delayMs_SYS
(2);
AIC23_CLK
(1);
}
//----------------------------------------------------------------
voidsend_aic23_ctrl_reg(unsignedintdat)
{
unsignedinttemp_dat;
unsignedintflag;
AIC23_CLK
(1);
delayMs_SYS(3);
AIC23_DIN_EN
(1);
AIC23_DIN
(1);
delayMs_SYS(10);
AIC23_DIN(0);//start
delayMs_SYS(3);
AIC23_CLK(0);
delayMs_SYS(3);
//SENDADDRESS
temp_dat=(AIC23_ADDR|0x00);//writeonly
{
flag=0x80;
AIC23_DIN((flag&temp_dat));
delayMs_SYS
(2);
AIC23_CLK
(1);
for(flag=0x40;flag!
=0;flag>>=1)
{
send_aic23_bit(flag&temp_dat);
}
}
SCLK_DIN23(0,0,0);
delayMs_SYS
(2);
AIC23_CLK
(1);
delayMs_SYS
(2);//ack
AIC23_CLK(0);//是否需要同时输出SDIN
//SENDHIGNTBYTE
temp_dat=(dat>>8);
{
flag=0x80;
SCLK_DIN23(0,(flag&temp_dat),1);
delayMs_SYS
(2);
AIC23_CLK
(1);
for(flag=0x40;flag!
=0;flag>>=1)
{
send_aic23_bit(flag&temp_dat);
}
}
SCLK_DIN23(0,0,0);
delayMs_SYS
(2);
AIC23_CLK
(1);
delayMs_SYS
(2);//ack
AIC23_CLK(0);//是否需要同时输出SDIN
//SENDLOWBYTE
temp_dat=dat;
{
flag=0x80;
SCLK_DIN23(0,(flag&temp_da