DSP图像处理算法的实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C6000 优化方法- 软件流水
• • • • • 软件流水是用来安排循环指令,使循环的多次迭代 同时执行的一种技术。图3是一个循环代码的软件 流水示意图。图中A,B,C,D和E表示特别迭 代,其后的数字表示各次迭代的第几条指令,同一 行中的指令是同一周期内并行执行的指令。
以下情况,output(x,y) =195075
• 通过以上的计算可知,得到的实验结 果是正确的。
பைடு நூலகம்
浦东机场钢结构合同结构特点
1. 采用施工总承包管理模式,业主虽然支付了 一笔总承包管理费,但组织协调工作量大为 减少,并转移了风险。 2. 钢结构吊装单位未进行招标,早期即介入项 目,与设计单位进行协调,使设计在确定了 吊装方案后出图。 3. 在吊装单位签约以后,再单独进行制作单位 的招标,并纳入总承包管理单位的管理,并 由吊装单位配合管理。
举例:3 3 ×3 3 相关运算的算法 实现
• mask的设置如下:的设置如下:
• 该mask的作用是实现图像边缘的检测。
• • • • •
• 输入图像:一幅8位无符号图像(8行8列), 黑色部分的像素值为0,白色部分的像素值 为255;对它进行相关运算,要求输出图像 为32位的图像。 输入图像
• • • •
3. 中值滤波 中值滤波是一种非线性滤波,对像素领 域内灰度的中值代替该像素的值,即: 其中:
• • • • • • • • • • • •
• 第l阶段:直接根据需要用高级C语言实现DSP功 能,测试代码的正确性。然后,移植到C6000平 台,利用C6000开发环境Profile测试程序的运行 时间。若不满足要求,则进入下一阶段。 • 第2阶段:利用C6000提供的优化方式和其他各种 优化技巧,如使用:编译器选项、内联函数、字 访问短型数据、软件流水、循环展开等,优化C语 言代码。如果还不能满足要求,则进入第3阶段。 • 第3阶段:将C语言代码中耗时最长的部分抽取出 来,用线性汇编语言重写,用汇编优化器进行优 化。使用profile确定这段代码是否需要进一步优 化。
C6000 优化方法- - 内联函数
• • TMS320C6000提供了很多内联函数,它们直接映射为 内 • 嵌C6000汇编指令的特殊函数,这样可迅速优化C语言代 • 码,内联函数用下划线“_”开头
C6000 优化方法- - 字访问短型数据
• • • • • • • • • • C6000 优化方法- - 字访问短型数据 • 以“利用32位字访问16位数据”为例:在作 16位short类型数据的点积运算时,由于 C6000的内部数据总线和寄存器都是32位 的, 因此可以采用字长优化的方法进行优化。 具体做法是在做点积运算时, 每次用1个LD 指令取2个16位数据, 并进一步用C6000的 2个16位乘法器在1个周期内并行完成2个 16位乘法。这样, 就有可能进一步提高点 积运算速度。
DSP 图像处理算法的 实现
姓名:王淑阁 学号:B12011303
DSP 图像处理的原理介绍 1. 离散卷积: a.公式: b.算法实现:使用一个模板mask(大小可以是 3×3,5×5或7×7等),依次覆盖在要处理图像的 各个像素上,模板中心与该像素重合;模板上的各 个元素均有其自身的权值,将模板各元素权值与覆 盖在其下的像素值分别相乘后求和,然后进行相应 的处理,最后将此所得结果赋给当前处理的像素。
• 3×3相关运算处理后图像:
• • 程序中要求输出图像为32位,但是在本次设计 • 中,图像都是用8位来显示的,因此实验结果只是 • 黑白图像。
验证结果的正确性 以下情况,output(x,y) = 0
以下情况,output(x,y) = 65025
以下情况,output(x,y) =130050
• • • • • • • • • • • • • • • •
利用循环展开和软件流水的程序优化方法实现: //processing the image for(irows = 1;irows < aSz.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;
C6000 优化方法- - 循环展开
• • • • • • • 循环展开可增加并行执行的指令类,当单次迭 代操作没有充分利用C6000结构的所有资源 时,可使用循环展开提高性能。编译器仅对内 部循环执行软件流水,因此,为了提高性能可 创造一个比较大的内循环。创造大的内循环的 方法就是完全展开执行周期很小的内循环。
• • • • • • • • • • • • • • • • • •
标准C代码的部分程序: //processing the image for(irows = 1;irows < aSz.height +1;irows++) { for(icols = 1;icols <= aSz.width + 1;icols++) { sum = 0; for (j = 0; j < 3; j++) { for (i = 0; i < 3; i++) { sum+= temp_ptr->pData[(irows+j1)*temp_aSz.width+icols-1+i]*mask[j*3+i]; } } outptr->pData[(irows -1) * aSz.width + (icols -1)] = sum; } }