DSP

基于DSP的jpeg图像解码算法的实现

2019-07-13 11:48发布

基于DSPjpeg图像解码算法的实现 摘 要:概述了JPEG图像解码算法的基本原理,论述了JPEG图像解码算法基于DSP的实现过程,并重点讨论了JPEG图像解码中IDCT变换和Huffman解码算法的实现和优化。本文介绍的JPEG图像解码算法可以应用到数码相机、多媒体手机等多种场合。
关键词:DSPJPEGIDCT变换;Huffman解码  JPEG算法是一种数字图像压缩编码算法,具有压缩比例高、失真小的特点,并已被确定为国际标准[1]。要对以JPEG文件格式进行存储的数字图像进行显示和回放,需对其进行解码。DSP处理器具有特殊的处理器结构、指令系统和指令流程,是一种特别适合数字信号处理的微处理器[2]。DSPJPEG图像的解码处理,具有小巧灵活、实时高效的特点,在诸如数码相机、监视系统、手机、PDA以及可视电话等多媒体嵌入式系统中应用广泛。 1JPEG图像解码算法的基本原理
JPEG
图像解码需要将JPEG图像数据恢复成压缩编码前的图像数据。如图1所示,JPEG图像解码须经过预处理、Huffman解码、反量化、IDCT变换这几个主要步骤,然后还要经过后续处理才能最终将JPEG图像显示出来。 2JPEG图像解码算法的实现和优化
本文以16位定点ADSP为例,论述使用DSP24位真彩 {MOD}JPEG图像解码为可显示的RGB颜 {MOD}空间图像的算法流程。
2.1
预处理
JPEG
图像解码需要从JPEG图像文件中提取解码需要的各种信息和压缩数据。JPEG图像文件大体上可分为2个部分:压缩数据和标记码。压缩数据是以MCU(最小编码单元)形式存储的经过压缩编码后的数据。标记码给出了诸如图像长度、宽度、量化表、Huffman表等重要信息,而这些信息都包含在不同类型的标记码中。预处理算法需要识别不同的标记码,并提取标记码中的有用信息。当进入SOS(扫描开始)标记码并开始读取压缩数据时,预处理任务结束,开始进入解码阶段。
2.2
基于IDCT的解码实现
基于IDCT的解码过程如图1虚线框所示,包括:Huffman解码、反量化和IDCT变换。如前所述JPEG文件中的压缩数据是以MCU形式存储的,因此解码过程也必须以MCU为单元来实现,即不断对MCU单元进行循环解码,直到取完所有压缩数据为止。JPEG文件中MCU可以定义成多种模式,本文以MCU4∶1∶1模式进行说明。
2.2.1Huffman
解码的实现   如图2所示,对一个MCU进行Huffman解码,需在完成亮度解码后才能进行 {MOD}度解码。解码后得到6个具有64位元素的一维数组,分别是:4Y亮度数组、1Cb {MOD}度数组、1Cr {MOD}度数组。对亮度和 {MOD}度进行解码其实就是对亮度数组和 {MOD}度数组的解码。对一个数组来说,Huffman解码包括直流解码和交流解码。对数组第一个元素的解码称为直流解码(简记为DC解码),对剩下的63个元素的解码称为交流解码(简记为AC解码)。JPEG文件中一般包含4Huffman表,即亮度DC表、AC表, {MOD}度DC表、AC表。对不同的数据进行解码需要调用不同的Huffman表。DC解码出的数据称为DC值,但最终的DC值却是直接解码出的DC值与该数组紧跟的前面一个数组的DC值之和。AC解码一般会得到多个数据,包括一些连续0数据和一个非0数据。
不管是亮度还是 {MOD}度解码,也不管是AC还是DC解码, Huffman码是其最小解码单位,且每个Huffman码的解码流程都是大致相同的。一个Huffman码包括码头和码值2部分,码头用来惟一的标识该Huffman码,并与Huffman表一一对应,码值是该码的实际大小。图3ADSP完成一个Huffman码解码的流程图。在图3中,SRADSP32位移位寄存器,他包括2个可以单独使用的16位寄存器:SR0SR1。当SR从低16位开始将SR0中的数据向左移位时,从SR0移出的数据会进入SR1中。对一个Huffman码进行解码需要首先找到该码的码头,而最短的码头有2个二进制位。为此,从JPEG文件中读取一个字的数据后,先取其高两位来分析。图3中,判断A是指:判断SR1中的数据是否是包含在Huffman判断表中的Huffman码头,判断B是指:判断SR0移位后剩下的数的位数是否不小于查得的Huffman码值位数,X是指SR0中剩下的还没有移位的数的位数,Y是指查得的Huffman码值位数。
Huffman
码是变长编码,Huffman解码时需要将所有压缩数据都按位在Huffman表中进行分析比较以确定惟一标识Huffman码的码头,如果直接采用从JPEG文件头中读取的Huffman表将非常浪费时间。为此,根据从JPEG文件中读取的Huffman表,生成了2个单独的表,即图3中的Huffman值表和判断表。值表存放的是与Huffman码头相对应的码值位数信息。判断表专门用于判断识别码头。判断表确定码头后,根据码头就可以在值表中直接查到Huffman码值的位数,知道了码值的位数就可以从JPEG文件中轻松取出该码值来,从而完成一个Huffman码的解码。 2.2.2反量化的实现
由图1可知:量化运算需要量化表的配合。从JPEG文件中读取的量化表一般有2个,分别用264位元素的一维数组来存储,分别用于对亮度和 {MOD}度行进反量化。反量化运算就是将上面经Huffman解码得到的数组中的元素与量化表中对应位置元素相乘。反量化的计算可以利用ADSP的可变址寄存器寻址方式和循环指令,灵活快捷地装载操作数并循环执行,这样可以大大减少非计算指令消耗DSP指令周期。反量化运算的ADSP实现代码如下:

为了进行后面的IDCT,还需要将完成反量化运算的数组进行Z字型变换,即按图4所示折线先后的顺序将一维数组变换成8×8的二维数组。这样,一个MCU经过反量化和Z字型变换后,就得到了8×8Y数组4个,CbCr数组各一个。 2.2.3IDCT的实现
IDCT
变换(离散余弦反变换),其计算可用下面的公式表示为:

为其他情况时,Cu=Cv=1。直接按照上面的公式计算,将会有很大的运算量,势必影响JPEG的解码速度,为此可以将二维的IDCT分为2个一维的IDCT,转换如下:

  这样对8×8的二维数组进行IDCT的计算可以转化为先对该数组的行分别进行8次一维IDCT,再对列分别进行8次一维IDCT,这样就简化了计算复杂度。下面研究如何快速实现一维IDCT
由文献[3]可得到8点一维DCT变换(用S8u)表示)同16DFT(离散傅里叶变换,用F16u)表示)的关系公式如下:

  由上面的公式可知:对应的16DFT的实部等于8点一维DCT变换乘以一个常数。因此,8点一维IDCT可由16DFT来代替。根据参考文献[3]的推导并结合ADSP的特点,8点一维IDCT可用如下公式流程来实现:


从上面的运算步骤可以看出,一维IDCT运算已经转化成了一系列简单的加减法及与常数相乘的乘法运算。简化了IDCT运算的复杂度,并大大降低了运算量。用ADSP实现上面的运算,要注意结合ADSP自身的特点,以上述第(3)步计算b3b4为例,ADSP实现代码如下:

上述代码利用了操作数的特点,合理调整了各公式数据的计算次序并选用合适的指令,使一次装载的4个数据可以完成乘、加、减三种运算,节约了指令周期。
2.3
后续处理的实现
经过上述处理后,JPEG图像解码任务基本完成,但是要将解码出的图像进行显示还需要一些后续处理。后续处理的任务之一就是完成颜 {MOD}空间的转换,即将JPEG图像数据的YCbCr颜 {MOD}空间转换为RGB颜 {MOD}空间,其转换公式如图5左边所示。但是,为了使计算出的RGB的值都是正数,需要对YCbCr分别加128进行修正,同时该公式中乘法运算出现了浮点数,故需要对浮点数进行定标处理。此处,参与乘法运算的浮点数定为Q14,为了使乘法运算的结果能直接参与加减运算,还需要将积再除以214。因此,图5左边的公式就需要转 变成右边的公式。从公式中可以看出:每计算出一对RGB数据,需要一对YCbCr数据参与运算,但是一个MCU计算出的YCbCr数据是4∶1∶1的关系,为此,在进行颜 {MOD}空间转换前,需将1Cb1Cr数组扩展成4Cb4Cr数组。完成颜 {MOD}空间的转换后,再将计算出的RGB数据按显示设备要求的格式排列,就可以显示图像了。
3结语
本文以上述算法和流程为基础,在ADSP的开发环境Visual DSP下,实现了JPEG的解码算法,并进行了优化,其中,消耗程序存储器2 566 B,数据存储器893 B。图6是原始JPEG图像,图7是采用上述算法流程,在ADSP中进行解码后得到的BMP图像。对本算法进行适当的修改,就可以应用到数码相机、PDA等多种嵌入式系统中。 参考文献 1]张益贞,刘滔.VisualC++.实现MPEG/JPEG编解码技术[M .北京:人民邮电出版社,2002
2]徐科军,黄云志.定点DSP的原理、开发与应用[M.北京:清华大学出版 社,
2002
3The Implementation of the 2D-IDCTJ.http://rnvs.informatik.tu- chemnit.zde/~jan/MPEG/HTML/IDCT.html.2000