1 引言
AVS標準Ⅲ采用的8x8整數變換在獲得較H.264更高的壓縮率和主觀圖像質量的同時,增加了算法的實現復雜性和時間開銷。本文重點研究AVS編解碼器的整數變換模塊,針對不同的算法實現模式,在原有Visual C++6.0整數變換模塊基礎上,分別應用MMX,SSE2和加強了乘法操作的SSE2內聯匯編指令技術,優化整數變換的關鍵算法,實驗結果表明,性能最優的SSE優化算法將單次整數變換的平均時延減少到0.5。ms以內,其編碼速度比Visual C++6.0整數變換模塊提高了6.3倍,實現了高速率的AVS整數變換,具有較大的實用價值。
2 AVS整數變換及蝶形算法
由于AVS正變換、反變換的基本原理近似,本文僅以正變換的分析與優化為例來詳細說明。AVS對殘差矩陣X的二維整數正變換定義為
式中:T8為變換矩陣,如圖1所示。AVS整數變換的變換系數存在對稱性,僅用加法和移位就可實現,消除了逆變換的不匹配,容易使用基8蝶形算法快速實現。圖2所示為水平變換XT8的一維8點快速蝶形算法。顯然,采用兩個近似的C語言代碼段就可實現由X到H的變換過程。依此設計的Visual C++6.O整數變換模塊的算法清晰簡單,容易更改數據長度,代碼冗余少,但由于C程序不針對硬件編程,其較低的編解碼速度不能滿足HDTV實時性要求。
![]() ![]() |
3 整數變換的優化設計
3.1 AVS整數變換的算法模式
利用矩陣乘法的結合律,公式(1)可以改寫為

從而AVS整數變換的算法模式可分為4類:
1)水平變換一垂直變換:先水平變換H′=XT8再垂直變換
2)水平變換一轉置一水平變換一轉置:計算次序為
3)垂直變換一水平變換:計算次序為
4)垂直變換一轉置一垂直變換一轉置:計算次序為
無論采用上述哪種算法模式,為獲得高質量主觀圖像效果并避免數據溢出,第一次變換前殘差塊X的每個元素均要由8位整型數據擴展為16位,第二次變換結果H的每個元素均要擴展為32位。為兼顧較高的圖像壓縮效率,最終輸出結果需緊縮為16位的整型數據。
整數變換是典型的以計算為主的編碼過程[2-3],為改進數字視頻系統的實時性,需在Visual C++6.0基礎上使用內聯匯編,采用:Intel單指令多數據并行加速技術(SIMD)作面向硬件的程序流程和代碼級優化[4]。
3.2基于MMX的優化
根據上面的分析,垂直變換比水平變換的匯編實現復雜很多,且轉置過程中要并行處理多列數據,此時MMx指令集使用的64位寄存器遇到每次只能并行處理4個16位元素和2個32位元素的性能瓶頸,適合選擇"水平變換一垂直變換"的算法模式:
1)水平變換H′=XT8:各矩陣元素均為16位,每次循環分兩步處理殘差矩陣X的一行元素,組合運算后得到矩陣H′相應行的元素,8次循環后計算得到矩陣H′。
2)垂直變換:每次取矩陣H′的兩列向量的前兩個元素,擴展為32位數據后作組合運算,再將結果緊縮為16位數據;此過程分4次循環計算得到矩陣H。
圖3為基于MMX的整數變換匯編優化的算法流程。程序中多次使用混排指令pshufw,節省了大量movq和punpckhdq指令的時間開銷。
3.3基于SSE2的優化
SSE2是基于128位寄存器的指令集,并行處理能力強大,水平變換和矩陣轉置比基于MMX的優化更易實現,采用"水平變換一轉置一水平變換一轉置"模式能僅以兩次轉置過程的延時為代價減少垂直變換的代碼和時間開銷。具體實現步驟:
1)第一次水平變換H′=XT8:各矩陣元素占一個字,每次變換一個行向量;
2)第一次矩陣轉置得到H′;
3)第二次水平變換J=H′TT8:矩陣各元素占一個雙字,每次取矩陣H′各列的前4個元素并擴展為32位數據,作一系列組合運算即每次對4個行向量水平變換,變換后結果緊縮為16位數據,只需2次循環就能變換完H′T的全部元素得到矩陣J;
4)第二次矩陣轉置:采用與第一次矩陣轉置相同的代碼段得到H=JT。
根據圖4所示的算法流程,編寫的優化程序可使用大量相同的代碼段實現第一次水平變換,而第二次水平變換僅用2次循環實現,2次轉置由相同的混排程序實現,可見整個優化程序減少了循環調用和運算復雜度。
![]() |
3.4側重使用SSE2乘法指令的優化
研究表明,垂直變換是匯編代碼開銷最高、時間消耗最大的環節。根據增強乘法功能SSE2指令集能在多媒體處理中大量減少乘加運算的特點,圖2和基于MMx的整數變換匯編程序中大量不可替換的乘加步驟可由側重使用SSE2乘法指令進行優化。
假定矩陣
![]() |
直接計算垂直變換 得到
如果利用寄存器特性,公式(4)對日的行向量計算可由圖5所示快速算法求出。圖中每個方框代表一個128位的寄存器空間,每個寄存器存儲8個16位數據,左右兩邊每對寄存器相同位置的數據對應相乘后結果相加,即得到所求矩陣H的行向量。這一算法大大減少了求和次數,而且乘積與求和可以循環運算,提高了寄存器的利用率。
![]() |
筆者分別使用MMx,SSE2并側重使用SSE2乘法指令內聯匯編,按照上文提出的優化算法在P4,1.8 GHz。512 Mbyte內存環境下進行了實驗仿真,結果如表1所示。
![]() |
5 小結
AVS整數變換的延時對數字電視系統的實時性有著重要的影響。筆者針對AVS整數變換的不同實現模式進行了研究,結合MMX,SSE2和側重使用乘法的SSE2等指令集的特性,在Visual C++6.0實現整數變換模塊的基礎上使用內聯匯編,對整數變換模塊進行了優化。實驗結果表明,基于SSE2的整數變換優化算法的性能最優,單次變換的平均時延減至0.5 ms以內,實現了高速率的AVS整數變換,適合高端硬件實現并獲得較高的性價比;基于MMX的優化算法適合低端硬件實現獲得較高的性價比,而側重使用SSE2乘法指令的優化算法也具有進一步研究的價值。