在线工博会

基于DSP的JPEG图像解码算法的实现
西安工程科技学院 魏忠义 朱磊
为节省流量,手机版未显示文章中的图片,请点击此处浏览网页版
摘 要:概述了JPEG图像解码算法的基本原理,论述了JPEG图像解码算法基于DSP的实现过程,并重点讨论了JPEG图像解码中IDCT变换和Huffman解码算法的实现和优化。本文介绍的JPEG图像解码算法可以应用到数码相机、多媒体手机等多种场合。
关键词:DSP;JPEG;IDCT变换;Huffman解码
Realization of JPEG Decoding Algorithm Based on DSP
WEI Zhongyi, ZHU Lei
(Electronics and Information College, Xi′an University of Engi neering Science & Technology, Xi′an,710048, China)
Abstract:This paper summarizes the basic principal of decodi ng algorithm of JPEG, expounds the realization of JPEG decoding with DSP, and es pecially discusses the realization and optimization of IDCT transform and Huffma n decoding. The algorithm of JPEG decoding can be used in many situations, such as digital camera,multimedia mobile and so on
Keywords:DSP;JPEG;IDCT transform;Huffman decoding
JPEG算法是一种数字图像压缩编码算法,具有压缩比例高、失真小的特点,并已被确定为国际标准[1]。要对以JPEG文件格式进行存储的数字图像进行显示和回放,需对其进行解码。DSP处理器具有特殊的处理器结构、指令系统和指令流程,是一种特别适合数字信号处理的微处理器[2]。DSP对JPEG图像的解码处理,具有小巧灵活、实时高效的特点,在诸如数码相机、监视系统、手机、PDA以及可视电话等多媒体嵌入式系统中应用广泛。
1 JPEG图像解码算法的基本原理
JPEG图像解码需要将JPEG图像数据恢复成压缩编码前的图像数据。如图1所示,JPEG图像解码须经过预处理、Huffman解码、反量化、IDCT变换这几个主要步骤,然后还要经过后续处理才能最终将JPEG图像显示出来。

(图片)

2 JPEG图像解码算法的实现和优化
本文以16位定点ADSP为例,论述使用DSP将24位真彩色JPEG图像解码为可显示的RGB颜色空间图像的算法流程。
2.1 预处理
JPEG图像解码需要从JPEG图像文件中提取解码需要的各种信息和压缩数据。JPEG图像文件大体上可分为2个部分:压缩数据和标记码。压缩数据是以MCU(最小编码单元)形式存储的经过压缩编码后的数据。标记码给出了诸如图像长度、宽度、量化表、Huffman表等重要信息,而这些信息都包含在不同类型的标记码中。预处理算法需要识别不同的标记码,并提取标记码中的有用信息。当进入SOS(扫描开始)标记码并开始读取压缩数据时,预处理任务结束,开始进入解码阶段。
2.2 基于IDCT的解码实现
基于IDCT的解码过程如图1虚线框所示,包括:Huffman解码、反量化和IDCT变换。如前所述JPEG文件中的压缩数据是以MCU形式存储的,因此解码过程也必须以MCU为单元来实现,即不断对MCU单元进行循环解码,直到取完所有压缩数据为止。JPEG文件中MCU可以定义成多种模式,本文以MCU的4∶1∶1模式进行说明。
2.2.1 Huffman解码的实现

(图片)

如图2所示,对一个MCU进行Huffman解码,需在完成亮度解码后才能进行色度解码。解码后得到6个具有64位元素的一维数组,分别是:4个Y亮度数组、1个Cb色度数组、1个Cr色度数组。对亮度和色度进行解码其实就是对亮度数组和色度数组的解码。对一个数组来说,Huffman解码包括直流解码和交流解码。对数组第一个元素的解码称为直流解码(简记为DC解码),对剩下的63个元素的解码称为交流解码(简记为AC解码)。JPEG文件中一般包含4个Huffman表,即亮度DC表、AC表,色度DC表、AC表。对不同的数据进行解码需要调用不同的Huffman表。DC解码出的数据称为DC值,但最终的DC值却是直接解码出的DC值与该数组紧跟的前面一个数组的DC值之和。AC解码一般会得到多个数据,包括一些连续0数据和一个非0数据。
不管是亮度还是色度解码,也不管是AC还是DC解码, Huffman码是其最小解码单位,且每个Huffman码的解码流程都是大致相同的。一个Huffman码包括码头和码值2部分,码头用来惟一的标识该Huffman码,并与Huffman表一一对应,码值是该码的实际大小。图3是ADSP完成一个Huffman码解码的流程图。在图3中,SR是ADSP中32位移位寄存器,他包括2个可以单独使用的16位寄存器:SR0和SR1。当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个,分别用2个64位元素的一维数组来存储,分别用于对亮度和色度行进反量化。反量化运算就是将上面经Huffman解码得到的数组中的元素与量化表中对应位置元素相乘。反量化的计算可以利用ADSP的可变址寄存器寻址方式和循环指令,灵活快捷地装载操作数并循环执行,这样可以大大减少非计算指令消耗DSP指令周期。反量化运算的ADSP实现代码如下:

(图片)

为了进行后面的IDCT,还需要将完成反量化运算的数组进行Z字型变换,即按图4所示折线先后的顺序将一维数组变换成8×8的二维数组。这样,一个MCU经过反量化和Z字型变换后,就得到了8×8的Y数组4个,Cb,Cr数组各一个。

(图片)

2.2.3 IDCT的实现
IDCT变换(离散余弦反变换),其计算可用下面的公式表示为:

(图片)

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

(图片)

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

(图片)

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

(图片)

(图片)

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

(图片)

上述代码利用了操作数的特点,合理调整了各公式数据的计算次序并选用合适的指令,使一次装载的4个数据可以完成乘、加、减三种运算,节约了指令周期。
2.3后续处理的实现
经过上述处理后,JPEG图像解码任务基本完成,但是要将解码出的图像进行显示还需要一些后续处理。后续处理的任务之一就是完成颜色空间的转换,即将JPEG图像数据的YCbCr颜色空间转换为RGB颜色空间,其转换公式如图5左边所示。但是,为了使计算出的R,G,B的值都是正数,需要对Y,Cb,Cr分别加128进行修正,同时该公式中乘法运算出现了浮点数,故需要对浮点数进行定标处理。此处,参与乘法运算的浮点数定为Q14,为了使乘法运算的结果能直接参与加减运算,还需要将积再除以214。因此,图5左边的公式就需要转 变成右边的公式。从公式中可以看出:每计算出一对R,G,B数据,需要一对Y,Cb,Cr数据参与运算,但是一个MCU计算出的Y,Cb,Cr数据是4∶1∶1的关系,为此,在进行颜色空间转换前,需将1个Cb和1个Cr数组扩展成4个Cb和4个Cr数组。完成颜色空间的转换后,再将计算出的R,G,B数据按显示设备要求的格式排列,就可以显示图像了。

(图片)

(图片) (图片)

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
[3]The Implementation of the 2D-IDCT[J].http://rnvs.informatik.tu- chemnit.zde/~jan/MPEG/HTML/IDCT.html.2000 8/1/2005


电脑版 客户端 关于我们
佳工机电网 - 机电行业首选网站