多核處理器構架的高速JPEG解碼算法
發布時間:2008/5/26 0:00:00 訪問次數:907
    
    
    作者:電子科技大學 章承科
    
    摘 要:實現基于多核處理器構架的jpeg解碼算法;通過將jpeg算法并行化,在多個處理器核上并行處理,并針對多核處理囂構架進行內存讀取等方面的優化,可極大地提高jpeg解碼算法的解碼速度。實測表明,在4核集成的多核處理器上,jpeg圖像的平均解碼周期為單核處理器上的28%左右。
    
    jpeg(joint photographlc experts group)是一個適用范圍很廣的靜態圖像數據壓縮標準,目前廣泛應用于照相機、打印機等方面的圖像處理。在這些應用中,設計出一個高速高效的jpeg***已經成為一個重要的研究方向。隨著對嵌入式系統實時性、高性能和可擴展性要求的提高,多核(multi—core)嵌入式處理器的應用場合日益增多。
    
    1 jpeg解碼算法原理
    
    jpeg壓縮是一種有損壓縮。它利用人的視角系統特性,使用量化和無損壓縮編碼相結合的方式去掉視角的冗余信息和數據本身的冗余信息來達到壓縮的目的。jpeg算法可分為基本jpeg(baseline system)和擴展jpeg(extended system)。其中baseline system應用尤其廣泛。本文主要討論baseline system的解碼。jpeg解碼算法框圖如圖1所示。
    
    
    (1)顏色空間變換
    
    jpeg算法本身與顏色空間無關,因此“rgb到yuv變換”和“yuv到rgb變換”不包含在jpeg算法中。但由于作為輸出的位圖數據一般要求rgb的表示,所以將顏色空間變換也表示在算法框圖中。
    
    (2)jpeg的編解碼單元
    
    在jpeg中,對于圖像的編解碼是分塊進行的。整個圖像被劃分為若干個8×8的數據塊,稱為最小編碼單元(mcu),每一個塊對應于原圖像的一個8×8的像素陣列; 各行的編解碼順序是從上到下,行內的編解碼順序是從左到右。
    
    值得注意的是,由于一幅圖像的高和寬不一定是mcu尺寸的整數倍,因此需要對圖像的最右邊一列或其最下邊一行進行填充,擴展其高或寬,使得可以將整個圖像劃分為整數個mcu;而在解碼輸出時,這些復制的行列是要被拋棄的。
    
    (3)熵***
    
    在jpeg的熵編碼時,首先利用空間相關性對各塊的直流值采用差分編碼,即對相鄰塊之間的直流差值編碼,以達到壓縮碼長的目的。然后對于交流部分以zigzag方式掃描塊中的元素,對塊內元素采用先游程編碼后哈夫曼編碼的混合編碼方式,得到一維二進制塊碼流。熵編碼過程是由直流部分的差分編碼和交流部分的zigzag掃描、游程編碼、哈夫曼編碼組成。而相應的熵解碼過程是編碼的逆過程,在解碼端接收到的是由變長碼(vlc)和變長整數(vli)組成的數據流。為了從此數據流中恢復編碼前的dct系數,必須根據哈夫曼編碼的原理及其各級碼表生成的細節,生成哈夫曼解碼表,再根據解碼算法來恢復dct的直流和交流系數。
    
    (4)反量化
    
    在jpeg解碼端要利用發送過來的量化表對量化值進行譯碼。jpeg文件里一般含有兩個量化表:一個亮度分量的量化表,一個色度分量的量化表。反量化就是對熵解碼出來的系數矩陣乘上相應的量化矩陣:
    
    
    
    其中,c(u,v)代表熵解碼輸出,q(u,v)代表相應的量化矩陣。
    
    (5)idct。變換
    
    jpeg解碼算法能否滿足實時應用,關鍵在于8×8的二維idct的計算速度。在編碼階段,正向離散余弦變換(fdct)把空間域表示的圖變換成頻率域表示的圖;相應地在解碼階段,逆向離散余弦變換(idct)將頻率域表示的圖變換為空間域表示的圖。
    
    在idct的實現上,目前有多種算法。傳統的方法是行-列法,即先對每行(列)進行一維idct計算,再對每列(行)進行一維idct計算。還有多項式變換法和三角函數公式法,這兩種方法的加法次數與行-列法相當,乘法次數僅為
    
    
    作者:電子科技大學 章承科
    
    摘 要:實現基于多核處理器構架的jpeg解碼算法;通過將jpeg算法并行化,在多個處理器核上并行處理,并針對多核處理囂構架進行內存讀取等方面的優化,可極大地提高jpeg解碼算法的解碼速度。實測表明,在4核集成的多核處理器上,jpeg圖像的平均解碼周期為單核處理器上的28%左右。
    
    jpeg(joint photographlc experts group)是一個適用范圍很廣的靜態圖像數據壓縮標準,目前廣泛應用于照相機、打印機等方面的圖像處理。在這些應用中,設計出一個高速高效的jpeg***已經成為一個重要的研究方向。隨著對嵌入式系統實時性、高性能和可擴展性要求的提高,多核(multi—core)嵌入式處理器的應用場合日益增多。
    
    1 jpeg解碼算法原理
    
    jpeg壓縮是一種有損壓縮。它利用人的視角系統特性,使用量化和無損壓縮編碼相結合的方式去掉視角的冗余信息和數據本身的冗余信息來達到壓縮的目的。jpeg算法可分為基本jpeg(baseline system)和擴展jpeg(extended system)。其中baseline system應用尤其廣泛。本文主要討論baseline system的解碼。jpeg解碼算法框圖如圖1所示。
    
    
    (1)顏色空間變換
    
    jpeg算法本身與顏色空間無關,因此“rgb到yuv變換”和“yuv到rgb變換”不包含在jpeg算法中。但由于作為輸出的位圖數據一般要求rgb的表示,所以將顏色空間變換也表示在算法框圖中。
    
    (2)jpeg的編解碼單元
    
    在jpeg中,對于圖像的編解碼是分塊進行的。整個圖像被劃分為若干個8×8的數據塊,稱為最小編碼單元(mcu),每一個塊對應于原圖像的一個8×8的像素陣列; 各行的編解碼順序是從上到下,行內的編解碼順序是從左到右。
    
    值得注意的是,由于一幅圖像的高和寬不一定是mcu尺寸的整數倍,因此需要對圖像的最右邊一列或其最下邊一行進行填充,擴展其高或寬,使得可以將整個圖像劃分為整數個mcu;而在解碼輸出時,這些復制的行列是要被拋棄的。
    
    (3)熵***
    
    在jpeg的熵編碼時,首先利用空間相關性對各塊的直流值采用差分編碼,即對相鄰塊之間的直流差值編碼,以達到壓縮碼長的目的。然后對于交流部分以zigzag方式掃描塊中的元素,對塊內元素采用先游程編碼后哈夫曼編碼的混合編碼方式,得到一維二進制塊碼流。熵編碼過程是由直流部分的差分編碼和交流部分的zigzag掃描、游程編碼、哈夫曼編碼組成。而相應的熵解碼過程是編碼的逆過程,在解碼端接收到的是由變長碼(vlc)和變長整數(vli)組成的數據流。為了從此數據流中恢復編碼前的dct系數,必須根據哈夫曼編碼的原理及其各級碼表生成的細節,生成哈夫曼解碼表,再根據解碼算法來恢復dct的直流和交流系數。
    
    (4)反量化
    
    在jpeg解碼端要利用發送過來的量化表對量化值進行譯碼。jpeg文件里一般含有兩個量化表:一個亮度分量的量化表,一個色度分量的量化表。反量化就是對熵解碼出來的系數矩陣乘上相應的量化矩陣:
    
    
    
    其中,c(u,v)代表熵解碼輸出,q(u,v)代表相應的量化矩陣。
    
    (5)idct。變換
    
    jpeg解碼算法能否滿足實時應用,關鍵在于8×8的二維idct的計算速度。在編碼階段,正向離散余弦變換(fdct)把空間域表示的圖變換成頻率域表示的圖;相應地在解碼階段,逆向離散余弦變換(idct)將頻率域表示的圖變換為空間域表示的圖。
    
    在idct的實現上,目前有多種算法。傳統的方法是行-列法,即先對每行(列)進行一維idct計算,再對每列(行)進行一維idct計算。還有多項式變換法和三角函數公式法,這兩種方法的加法次數與行-列法相當,乘法次數僅為