基于Blackfin561的JPEG2000压缩算法编码优化

2012-06-01 02:54董智超
电子科技 2012年1期
关键词:编译器子块邻域

董智超

(西安电子科技大学电子工程学院,陕西西安 710071)

JPEG2000[1],即 ISO/ITU15444 是由国际标准化组织ISO和国际电信标准化联盟ITU-T于2001年联合颁布的新一代图像压缩国际标准,可应用于计算机和网络环境,以及数码相机、医学图像、传真机等图像设备的数字图像压缩编码。

而DSP芯片的发展也越发成熟,各种高速度、低功耗、大容量的DSP不断涌现。基于通用DSP设计的算法平日除了成本低以外,还具有灵活性强、扩展性好、可升级和易维护的优点,特别适用于新型产品的研究开发。因此,600 MHz主频和4个8位视频 ALU(Arithmetic Logic Unit)的Blackfin561 处理器[2]适合成为开发JPEG2000算法的平台。

1 JPEG2000算法结构简介

图1所示为JPEG2000静止图像压缩算法的编解码流程图。首先对原始图像数据进行离散小波变换,然后对变换后的小波系数进行量化和对量化后的数据熵编码,最后形成输出码流。解码器是编码器的逆过程,首先对码流进行熵解码,然后解量化和小波反变换,最后生成重建图像数据。各模块的算法程参阅文献[3~5]。

图1 JPEG2000算法流程图

2 编码算法的优化

2.1 算法改动

(1)在原程序中,上下文建模和编码通道的选择都依赖于8邻域或3×6邻域的重要性状态(变量Fc[][]表示)。以8邻域为例,判断8邻域的重要性状态[5]需要依次读取8个值分别进行判断,不仅读取数据花费的时间多,而且条件判断也较多。

于是提出了一种新方法:重要性状态标记。即当在编码扫描中发现某一个系数变为“重要的”之后,将它的8个邻域的相应比特位标记为1。标记过程如图2所示,neighbor_stat[][]为重要性标记变量,当前系数X[i][j]变为“重要的”之后,分别将 neighbor_sata[i-1][j-1]到 neighbor_stat[i+1][j+1]的0 ~7 比特位标记为1。

图2 重要性传播标记过程

反过来,对于一个重要性标记变量neighbor_stat[i][j],它的8个比特位也包含了8个邻域的重要性状态信息(Fc[i-1][j-1]~Fc[i+1][j+1]),具体等价关系如表1所示。这样,原来需要读取8个数(Fc[i-1][j-1]~Fc[i+1][j+1]),现在只需读取一个数 neighbor_stat[i][j],即可得到 8 邻域的重要性状态信息。

表1 neighbor_stat[][]各比特位与 Fc[][]等价关系

经过以上改进后,重要性状态相关的模块性能明显提升,较大缩短了编码过程的执行时间。

(2)渐进过程优化截断中,给出两种截断方式:子带截断和子块截断。子带截断即是在每个小波子带编码结束后,进行一次截止最低位平面的判断;子块截断即是在每个编码子块编码结束后,进行一次截止最低位平面的判断。

通过实验发现,对于不同压缩率的图像压缩,选择不同的截断方式的效果有所不同,低倍(8倍以下)压缩时,子块截断的效果可能更好,而高倍压缩(16倍以上)时子带截断的效果更好。

2.2 代码级优化

Visual DSP提供了跟踪(Trace)、时间统计(Profile)等功能,允许在整个程序空间中进行评估。通过Profile功能可以发现DSP程序中的瓶颈现象和需要优化的程序块,并且在程序的执行过程中能够随时查看寄存器/存储器中数值的变化,以及源程序代码的执行过程。

2.2.1 编译器优化

通过使能编译器中的优化选项Project Option->Enable Optimization可以实现编译器自动优化,可以节约大量代码移植和优化的工作量。使能该选项后,Visual DSP++的编译器能够完成冗余代码和数据去除、向量化、软件流水、硬件循环和指令并行等优化工作。

2.2.2 数据优化

(1)使用了分配在固定段的二维数组来代替指针和动态内存分配。利用数组,编译器可以更加准确地理解两个连续数据,而这往往是编译器进行积极优化时难以克服的一个关卡。

(2)将除法转换为乘法,将浮点运算转化为定点运算[2]。Blackfin561是一款定点处理器,它本身并不支持float、double等浮点数据类型,只能通过仿真实现,所以用BF561直接进行浮点运算是很费时的。因此要通过浮点转换定点来对定点数进行操作,例如浮点的系数Coeff[0]=1.586 134 342,将其表示成2.14格式:Coeff[0]=1.586 134 342 ×214=0x6583。

(3)使用DMA实现外部存储器数据到内部存储空间的搬移,并使用双缓冲的形式实现对数据的乒乓操作。具体到算法中的块,文中对小波变换和算术编码的模块使用。

2.2.3 循环优化

虽然BF561有两组零开销循环寄存器,但只能支持两重硬件循环。因此,只有嵌套最深的循环才会使用硬件循环。并且,只有循环体的执行次数是确定值时,才会使用硬件循环。

如果循环体内有条件判断,可能会出现大量控制流延迟。所以,将部分条件执行的if语句放在循环体外单独执行。

JPEG2000在编码块的每个位平面,是按每4个系数为一列进行扫描的。也就是说,循环次数不>4。在这种循环次数比较少的情况下,可以考虑把循环体展开。虽然展开循环后,代码的紧凑性变差,但速度可以提高很多。

2.2.4 C程序汇编化和汇编优化

ANSI-C毕竟不是一种专门的信号处理语言,它更适用于系统设计,而不是数学运算。而Visual DSP允许C与汇编混合编程,因此将一些关键的代码区域按一定的规则[2]进行汇编化,然后在C中调用。

BF561提供了10级的软件流水[2],并提供语句的并行执行功能。因此对汇编代码的优化主要体现在并行语句的增加和减少阻塞、降低延迟上。

此处将算术编码器的主程序以及小波变换主程序用汇编实现并优化,以512×512,2×2分片,16倍压缩的Lena灰度图像的处理为例,算术编码器汇编化完成之后,EBCOT部分总时钟周期较汇编化之前减少了约10%,而小波的汇编化则节约了小波变换部分39.5%的时钟周期。

3 优化结果

测试条件:512×512 LENA图,分为4个256×256的拼接块(2×2分片),16倍压缩,3级小波变换,编码块大小32×32,编译器优化选项开到最大速度。

表2 优化前后对比

4 结束语

介绍了JPEG2000压缩算法的基本框架,然后提出了在Blackfin561处理器上实现的优化方案,包括算法级优化和代码级优化,并给出优化结果。最终的优化结果表明,提出的优化方案在不降低图像峰值信噪比的情况下大大缩短了编码的时间,提高了算法效率。

[1]RABBANI M,JOSHI R.An overview of the JPEG2000 still image compression standard [J].Signal Processing:Image Communication,2002(1):48.

[2]胡栋.静止图像编码的基本方法与国际标准[M].北京:北京邮电大学出版社,2006.

[3]Analog Devices,Inc.Visual DSP++assembler and preprocessor manual[M].USA:Analog Devices Conpration,2006.

[4]DAVID S T,MICHAEL W M.JPEG2000 图像压缩基础、标准和实践[M].魏江力,柏正尧,译.北京:电子工业出版社,2004.

[5]ISO.JPEG2000 Image Coding System[S].USA:ISO/ITU -T FCD 15444-1,2000.

猜你喜欢
编译器子块邻域
基于八叉树的地震数据分布式存储与计算
融合密度与邻域覆盖约简的分类方法
基于特征值算法的图像Copy-Move篡改的被动取证方案
稀疏图平方图的染色数上界
基于相异编译器的安全计算机平台交叉编译环境设计
基于波浪式矩阵置换的稀疏度均衡分块压缩感知算法
基于邻域竞赛的多目标优化算法
关于-型邻域空间
Microchip为MPLAB XC系列专业版编译器推出低成本可续订包月许可证
基于分布式ICA-PCA模型的工业过程故障监测