在新的图像压缩标准jpeg2000中,采用9/7、5/3提升小波变换作为编码算法,其中5/3小波变换是一种可逆的整数变换,可以实现无损或有损的图像压缩。在通用的dsp芯片上实现该算法具有很好的可扩展性、可升级性与易维护性。用这种方式灵活性强,完全能满足各种处理需求。
1 提升算法
提升算法[1]是由sweldens等在mallat算法的基础上提出的,也称为第二代小波变换。与mallat算法相比,提升算法不依赖傅立叶变换,降低了计算量和复杂度,运行效率相应提高。由于具有整数变换及耗费存储单元少的特点,提升算法很适合于在定点dsp上实现。
小波提升算法的基本思想是通过基本小波逐步构建出一个具有更加良好性质的新小波。其实现步骤为分解(split)、预测(predict)和更新(update)。
首先按照对原信号进行对称延拓得到新的x(n)。
分解是将数据分为偶数序列x(2n)和奇数序列x(2n+1)二个部分;
预测是用分解的偶数序列预测奇数序列,得到的预测误差为变换的高频分量:h(n)=x(2n+1)-{[x(2n)+x(2n+2)]>>1}
更新是由预测误差更新偶数序列,得到变换的低频分量: l(n)=x(2n)+{[h(n)+h(n-1)+2]>>2}
计算过程如图1所示。
2 基于dm642的优化策略
2.1 dm642的两级cache结构
dm642是一款专门面向多媒体处理领域应用的处理器,是构建多媒体通信系统的良好平台。它采用c64xdsp内核,片内ram采用两级cache结构[4][5],分为l1p、l1d和l2。l1只能作为cache被cpu访问,均为16kb,访问周期与cpu周期一致,其中l1p为直接映射,l1d为两路成组相关;l2可以由程序配置为cache和sram。
2.2 改进的算法结构
传统的小波变换都是对整幅图像作变换,先对每一行作变换,然后再对每一列作变换。用这种方式在dsp上实现该算法时效率比较低。因为dsp的l1d很小,只有16kb,不能缓存整幅图像,因此原始图像数据通常保存在速度较低的外部存储器上。这样cpu从l1d每读取一行数据时必然会产生缺失,大量缺失会严重阻塞cpu的运行,延长程序的执行时间。为了减少缺失的发生,必须将传统的变换进行改进。将原来对整幅图像的变换改为分块的变换,即每次从图像中取出一个块,先后完成行、列变换后再按照一定的规则保存到系数缓存中,如图2所示。
在这种方法中,sdram中的一个数据块首先传输到l2中,然后取到l1d中进行水平方向的提升,再对该块进行垂直方向的提升。这样,由于垂直提升所需的数据都在l1d中,避免了此处数据缓存缺失的产生,使总的缺失数大大降低。
2.3 数据传输
(1)sdram与l2间的数据传输
由于edma[6][7]数据传输与cpu运行相互独立,因此在l2中开辟两块缓存:edma在cpu处理inbuffa的同时将下一块数据传输到inbuffb,解决了cpu读取低速设备sdram引起的时延,如图3所示。
(2)l2与l1d间的数据传输
cpu首先访问第一级cache中的程序和数据,如果没有命中则访问第二级cache(如果配置l2的一部分为cache),若还没有命中就要访问外部存储空间。在这个过程中,cpu一直处于阻塞状态,直至读取的数据有效。所以,在对l2中的数据块进行水平提升时,cpu读取每一行都会产生缺失。针对这种情况,tms320c64x系列dsp为l1d提供了一种高速缓存缺失处理的流水处理机制。若连续多次未命中,cpu等待时间就会重叠,总体上减少了平均缺失造成的cpu阻塞时间。
因此,在cpu对数据进行水平提升前,利用缺失流水技术,将当前数据块全部读取到l1d中,随后再对该数据块进行水平提升,则不会再发生缺失,并可提高运算速度。
2.4 l1p与l1d性能优化
l1d是两路成组相关,每组8kb,总容量16kb。cpu一次处理的数据不应超过8kb,并且所有的原始数据都连续存储在同一cache组中;程序的中间过程数据保留在预分配的另一个cache组中。
数据读取到l1d之后,首先由8位扩展成16位,然后对这些数据进行水平提升,只要这些数据能保留在l1d中,随后进行的垂直提升就可以完全避免缺失。因此,数据块的大小是由中间过程数据决定的,所有中间过程数据加起来不能超过8kb,选取数据块是32×32。
当多个函数映射到l1p的同一个cache行时就会引起冲突缺失,所以必须合理放置这些函数。由于实现提升的全部函数加起来不超过16kb,因此,如果能将这些函数安排在一个连续的存储空间内,就可以完全避免由冲突引起的l1p缺失。可以在cmd[8]文件的sections中添加一个group,然后将频繁调用的函数放到group中:
sections
{
group > isram
{
.text:_horz
.text:_vert
.text:_img_pix_pand
…
}…}
2.5 程序优化
由前面的分析可知,对图像进行提升小波变换时,需要对其四个边界进行延拓。延拓方式采用图1所示的对称延拓,其中左边与上边需要多延拓一个点。而对图像中的一个块进行提升变换时,其延拓的应该是与该块相邻的四个块数据的边界数据,如图4所示。
边界延拓主要是用于计算高频系数。分析发现,水平提升时,当前数据块每一行的最后一个高频系数与下一个块在该行的第一个高频系数相同。所以只要把当前块的这些系数保存起来,在对下一块进行水平提升时第一个高频系数就不需要再进行计算,因此也就不需要再对其左边界进行延拓了。垂直方向的提升也是同样的道理。在程序中添加两个数组,分别用于存放当前块的每一行与每一列的最后一个高频系数。采用这种方法就可以降低程序的复杂度,提高执行效率,减少缺失的发生。
像素扩展函数pix_pand[9]是采用ti的imglib算法库。水平提升与垂直提升函数均由作者用线性汇编语言编写,充分利用64x系列dsp的半字处理指令,采用半字打包技术,最大限度地提高程序的执行效率。
水平提升时,将每行的数据重新排序,变成如图5所示的结构。
使用c64x的add2、shr2和sub2等半字处理指令,将如下的两个运算并行执行:
h(1)=b-[(a+c)>>1]
h(2)=d-[(c+e)>>1]
垂直提升时则可以安排多列的计算并行执行,如图6所示。
h1(1)=b1-[(a1+c1)>>1]
h2(1)=b2-[(a2+c2)>>1]
3 仿真结果
表1列出了cpu读取l1d时产生的缺失数。其中,水平方向的缺失不可避免。由于要对数据块的右侧和底部进行边界延拓,所以在水平方向的缺失数比传统方法略高;而在垂直方向上,该算法完全避免了缺失的发生。
表2列出了几种方法的计算性能。由于本文采用了多种优化技术,运算速度提高了4~10倍。试验证明这些方法十分有效。
采用视频方式的点坐标测量方法
科大讯飞发布1024计划3.0,吸引160万生态伙伴入驻
飞兆推出采用mWSaver技术的FAN6756PWM控制器
运算放大器“真正 Vos”的错误理解
Redis在大数据中的使用,Redis封装架构讲解
DM642上5/3提升小波的优化
Microchip下一代SiC MOSFET和SiCSBD的特性优势及典型应用
华为P10闪存门事件最新消息:余承东终于发声!欢迎大家带着放大镜和显微镜来看华为
一台概念8曲面荣耀Magic,一台高性价比魅焰红荣耀V9,该如何选?
显示器横向推拉力机的采购渠道和测试功能
健康码测温扫码一体机赋能全国各地“科技战疫”
华为p10好还是mate9好?评测参数分析
三星的UFS4.0闪存芯片预计第三季度正式量产
干货|ECC内存为什么比普通内存更稳定?
瑞萨电子携手GE医疗(日本)日野工厂完成“AI单元解决方案”生产力优化测试
丰田不再死守“油电混动” 在新能源领域抱团加速追赶并博弈氢燃料车
赣锋锂业正在投资研发将固态锂电池商业化 并宣布成为全球锂电池回收行业领军企业之一的意向
磁浮子液位计的安装要求及安装方法
传苹果正在寻找其他的相机组件供应商
STM32为什么必须先配置时钟再配置GPIO?原因解析