覃松,李冰
(廣西師范大學(xué)電子工程學(xué)院,桂林541004)
一幅圖像如果按照原始的數(shù)據(jù)存儲(chǔ)和顯示,必定會(huì)耗費(fèi)很大的設(shè)備內(nèi)存和很長(zhǎng)的時(shí)間。為了減少圖像在電子設(shè)備中所占的容量,需要對(duì)圖像進(jìn)行壓縮。JPEG 標(biāo)準(zhǔn)在保證圖像質(zhì)量的情況下具有高壓縮率、圖像占用容量小、解碼簡(jiǎn)單、代碼量小等特點(diǎn)。目前它主要應(yīng)用在DSP、FPGA、ARM9等高速處理器上,這些處理器成本都比較高。
本文研究了一種在保證解碼速度和同等圖像質(zhì)量的情況下,采用更低成本的ARM 處理器STM32F103ZET6對(duì)圖像進(jìn)行解碼的方案。為了節(jié)省片內(nèi)存儲(chǔ)資源,利用SD卡存儲(chǔ)圖像,對(duì)圖像進(jìn)行分塊解碼,并且邊解碼邊在2.8寸TFT 屏幕顯示。
硬件方面,由 4 個(gè)部分構(gòu)成:解碼芯片STM32F103ZET6、SD 卡電路、驅(qū)動(dòng)芯片HX8347控制的2.8寸TFT 顯示屏幕、鍵盤(pán)輸入控制電路。其設(shè)計(jì)框圖如圖1所示。軟件方面,主要由4個(gè)功能模塊構(gòu)成:SD 卡的驅(qū)動(dòng)及FatFS 文件系統(tǒng)程序、JPEG 解碼算法程序、TFT 屏幕的顯示驅(qū)動(dòng)程序、按鍵控制程序。
系統(tǒng)工作過(guò)程:首先把JPEG 圖像存儲(chǔ)在高速SD 卡中,利用STM32F103ZET6自帶的SD卡接口,通過(guò)SD 卡模式讀取SD卡中的圖像;然后,利用JPEG 解碼算法解碼出格式為RGB565的數(shù)據(jù);最后,顯示在TFT 上。另外,用3個(gè)按鍵作為輸入,功能分別為復(fù)位、向后翻一張圖片和向前翻一張圖片。
圖1 系統(tǒng)硬件方框圖
1.1.1 STM32F103VET6處理器簡(jiǎn)介
STM32F103VET6是內(nèi)核為32位的Cortex-M3處理器,最高工作頻率為72 MHz,具有512KB的閃存程序存儲(chǔ)器和64 KB 的SRAM。內(nèi)核具有突出的中斷處理能力,其實(shí)時(shí)性高,系統(tǒng)存儲(chǔ)要求低,并且功耗和成本很低,所以具有廣泛的應(yīng)用領(lǐng)域。
1.1.2 SD卡的硬件電路工作模式選擇
STM32F103ZET6驅(qū)動(dòng)SD 卡,具有兩種工作模式:SPI模式和SD卡模式。本文采用SD卡模式,它用4根數(shù)據(jù)線,因此比僅用2 根數(shù)據(jù)線的SPI模式讀寫(xiě)速度快了一倍。
1.1.3 TFT硬件電路設(shè)計(jì)
本文把TFT 當(dāng)作外部存儲(chǔ)器來(lái)使用,對(duì)驅(qū)動(dòng)芯片HX8347的讀寫(xiě)和控制信號(hào)進(jìn)行編程,只需指定指針就可以實(shí)現(xiàn)對(duì)TFT 的讀寫(xiě)。這樣既簡(jiǎn)化了對(duì)TFT 的編程,而且又提高了訪問(wèn)速度,避免了用I/O 口模擬時(shí)序訪問(wèn)TFT 產(chǎn)生的“拖影”。
解碼框圖如圖2所示。首先,從SD 卡中讀取圖像的信息頭,它包含圖像識(shí)別碼、Huffman表,量化表,圖像的高、寬,采樣因子等解碼需要的信息。其次,對(duì)圖像數(shù)據(jù)進(jìn)行Huffman解碼、反量化、反離散余弦變換(IDCT)、轉(zhuǎn)換圖像數(shù)據(jù)。最后,進(jìn)行圖像顯示。
圖2 解碼框圖
JPEG 圖像是按照很多數(shù)據(jù)塊(MCU)進(jìn)行存儲(chǔ),每一塊分為8×8 像素。數(shù)據(jù)塊和像素點(diǎn)都是按照從左到右、從上到下的順序存儲(chǔ)數(shù)據(jù)。JPEG 利用Huffman亮度表和色度表分別對(duì)圖像亮度和色度進(jìn)行解碼。值得注意的是,解碼出的直流系數(shù)DC是校正值,而不是真正的DC值,需要加上后一個(gè)MCU 解碼出來(lái)的DC值;AC值解碼出來(lái)就是AC值。用亮度和色度量化矩陣對(duì)它們進(jìn)行反量化,公式如下:
其中,C(x,y)是Huffman解碼出來(lái)的矩陣,Q(x,y)是量化矩陣。
在量化后8×8的矩陣中,數(shù)據(jù)是按照“之”形進(jìn)行排列,所以,需要進(jìn)行反Zig-zag變換。根據(jù)編碼,對(duì)圖像數(shù)據(jù)正向離散余弦變換。解碼就用IDCT 進(jìn)行反變換,即從頻域向時(shí)域變換。反向離散余弦變換公式為:
需要注意RGB轉(zhuǎn)換結(jié)果,此TFT 支持RGB值的范圍是(0,255),轉(zhuǎn)換的結(jié)果如果不在這個(gè)范圍內(nèi),小于0就設(shè)置為0,大于255就設(shè)置為255。
IDCT 公式有兩個(gè)0到7累加和計(jì)算,這樣要獲得一個(gè)IDCT 系數(shù),需要做64次乘法和64次加法,而完成整個(gè)8×8像素的IDCT 需要4 096次乘法和4 096次加法,計(jì)算量非常大。對(duì)于STM32F103ZET6處理器來(lái)說(shuō),將產(chǎn)生極大的運(yùn)算量,極大地占用CPU 的資源。為此,可以簡(jiǎn)化為兩個(gè)一維的公式:
經(jīng)過(guò)公式的簡(jiǎn)化,分別計(jì)算行和列的IDCT 變換。對(duì)于一行來(lái)說(shuō)需要計(jì)算的是64次乘法和64次加法,8行就是512次乘法和512次加法;列同行計(jì)算一樣,結(jié)果總運(yùn)算量為1024次乘法和1024次加法,相對(duì)于二維運(yùn)算量減少了3/4。
利用STM32F103ZET6平臺(tái)解碼一幅JPEG 圖像的流程圖如圖3所示。程序代碼在ST 公司自帶的庫(kù)文件上編寫(xiě)。初始化階段,先配置好STM32F103ZET6內(nèi)部時(shí)鐘、中斷處理和FSMC、按鍵、SD 卡、TFT 等外設(shè)接口,再初始化FatFS文件系統(tǒng)、TFT 屏幕。初始化成功之后,讀取JPEG 圖像文件的信息頭,讀完段標(biāo)記SOS后是圖像數(shù)據(jù),每次讀取一個(gè)MCU(即64個(gè)數(shù)據(jù))塊,對(duì)它進(jìn)行Huffman解碼、反量化、反Zig-zag編碼、IDCT 變換、YUV 到RGB的顏色轉(zhuǎn)換和顯示,直到結(jié)束。
將像素為320×240,位深度為24 位,大小為40 KB左右的JPEG 圖像進(jìn)行解碼。在Keil4軟件里測(cè)試,公式簡(jiǎn)化后平均每一幅圖像的解碼時(shí)間大約是0.25s,比簡(jiǎn)化前提高了大約1.25s。速度比較快的主要原因是二維IDCT 公式的簡(jiǎn)化,減少了STM32F103ZET6 的計(jì)算量,讀取SD 卡用SD 卡模式而不是SPI 模式,同時(shí)利用FSMC接口電路連接TFT 屏幕。經(jīng)過(guò)研究對(duì)比,在算法和圖像質(zhì)量一樣的前提下,用TMS320DM2375的DSP雙核處理器和ARM7進(jìn)行解碼,速度分別是0.03s和2.4s,STM32F103ZET6比ARM7 處理器快了大約2.15s,比TMS320DM2375慢了0.22s。雖然比TMS320DM-2375慢了0.22s,但是不會(huì)有太大的影響。而ARM7解碼速度太 慢,并 不 利 于 嵌 入 式 的 應(yīng) 用。另 外,STM32F103ZET6還有一個(gè)很大的優(yōu)點(diǎn)就是其官方提供了庫(kù)函數(shù),使其軟件開(kāi)發(fā)周期遠(yuǎn)遠(yuǎn)小于DSP。STM32-F103ZET6解碼前和解碼后的圖像如圖4和圖5所示。
圖3 解碼流程圖
圖4 解碼前圖像
圖5 解碼后圖像
本文完成了JPEG 標(biāo)準(zhǔn)在STM32F103ZET6上解碼的設(shè)計(jì)方案,實(shí)現(xiàn)了邊讀取SD卡中的圖像數(shù)據(jù)邊在TFT上的顯示,這種方法減少了內(nèi)存容量。解碼器占用的RAM 僅3KB,ROM 為4.5~9.5KB。軟件設(shè)計(jì)時(shí),對(duì)解碼器進(jìn)行封裝,只留一個(gè)接口函數(shù),因此具有很強(qiáng)的移植性;并且進(jìn)行了二維ICDT 公式的簡(jiǎn)化和代碼的優(yōu)化。雖然51、LPC、AVR單片機(jī)成本比STM32F103ZET6稍微低點(diǎn),但是解碼的速度很慢。DSP、ARM9、FPGA 等雖然解碼很快,但在電子廣告、數(shù)碼播放器、電子玩具、車(chē)載導(dǎo)航系統(tǒng)等對(duì)解碼圖像要求不高的嵌入式產(chǎn)品上使用就顯得成本較高。此外,ST 公司已經(jīng)推出了價(jià)格與STM32F103系列相當(dāng)?shù)腟TM32F4 系列,專(zhuān)門(mén)處理視頻圖像的處理器,勢(shì)必大大提高視頻圖像的解碼速度。綜合以上考慮,以STM32F103ZET6作為新一代的解碼設(shè)備具有較高的研究及應(yīng)用價(jià)值。
[1]陰國(guó)富,李云飛.基于JPEG 標(biāo)準(zhǔn)的靜止圖像壓縮[J].科學(xué)技術(shù)與工程,2008,8(11):3001-3003.
[2]張強(qiáng),雷躍明,周先發(fā),等.嵌入式系統(tǒng)JPEG 圖像解碼器設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2007(9):1001-9081.
[3]吳嘉慧.JPEG圖像解碼方案[J].現(xiàn)代計(jì)算機(jī),2007(3):49-53.
[4]蒙智明,屈百達(dá).基于TMS320DM275 嵌入式系統(tǒng)的JPEG解碼實(shí)現(xiàn)[C]//2007 中國(guó)控制與決策學(xué)術(shù)年會(huì)論文集,無(wú)錫,2007:1115-1118.
[5]廖小情,陳小平.JPEG 軟件解碼及其在ARM7 上的實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2011,30(9):39-45.
[6]劉斌,姜弢,熊維波.基于ZEVIO1020 的JPEG 解碼設(shè)計(jì)與實(shí)現(xiàn)[J].應(yīng)用科技,2008,35(11):15-18.
[7]杜小偉,謝桂泉,周展懷,等.基于ATmega128 的LED 屏圖像數(shù)據(jù)解碼設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2009(2):192-194.
[8]Kun Binlee,Chi Chengju,MediaTek.A Memory-Efficient Progressive JPEG Decoder[C]//VLSI Design,Automation and Test,Taiwan,2007:1-4.
[9]Yoshihiro Noguchit,Hiroyuki Kobayashi,Hitoshi Kiyatt.A Method of Extracting Embedded Binary Data From JPEG Bitstreams Using Standard JPEG DECODER[C]//Image Processing,Japan,2000:577-580.