DSPDSP图像处理算法的图像处理算法的实现实现答辩人:黄德天答辩人:黄德天学号:学号:0414002104140021系别:电子工程系系别:电子工程系指导教师:杨涛教授指导教师:杨涛教授主要研究工作主要研究工作•基于标准C,设计通用的基本图像处理算法,并在此基础上,考虑昀通用的DSP结构的优化要求来细化C语言的程序结构,优化程序的实现方法。本设计完成了图像处理中,卷积、相关和中值滤波运算的算法实现;基于TI公司的TMS320C6000硬件平台的结构特点,本设计采用的算法优化方法包括:使用编译器选项、内联函数和字访问短型数据、软件流水和循环展开等。DSPDSP图像处理的原理介绍图像处理的原理介绍1.离散卷积:a.公式:b.算法实现:使用一个模板mask(大小可以是3×3,5×5或7×7等),依次覆盖在要处理图像的各个像素上,模板中心与该像素重合;模板上的各个元素均有其自身的权值,将模板各元素权值与覆盖在其下的像素值分别相乘后求和,然后进行相应的处理,昀后将此所得结果赋给当前处理的像素。()()()()()∑−=∗=jjihjuthtuiyDSPDSP图像处理的原理介绍图像处理的原理介绍2.相关函数:a.公式:b.算法实现图(举例:3×3相关运算):c.算法实现:()()()()()∑−=∗=τττthfthtftRfhinput(x,y)×output(x,y)=mask(i,j)()()()∑∑==×++=2020,,,ijjimaskjyixinputyxoutputDSPDSP图像处理的原理介绍图像处理的原理介绍3.中值滤波中值滤波是一种非线性滤波,对像素领域内灰度的中值代替该像素的值,即:其中:为点及其领域。()[]nxxxMedianyxg,,,,21…=nxxx,,,21…程序优化的基本流程程序优化的基本流程•第l阶段:直接根据需要用高级C语言实现DSP功能,测试代码的正确性。然后,移植到C6000平台,利用C6000开发环境Profile测试程序的运行时间。若不满足要求,则进入下一阶段。•第2阶段:利用C6000提供的优化方式和其他各种优化技巧,如使用:编译器选项、内联函数、字访问短型数据、软件流水、循环展开等,优化C语言代码。如果还不能满足要求,则进入第3阶段。•第3阶段:将C语言代码中耗时昀长的部分抽取出来,用线性汇编语言重写,用汇编优化器进行优化。使用profile确定这段代码是否需要进一步优化。举例:举例:33××33相关运算的算法实现相关运算的算法实现•3×3相关运算的基本算法:•mask的设置如下:该mask的作用是实现图像边缘的检测。()()()∑∑==×++=2020,,,ijjimaskjyixinputyxoutput025500255255000•输入图像:一幅8位无符号图像(8行8列),黑色部分的像素值为0,白色部分的像素值为255;对它进行相关运算,要求输出图像为32位的图像。输入图像标准C代码的部分程序://processingtheimagefor(irows=1;irowsaSz.height+1;irows++){for(icols=1;icols=aSz.width+1;icols++){sum=0;for(j=0;j3;j++){for(i=0;i3;i++){sum+=temp_ptr-pData[(irows+j-1)*temp_aSz.width+icols-1+i]*mask[j*3+i];}}outptr-pData[(irows-1)*aSz.width+(icols-1)]=sum;}}利用循环展开和软件流水的程序优化方法实现://processingtheimagefor(irows=1;irowsaSz.height+1;irows++){for(icols=1;icols=aSz.width+1;icols++){sum=0;sum+=temp_ptr-pData[(irows-1)*temp_aSz.width+icols-1]*mask[0];sum+=temp_ptr-pData[(irows-1)*temp_aSz.width+icols]*mask[1];sum+=temp_ptr-pData[(irows-1)*temp_aSz.width+icols+1]*mask[2];sum+=temp_ptr-pData[(irows)*temp_aSz.width+icols-1]*mask[3];sum+=temp_ptr-pData[(irows)*temp_aSz.width+icols]*mask[4];sum+=temp_ptr-pData[(irows)*temp_aSz.width+icols+1]*mask[5];sum+=temp_ptr-pData[(irows+1)*temp_aSz.width+icols-1]*mask[6];sum+=temp_ptr-pData[(irows+1)*temp_aSz.width+icols]*mask[7];sum+=temp_ptr-pData[(irows+1)*temp_aSz.width+icols+1]*mask[8];}outptr-pData[(irows-1)*aSz.width+(icols-1)]=sum;}•3×3相关运算处理后图像:•程序中要求输出图像为32位,但是在本次设计中,图像都是用8位来显示的,因此实验结果只是黑白图像。验证结果的正确性验证结果的正确性以下情况,output(x,y)=0以下情况,output(x,y)=65025以下情况,output(x,y)=130050以下情况,output(x,y)=195075•通过以上的计算可知,得到的实验结果是正确的。ThankyouforyourThankyouforyourattention!attention!C6000C6000优化方法优化方法--编译器选项编译器选项返回优化选项作用优化级别-o0优化寄存器的使用-o1本地优化-o2或-o全局优化-o3文件级优化低高优化器选项有软件流水功能C6000C6000优化方法优化方法--内联函数内联函数•TMS320C6000提供了很多内联函数,它们直接映射为内嵌C6000汇编指令的特殊函数,这样可迅速优化C语言代码,内联函数用下划线“_”开头。返回常用Intrinsics列表intrinsics_add_clr_mpy_mpyh_sub_sadd_smpy_smpyh_sshl_ssub_setC6000C6000优化方法优化方法--字访问短型数据字访问短型数据•以“利用32位字访问16位数据”为例:在作16位short类型数据的点积运算时,由于C6000的内部数据总线和寄存器都是32位的,因此可以采用字长优化的方法进行优化。具体做法是在做点积运算时,每次用1个LD指令取2个16位数据,并进一步用C6000的2个16位乘法器在1个周期内并行完成2个16位乘法。这样,就有可能进一步提高点积运算速度。返回C6000C6000优化方法优化方法--循环展开循环展开•循环展开可增加并行执行的指令类,当单次迭代操作没有充分利用C6000结构的所有资源时,可使用循环展开提高性能。编译器仅对内部循环执行软件流水,因此,为了提高性能可创造一个比较大的内循环。创造大的内循环的方法就是完全展开执行周期很小的内循环。返回C6000C6000优化方法优化方法--软件流水软件流水软件流水是用来安排循环指令,使循环的多次迭代同时执行的一种技术。图3是一个循环代码的软件流水示意图。图中A,B,C,D和E表示特别迭代,其后的数字表示各次迭代的第几条指令,同一行中的指令是同一周期内并行执行的指令。返回