DSP实验

更新时间:2023-09-18 03:15:01 阅读量: 幼儿教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

DSP系统结构

实验报告

姓名: 刘 成 专业: 电子与通信工程 班级: 35 班 学号: 2014170370 指导教师: 齐 美 彬 学院: 计算机与信息学院 时间: 2015-11

实验一 汇编语言程序设计

一、实验目的

1.熟悉DSP集成开发环境CCS 6000的使用方法。 2.熟悉TMS320C6437 DSP优化的3个层次。 二、实验条件

计算机(安装CCS3.3)、SEED-XDS510PLUS仿真器、DM6437实验平台 三、实验内容

以矢量点积算法为例,掌握C语言、线性汇编、并行汇编及软件流水汇编代码的优化原理、方法及步骤,并按实验步骤完成实验。

1、C语言代码

int DSP_dotprodc( const short *m, const short *n, int count) {

int i;

int prod, sum = 0; #ifndef NOASSUME

_nassert((int)m % 8 == 0); /* Double-word aligned */ _nassert((int)n % 8 == 0); /* Double-word aligned */ _nassert((int)m % 16 != (int)n % 16); /* In different banks */ #pragma MUST_ITERATE(4,,4); /* count >= 4, mult of 4 */ #endif

for (i = 0; i < count; i++) {

prod = m[i] * n[i]; sum += prod; }

return sum; } 2、线性汇编代码

.text

.global _DSP_dotprodsa

_DSP_dotprodsa: .cproc A_m, B_n, A_count .no_mdep

.reg A_reg1:A_reg0, B_reg1:B_reg0

.reg A_prod, B_prod, A_sum, B_sum, A_i ZERO A_sum ZERO B_sum

SHRU A_count, 2, A_i SUB A_i, 2, A_i .mptr A_m, x + 0, 8 .mptr B_n, x + 8, 8 loop: .trip 8

LDDW .1 *A_m++, A_reg1:A_reg0 LDDW .2 *B_n++, B_reg1:B_reg0 DOTP2 A_reg1, B_reg1, A_prod DOTP2 B_reg0, A_reg0, B_prod ADD A_sum, A_prod, A_sum ADD B_sum, B_prod, B_sum BDEC loop, A_i

ADD A_sum, B_sum, A_sum .return A_sum .endproc

.end

3、并行汇编代码 .sect \.global _DSP_dotprod64 _DSP_dotprod64:

*==============SYMBOLIC REGISTER ASSIGNMENTS ===================== * .asg A4, A_m ; pointer to vector m .asg B4, B_n ; pointer to vector n

.asg A6, A_count ; number of elements in each vector .asg A0, A_i ; loop count .asg A16, A_sum ; partial sum a

.asg A17, A_prod ; sum of products a[i]*b[i]+a[i+1]*b[i+1] .asg B16, B_sum ; partial sum b

.asg B17, B_prod ; product sum a[i+2]*b[i+2]+a[i+3]*b[i+3] .asg A9, A_reg1 ; elements a[i+3] a[i+2] .asg A8, A_reg0 ; elements a[i+1] a[i] .asg B7, B_reg1 ; elements b[i+3] b[i+2] .asg B6, B_reg0 ; elements b[i+1] b[i]

.asg A4, A_sumt ; total sum a + b returned to caller

* =============== PIPE LOOP PROLOG ============================= * B .S2 loop ; prime loop

|| LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] || LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i]

B .S2 loop ; prime loop

|| LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] || LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i] || SHRU .S1 A_count, 2, A_i ; calc loop count || ZERO .L1 A_prod:A_sum || ZERO .L2 B_prod:B_sum

B .S1 loop ; prime loop

||[A_i] LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] ||[A_i] LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i] || ZERO .L1 A_prod:A_sum ; added for branch- || ZERO .L2 B_prod:B_sum ; target-not-span

[A_i] BDEC .S1 loop, A_i ; prime loop

||[A_i] LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] ||[A_i] LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i] || ZERO .L1 A_prod:A_sum ; added for branch- || ZERO .L2 B_prod:B_sum ; target-not-span

[A_i] BDEC .S1 loop, A_i ; prime loop

||[A_i] LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] ||[A_i] LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i] || ZERO .L1 A_prod:A_sum ; added for branch- || ZERO .L2 B_prod:B_sum ; target-not-span

* ================== PIPE LOOP KERNEL ============================= * loop:

ADD .L2 B_sum, B_prod, B_sum ; sum += productb || ADD .L1 A_sum, A_prod, A_sum ; sum += producta ||[A_i] LDDW .D2T2 *B_n++, B_reg1:B_reg0 ; load b[i+3]...b[i] ||[A_i] LDDW .D1T1 *A_m++, A_reg1:A_reg0 ; load a[i+3]...a[i] || DOTP2 .M2X A_reg0, B_reg0, B_prod ; a[0]*b[0]+a[1]*b[1] || DOTP2 .M1X A_reg1, B_reg1, A_prod ; a[2]*b[2]+a[3]*b[3] ||[A_i] BDEC .S1 loop, A_i ; iterate loop

* ================== PIPE LOOP EPILOG ============================= *

RETNOP.S2 B3, 4 ; Return to caller ADD .L1X A_sum, B_sum, A_sumt ; final sum

.end

四、实验步骤

(1) 开机:打开计算机电源,进入Win XP系统,双击桌面上的CCS3.3图

标,选择open——DM6437 Little Endian Simulator ,进入DSP软件集成开发环境,或者选择open——c6437 510 plus进入DSP硬件集成开发环境(使用实验箱做实验,先连接好实验箱及仿真器等方可开机)。

(2) 编辑文件:选择File-New—Source File菜单(或使用其它文本编辑器)

编辑好C程序文件(*.c)、汇编程序文件(*.asm)、头文件(*.asm)及链接命令文件(*.cmd),并保存在D盘DSPLAB\\LAB1文件夹中。 (3) 创建工程项目:选择Project-New,出现—对话框,在project栏(第

一行)填写项目名称,并选定项目的位置(D:\\DSPLAB\\LAB1),然后单击“完成”按钮,这样就新建了一个工程项目,该项目用来管理各种文件,便于编译、调试。

注意:路径、文件夹、文件名中不能含有汉字,且第一个字母不能是数字。

(4) 添加文件:将编辑好的三个文件添加到刚建好的工程项目中,选择

Project-Add Files to Project,出现一个对话框,选择文件夹(D:\\DSPLAB\\LAB1)并选中C文件、汇编程序文件、头文件、cmd文件,单击“打开”按钮就将这四个文件添加到该工程中了。 注:此步骤可一次加入四个文件,也可重复四次,每次加入一个文件。

(5) 编译汇编程序:选择Project—Compile File,分别编译主程序及头文件,

修改程序中的错误,再编译,直到无错误出现。编译后的文件为OBJ文件。

(6) 链接:选择Project—Build或Rebuild All,链接各OBJ文件,若有错误

出现应修改错误(错误应在cmd文件中),再链接,直到无错误出现。链接生成可执行的out文件。

(7) 下载out文件:选择File—Load Program,在debuge文件夹中选中out

文件(文件名与工程项目同名),单击“打开”按钮,这样out文件就下载到DSP中了。 (8) 调试:选择debuge—Step Into 单步执行代码或者选择debuge—Run连

续运行代码(debuge—Halt停止运行)。单步运行或运行结束后选择View-Memory和View-Registers-CPU Registers/Peripheral Regs查看存储器和寄存器中的数据。如果最后的结果有错误,则应查找原因修改程序并重复步骤5 ~ 步骤8,直到结果正确为止。

实验二 创新实验题(题目9)

一、实验任务及目的

任务:将yuv格式的图像数据转换到HSV中H空间,从而掌握C语言、汇编语言的优化。

目的:

1.熟悉DSP集成开发环境CCS 6000的使用方法。 2.熟悉TMS320C6437 DSP优化。

3.了解图像处理中将yuv格式的图像数据转换到HSV中H空间的方法,掌握yuv和HSV格式图像的组成原理,以及转化原理。 二、算法原理及程序优化方法 算法原理:

YUV 的格式是yuv420,若yuv的排列顺序如下:

Y1 Y2 Y3 Y4

Y5 Y6 Y7 Y8 U1 U2 V1 V2

则:还原出的RGB格式的像素为:y1+u1+v1->p1; y2+u1+v1->p2; y3+u2+v2->p3; y4+u2+v2->p4; y5+u1+v1->p5; y6+u1+v1->p6; y7+u2+v2->p7; y8+u2+v2->p8;

最后根据各p点的RGB值计算得出各个点的H分量值。 。 程序优化方法:修改原C语言程序中for循环语句中的算法实现部分,进行C语言的优化。 三、实验步骤

(1) 开机:打开计算机电源,进入Win XP系统,双击桌面上的CCS3.3图标,选择open——DM6437 Little Endian Simulator ,进入DSP软件集成开发环境,或者选择open——c6437 510 plus进入DSP硬件集成开发环境(使用实验箱做实验,先连接好实验箱及仿真器等方可开机)。

(2) 打开工程:选择project——open,将给定的工程打开。 (3) 根据.c文件编辑线性汇编文件保存(后缀为.sa) (4) 在主函数中调用线性汇编。

(5) 编译汇编程序:选择Project—Compile File,分别编译主程序及头文件,修改程序中的错误,再编译,直到无错误出现。编译后的文件为OBJ文件。

(6) 链接:选择Project—Build或Rebuild All,链接各OBJ文件,若有错误出现应修改错误(错误应在cmd文件中),再链接,直到无错误出现。链接生成可执行的out文件。

(7) 下载out文件:选择File—Load Program,在debuge文件夹中选中out文件(文件名与工程项目同名),单击“打开”按钮,这样out文件就下载到DSP中了。 (8) 调试:选择debuge—Step Into 单步执行代码或者选择debuge—Run连续运行

代码(debuge—Halt停止运行)。单步运行或运行结束后选择View-Memory和View-Registers-CPU Registers/Peripheral Regs查看存储器和寄存器中的数据。如果最后的结果有错误,则应查找原因修改程序并重复步骤5 ~ 步骤8,直到结果正确为止。 四、实验结果

原程序运行结果:

软件仿真耗时,Cost:236.189285ms 硬件仿真耗时,Cost:198.438602ms 优化后程序运行结果:

软件仿真耗时,Cost:175.494308 ms

硬件仿真耗时,Cost:139.315048ms 最后优化的处理结果(图片) 原图像:

处理后的图像:

五、简要回答思考题

1、分析待优化函数主要耗时部分在哪里?

答:主要是在for循环部分耗时严重,合理优化for中的算法的运算部分,可以大大减少运算时间。 2、你是如何优化的?

答:修改for循环中算法部分,对原C语言程序进行C语言的优化。

六、优化程序 C语言优化程序:

/********************************************************************函数:convert_YUVtoH

功能:将yuv格式的图像数据转换到HSV中H空间 /************************************************************************/

void convert_YUVtoH (unsigned char * restrict p_Y, unsigned char * restrict p_U,unsigned char * restrict p_V, unsigned char * restrict p_H) {

float temp,hue_c;

unsigned char R , G , B,max ,min; unsigned char *p_u_temp,*p_v_temp; unsigned char *p_malloc1, *p_malloc2; unsigned char *p_temp1, *p_temp2;

int i,j ;

p_malloc1=(unsigned char *)malloc(width*height*sizeof(unsigned char)); p_malloc2=(unsigned char *)malloc(width*height*sizeof(unsigned char)); p_u_temp=p_malloc1; p_v_temp=p_malloc2;

/**-- zhuan huan cheng yuv444 format --- **/

for(i=0; i

{

p_temp1=p_U+width/2*(i/2); p_temp2=p_V+width/2* (i/2); for(j=0;j

*p_u_temp=*p_temp1; *(p_u_temp+1)=*p_temp1; *p_v_temp=*p_temp2;

*(p_v_temp+1)=*p_temp2;

p_temp1+=1; p_temp2+=1; p_u_temp+=2; p_v_temp+=2; } }

p_u_temp=p_malloc1; p_v_temp=p_malloc2;

#pragma MUST_ITERATE(101376, ,2) for(i=0;i

{

temp= (*p_Y)+((360*((* p_v_temp)-128))>>8); R=(temp>255)?255:temp;

temp= (*p_Y)-((88*((* p_u_temp)-128))>>8)-((183*((* p_v_temp)-128))>>8); G=(temp>255)?255:temp;

temp= (*p_Y)+((455*((* p_u_temp)-128))>>8);

B=(temp>255)?255:temp;

max=max_f(R,G,B); min=min_f(R,G,B);

if (R==max) hue_c = ((float)_abs(G-B))/(max-min); else if (G==max) hue_c = 2 + ((float)(B-R))/(max-min); else hue_c = 4 + ((float)(R-G))/(max-min) ; hue_c = hue_c* 60 ; if (hue_c< 0)

{hue_c = hue_c + 360 ; }

*p_H=(unsigned char) (hue_c*255/360); }

p_Y+=1;

p_u_temp+=1; p_v_temp+=1; p_H+=1;

free(p_malloc1); free(p_malloc2); }

本文来源:https://www.bwwdw.com/article/vwbh.html

Top