关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > JPEG软件解码及其在ARM7上的实现

JPEG软件解码及其在ARM7上的实现

作者:时间:2011-09-21来源:网络收藏

 JPEG作为一种成熟的图像压缩标准,具有压缩效率高、恢复的图像质量好、易于实现等优点[1],已经得到了广泛的运用。随着现代嵌入式技术的快速发展,各类电子产品为了进一步降低成本,JPEG技术也越来越多地受到各种小型嵌入式产品的青睐。目前嵌入式系统方面对JPEG图像软件解码较多地应用在DSP和多核等高速处理器上[2-3]。
 本文提出一种基于处理器LPC2478的软件解码JPEG方案,同时将图像显示在高分辨率10.4英寸的、具有LVDS接口的TFT_LCD液晶显示器AA104SG02上。
1 硬件设计及实现
 以LPC2478为控制核心的小型嵌入式系统硬件实现框图如图1所示。

 LPC2478是一款NXP公司生产的基于的微控制器[4],拥有丰富的片上资源,在嵌入式控制领域得到了广泛的运用。LPC2478的内核为32 bit的TDMIS处理器,CPU工作频率最高可达72 MHz,片上Flash为512 KB,SDRAM为96 KB,Falsh、SRAM、SDRAM可扩展(SDRAM最大可扩展到1 024 MB),带SSI、USB、UART等多种外设接口。此外,LPC2478还带有LCD控制器,支持TFT及STN显示模式。
 AA104SG02为三菱公司推出的10.4型SVGA TFT_LCD显示屏[5],分辨率为800×600,亮度为400,对比度为500:1,输入电压为3.3 V,标准工作频率为40 MHz,支持多种数据格式,电气接口为LVDS信号。LVDS信号是一种能够满足大数据传送需求的差分信号技术,具有功耗低、可靠性高及高速传送等特点。
 在LPC2478控制LCD显示模式下,LCD显示数据的位宽度为16 bit,采用数据格式为R:G:B=5:6:5。LCD控制器输出的信号有RGB数字信号、像素点时钟(PCLK)、行同步时钟(HSYNC)、场同步时钟(VSYNC)及其他控制信号,这些信号均以并行方式输出,因此,LPC2478的LCD控制器的输出并行信号与AA104SG02的LVDS信号不能直接连接,必须在两者之间加驱动电路,将并行信号转换为LVDS差分信号。驱动芯片DS90383是一款信号传输转换芯片,可将接收到的TTL/CMOS数据转换为LVDS数据流,支持VGA、SVGA等更高分辨率,输入时钟为20 MHz~60 MHz,3.3 V单电源供电。因此,利用DS90383可实现两者之间的信号转换。
 在液晶控制器中,需要为显示数据提供相应大小的缓存。屏幕为800×600像素,每个像素占2 B,则需要960 000 B的SDRAM作为显示缓存。此外,在JPEG解码过程中,需要缓存原始JPEG图像数据、JPEG解码中间数据等,对于一幅800×600的JPEG图片来说,解码需要2 MB左右的缓存空间。而LPC2478的片上SDRAM远远不能满足空间要求,因此,本系统外扩了一个32 MB的SDRAM。与此同时,考虑到在实际应用中需要更换不同的显示图片,但又不可能把很多幅图片都存储在芯片内,为此,还外接了一个大容量SD卡。当需要显示某个图片时,LPC2478可从SD卡中读取图片,解码后显示在LCD上。
2 JPEG软件解码算法优化及实现
 JPEG解码技术主要包括获取图像基本信息、建立解码码表、Huffman解码、反量化、反Zig-Zag、IDCT及颜色空间转换。JPEG解码流程图如图2所示。

2.1 图像基本信息获取
 在JPEG图像解码之前,需要通过JPEG文件获取图像解码时所需的各种信息,包括图像的大小、采样因子、量化表以及Huffman表等。由于JPEG文件的存储格式为JFIF格式(主要为标记码和压缩数据),因此,可以根据不同的标记码获得相应的信息。在扫描开始(SOS)标记段结束后才是真正的图像压缩数据流。
2.2 解码码表建立
 在Huffman解码前,要建立解码码表。对于一幅图像,一般有4个Huffman表(直流0号表、直流1号表、交流0号表、交流1号表),每个码表都建立各自的三张解码码表,分别为:不同位数的码字的数量表(Code_bitsnum_table)、码权值表(Code_weight_table)、码字表(Code_value_table)。不同位数码字的数量表和码权值表可直接从Huffman表中获得。而码字表则是通过Huffman表建立Huffman树获得,且码字均自动按从小到大排列,而且没必要保存每个码字的长度(以下简称码长)。因为每个码长可由不同位数码字的数量表与码字表推算而得。建立码字表的流程图如图3所示。

 图中,L表示码字的位数(最长为16 bit);huffnum为Huffman表的序号;Read_Byte()为读取Huffman表的值,表示对应L位码字的个数,如果等于0,表示没有L位的码字。第一个码字值必定为0,若有K个码字位数相同,则当前码字为它前面的码字加1;但如果它的位数比它前面的码字位数大,则当前码字是前面码字加1后再在后面添若干个0,直到满足位数长度位置为止。
2.3 Huffman解码优化
 在JPEG文件中,图像压缩数据流是逐位存储的,因此解码时也必须逐位地读入。Huffman解码的过程主要是解码码表的查找过程。简单的解码方法为直接查找解码码表直到找到正确的Huffman码,此时,逐位移入码流获得的编码值都需要从解码码表的头开始查找,比较码字是否相同、码长是否相等。这将需要大量的存取操作,不仅会增加代码量,同时还将耗费较多的CPU时间。
 为降低代码开销及尽可能减少CPU时间,本文对该解码过程进行了优化。获得编码值及编码值长度后,根据不同位数码字的数量表可直接定位到码字表中第一个码长相等的码字,若编码值不小于该码字且不大于相同码长的码字的最大值,则可以找到与编码值相同的码字;否则不能找到,须重新获得新的编码值后再按上述步骤查找。根据查找出的相同的码字在码字表中的位置,由码权值表获得该码字的权值。当这个码字为直流码字时,权值的大小即为直流分量数值的二进制位数,再根据Huffman直流译码表译码;当这个码字为交流码字时,权值的高4位表示当前值前面有多少个连续的0,低4位为该交流分量数值的二进制位数,再根据Huffman交流译码表译码。优化后的一次Huffman解码流程图如图4所示。

 在JPEG文件中存储了两张量化表,分别为亮度量化表和色度量化表。反量化运算过程即为经Huffman解码得到的系数矩阵与相应的量化矩阵相乘。由于数据是按8×8矩阵的“之”字行排列,所以要对反量化运算的结果进行反Zig-Zag操作。
 在解码8×8的数据块过程中发现,右下角的高频分量存在大量的0。如果完成Huffman解码之后,再进行反量化及反Zig-Zag排序,必然存在许多乘0运算及重复的数据存取操作,而且同时必须至少开辟两块8×8大小的SDRAM来存储这些数据,这样不仅浪费了时间也浪费了空间,不利于在小型嵌入式系统上的应用。因此,采取Huffman解码、反量化及反Zig-Zag三步合一的优化措施,Huffman解码出一个值后立即进行反量化、反Zig-Zag操作。但为了对应原来的存储顺序,需要建立这样一个对应存储位置的数组:

2.4 IDCT及浮点转整点运算
 在图形解码运算中,IDCT变换是主要运算,占用大量的CPU时间。若直接进行IDCT变换计算,一次二维IDCT变换需要1 024次乘法和896次加法,这样,在ARM7上解码800×600大小图像会相当慢,因此要提高解码效率,必须利用IDCT的快速算法。为此,本文采用了参考文献[6] ARAZ等人提出的IDCT快速算法。该算法的主要思想是:
 (1)将二维的IDCT分解为两个一维的IDCT降维处理,先后在行方向、列方向上做IDCT变换。
 (2)IDCT通过数学变换转化为离散傅里叶逆变换(IDFT),然后利用矩阵变换简化计算。
 (3)减少乘法和加法运算次数。其结果是完成一次2D-IDFT仅需要10次乘法和29次加法。
原IDCT变换运算过程包含了5步计算,而本系统将其简化为3步,最大限度地减少数据存取操作次数。三角函数及一些固定的系数采用查表方式,除法运算的除数均为2的n次幂,可直接转换为右移操作,以减少计算量。但乘法和加法运算均为有符号浮点运算,而ARM7只支持整点运算,因此还需要将浮点运算转化为整点运算。
 在IDCT运算中,大部分的浮点乘法运算为一个数乘以一个余弦值(即乘数小于1),根据这个特点,本文设计了如下浮点转整点运算方法:
 (1)将浮点数乘以256,得到的32位整点数格式为0xXXXXXX XX,高24位保留了浮点的整数部分及符号位,低8位保留到了小数部分的第4位。
 (2)乘法运算:被乘数转化为如上格式的32位整数(如0xAAAAAABB),乘数要求小于1。转化后为8位整数,如0xCC。为了防止溢出,乘法运算做如下更改:
0xAAAAAABB×0xCC=(0xAAAAAA×0xCC)+((0xBB×0xCC)>>8)
 该方法能确保整个运算过程中数据不溢出。
2.5 色彩空间转换
 通过解码出来的Y(亮度)CrCb(色度)信号,要在屏幕上显示图像,还必须转化为RGB信号。其转换公式为:
 R=Y+1.402×Cb+128
 G=Y-0.344 14×Cr-0.714 14×Cb+128
 B=Y+1.772×Cr+128
 计算时,乘法运算使用上述的浮点转整点运算法则,但需要作如下修改:
 R=Y+Cb+Cb×0.402+128
 G=Y-Cr×0.344 14-Cb×0.714 14+128
 B=Y+Cr+Cr×0.772+128
 解码后的RGB信号直接存入显示缓存区,将实时显示在屏幕的对应像素点上,实现边解码边显示,直到整个图像全部显示在屏幕上。解码效果如图5所示,解码优化前耗时为30 s,优化后耗时为15 s,速度提高了一倍。

 本系统实现了JPEG图像通过LPC2478解码显示在像素为800×600的AA104SG02液晶显示器上,完成了基于LPC2478的图像解码及显示的硬件设计,成功将JPEG解码算法移植到本系统上,优化了解码算法。通过将优化后的Huffman解码与反量化、反Zig-Zag相结合,减少了乘零运算及数据存取操作、降低了内存消耗;引入快速IDCT算法,减少了乘法和加法运算次数;将浮点运算转换为整点运算,加快了运算速度、提高了运算精度。使复杂的JPEG图像解码在主频并不很高的小型嵌入式产品上得到了很好的实现。本系统可应用于控制系统的液晶桌面图片显示,为人机交互提供了友好的操作界面。
参考文献
[1] 张益贞,刘滔.VisualC++.实现MPEG/JPEG编解码技术[M].北京:人民邮电出版社,2002.
[2] 薛永林,刘珂,李凤亭.并行处理JPEG算法的优化[J].电子学报,2002(2).
[3] 董岚,李丽,张宇昂.基于AMBA2AHB总线多核平台的JPEG解码[J].电子测量与仪器学报,2009,23(2).
[4] NXP Semiconductors. LPC24XX user manual. Rev. 04-26,August, 2009.
[5] Mitsubishi Electric Corp. Telchnical specification Aa104sg01. Mar.9, 2006.
[6] ARAI Y, AGUI T, NAKAJIMA M. A fast DCT-SQ scheme for images[J]. IECE Transactions 1990,71(11): 1095-1097.

pid控制相关文章:pid控制原理


c++相关文章:c++教程




关键词: ARM7

评论


相关推荐

技术专区

关闭