方兆龍,劉凌云,江 波,楊東平
(1湖北工業大學電氣與電子工程學院,湖北武漢430068;2湖北工業大學太陽能高效利用湖北省協同創新中心,湖北武漢430068)
MJPEG(Motion-Join Photographic Experts Group)即運動靜止圖像(或逐幀)壓縮技術,它是在靜態圖像壓縮技術JPEG的基礎上發展起來的動態圖像壓縮技術[1]。MJPEG把運動的視頻序列作為連續的靜止圖像來處理,只考慮幀內壓縮而不考慮幀間壓縮,壓縮倍數為1/80~1/20倍[2]。這種壓縮方式能夠單獨對某一幀進行壓縮處理,在編輯過程中可隨機存儲每一幀。MJPEG采用漸層式技術,先發送低解析的圖檔,再補送細部資料,可以獲取清晰度很高的視頻圖像,而且可以靈活設置每路的視頻清晰度和壓縮幀數[3]。它的壓縮和解碼是對稱的,可以用相同的硬件和軟件實現。由于不對視頻流的幀間進行時間冗余壓縮處理,所以壓縮效率不是很高,存儲占用空間達到每幀8~15 K字節,最好能做到每幀3 K字節,如果采用高壓縮比會嚴重降級視頻質量。然而在對幀數要求不高的情況下,MJPEG的這個弱點卻使它擁有很好的性價比[4-6]。如網絡攝像機等只要求持續監控,對圖像清晰度和刷新率要求不高,它能夠在有限網絡資源支持下將清晰的畫面迅速傳送到監控端,因此MJPEG適用于公共場合、公司等場合的視頻監控。
視頻解碼系統根據應用場合不同有多種硬件實現方案,實現高清編解碼硬件一般采用專用芯片或者DSP芯片。但是這些芯片有的不支持解壓縮,有的僅在功能上支持而沒有成熟的核函數,而且價格昂貴。本文采用的Cortex-m4內核的STM32F4系列微處理器,具有微控制器和數字信號處理器的功能,最高主頻達168 MHz,支持多種低功耗模式,DSP指令和FPU使它在視頻圖像處理方面具有很大的優勢。綜合Cortex-M4硬件的低成本高特性和MJPEG視頻解碼算法的實時清晰性,在視頻監控工程中采用這種方案擁有很好的性價比。
硬件系統采用ARM Cortex-M4處理器內核的STM32F407ZGT6芯片為實驗平臺,利用SDIO端口讀取SD卡里的AVI視頻文件到芯片內存中,然后利用芯片的DSP指令和FPU浮點運算以及ART自適應實時加速器功能對視頻壓縮數據流進行連續解碼,解碼后的圖像幀通過FSMC接口在LCD屏上實現播放清晰的視頻。硬件平臺的結構如圖1所示。

圖1 硬件系統圖
由于MJPEG是在JPEG基礎上發展起來的,而且MJPEG只考慮幀內的空間冗余,而不考慮幀間的時間冗余,它把連續的視頻圖像當作一個個靜止圖像處理,因此它的解碼算法核心還是JPEG算法。在滿足視頻監控實時性要求的情況下,本文對一幀圖像的JPEG解碼算法進行優化處理。如圖1所示,JPEG圖像解碼主要包括Huffman解碼、反量化、IDCT這三個部分,開始還要經過預處理獲取視頻解碼所需的各種信息和壓縮數據,最后還要經過顏色空間轉換才能實現圖像的顯示。

圖2 JPEG解碼流程圖
由于嵌入式程序受硬件資源的限制,因此實現視頻解碼需要充分利用Cortex-M4硬件平臺資源。Cortex-M4內核采用32位、多重AHB總線矩陣和多通道DMA控制器,能夠實現程序執行和數據傳輸的并行處理,數據傳輸速率得到很大提升。它還擁有192KB的SRAM和自適應實時加速器ART,SRAM是CPU和外部主存的高速緩沖器。如果CPU訪問的數據已經預存到SRAM中,就不用等待去外存中完成數據的搬移,SRAM連接到I-Bus可以加快程序執行速度,SRAM連接到D-Bus可以加快獲取數據,因此可以將經常使用的數據指令成組讀到SRAM中,提高運算效率。Cortex-M4具有浮點運算單元(FPU),支持所有的ARM單精度數據處理指令和數據類型,通過內置單精度FPU提升算法的執行速度,利用Cortex-M4自帶的DSP指令和浮點運算功能提高視頻圖像處理質量。采用浮點功能的指令對比見圖3。

圖3 浮點指令性能對比
目前主要的優化處理方式:離散余弦變換采用并處方式;以增加儲存容量的代價來換取速度的提高;根據輸入圖像的頻率特點,采用自適應改變量化等級數,即對圖像變換后的低頻分量和高頻分量進行不同步長的自適應量化。綜合考慮以上方法和對比其他軟硬件平臺,本文的重點是利用硬件平臺Cortex-M4的優勢實現MJPEG視頻解碼,在降低硬件成本的情況下,極大提高圖像的質量,更注重方案的工程實際應用價值。
Huffman解碼一個MCU得到亮度和色度的一維64位元素的數組,數組中第一個元素解碼稱為直流解碼,剩余的63個元素解碼稱為交流解碼。直流系數DC由于前后塊間存在相關性,一般采用DPCM編碼,而交流系數AC采用RLE編碼,因它們的編碼特點不同,所以解碼時要采用不同的Huffman表。人眼對亮度比色度敏感,編碼過程中對色度的壓縮比亮度大,因此兩者的解碼表也不同。一個MCU解碼單元需要4個huffman表。反量化是將霍夫曼解碼得到的數組中的元素與量化表中對應位置的元素相乘的過程,也需要2個量化表,分別對應亮度和色度。這兩個過程實際上是一個查表的過程,如果將壓縮數據流逐個輸入,查找huffman表和量化表直到找到正確的碼表,將耗費大量的存取操作,降低了整個系統的速度。Cortex-M4內核含有192KB的SRAM和自適應實時加速器ART,而查表是不斷重復的操作,因此可以將huffman表和量化表存取到片內數據存儲器中。當從輸入碼流中讀取一個MCU時,可以實現快速查表解碼,而不用到外存中去查表,節省了大量的查表解碼時間。

把圖像數據從頻率域變換到空間域,離散余弦反變換(IDCT)變換公式如上式。考慮這個公式的運算量,可以采用行列分離算法完成IDCT的硬件實現,而行列分離算法就是把二維IDCT變成2個一維IDCT,即先對數組的行進行8次一維IDCT,再對列進行8次一維IDCT,使得計算復雜度降低。轉換公式如下

本文離散余弦反變換部分采用Arai算法,因為相比其它算法,它只需要13次乘法和29次加減法,而其中8次乘法可以合并在前面的反量化部分,所以Arai算法實際上只需要5次乘法和29次加法。它采用二維變一維以及奇偶分開處理方式,一維IDCT流程圖見圖2。

圖4 1維IDCT變換

上述代碼是一列中偶數點的IDCT運算程序,它們只是簡單的加減法和與常數的乘法運算,理論上IDCT運算的復雜度已經降低很多。但是Cortex-M4內核含有DSP指令和單精度浮點運算功能,可以有效提高代碼執行效率,減少了定點算法的縮放比和飽和負荷。Cortex-M4是32位處理器,乘法累加MAC能夠在單周期內完成一個32×32+64→64或2個16×16的運算,為其它任務釋放了處理器的寬度。在解碼過程中IDCT系數占用連續的16位寬數據,可以利用SIMD指令將2個16位打包進行并行的讀寫運算,實現一次讀取2個系數即32位寬,提高代碼執行效率。而DSP指令庫函數含有數學函數,利用這些函數改寫上述程序將提高速度。因為一般的硬件平臺沒有浮點運算單元,通常將浮點轉成定點進行處理。原程序中對變換系數采取了定標處理,將它們左移12位變成定點處理。因此可以利用Cortex-M4平臺的DSP指令和浮點功能對上述程序進行優化,變換代碼如

經過上述步驟解碼出來的信號是YCbCr格式,由于人眼的視覺特性,這種格式有利于壓縮處理,但是它需要轉換成RGB信號才能在屏幕上顯示。其轉換公式為

這個變換公式中存在浮點運算,因此也可以運用Cortex-M4內核的DSP指令和浮點運算庫函數對它們進行改寫替換。完成上述所有操作后,就可以在LCD屏上顯示動態連續播放的視頻(圖5)。

圖5 LCD屏播放的視頻
本文以JPEG算法為基礎對MJPEG的視頻解碼算法進行分析和優化處理,結合硬件平臺Cortex-M4的資源優勢,利用它的DSP指令和浮點運算功能對離散余弦反變換和顏色變換部分進行重點優化,而對比較耗時的依據Huffman表和量化表進行查表解碼的過程,利用自適應實時加速器功能將他們預存取到內存緩沖區,提高了代碼運算精度和運算效率。雖然MJPEG壓縮比不是很高,但在視頻清晰度要求不高的情況下,它的性價格比卻很高。如小區、企業視頻監控等地方,利用Cortex-M4硬件平臺研發相關產品,既能降低硬件成本又能保證實時性清晰監控圖像要求。
[1]魏忠義,朱 磊.基于DSP的JPEG圖像解碼算法的實現[J].多媒體技術,2004,193(02):66-70.
[2] 楊貴臣,王 雙,全子一.高清MJPEG2000編解碼系統的設計[J].視頻技術應用與工程,2005,281(11):85-87.
[3] 王麗霞,李巴津.JPEG算法的改進[J].電腦開發與應用,2004,30(11):48-48.
[4] 薛永林,劉 珂,李鳳亭.并行處理JPEG算法的優化[J].電子學報,2002.30(02):160-162.
[5] 王 海,劉彥隆.基于JPEG圖像壓縮算法的研究[J].科技情報開發與經濟,2010,20(10):108-200.
[6] Miodrag Potkonjak,Anantha Chandrakasan.Synthesis and selection of dct algorithms using behavioral synthesisbased algorithm space exploration[J].IEEE,1995,121(02):65-68.