摘 要:H.264整數DCT變換算法有助于減少計算復雜度,提高編碼速度,進一步提高視頻或圖像的壓縮效率。分析H.264整數DCT變換的快速算法及其實現原理,并提出一種用來具體實現一個4×4塊的DCT變換的結構;同時給出用VHDL語言實現4×4塊DCT變換的內部模塊的源代碼和仿真波形。仿真結果表明用該算法可快速實現一個4×4塊的整數DCT變換。提出一種切實可行的用于H.264整數DCT變換的結構, 該結構可完全用硬件電路快速實現;對于用FPGA實現H.264整數DCT變換做了一次實踐性的嘗試,對深入理解H.264整數DCT變換及其算法的具體實現具有一定的實踐意義。
關鍵詞:H.264;宏塊;整數DCT;FPGA;VHDL
中圖分類號:TP391文獻標識碼:B
文章編號:1004-373X(2008)24-158-03
Implementation of Integer DCT in H.264 on FPGA
ZHU Nankun,HUANG Shitan
(Xi′an Micro-electronics Technology Institute,Xi′an,710075,China)
Abstract:The algorithm of integer transform in H.264 is good to reduce the complexities in computations and it is good to improve the speed in encoder,it can greatly improve the compress rate of videos or images from this. This article analyses the fast algorithm and principle of the integer in H.264,and privides an specific architecture which to be used to implement a 4×4 DCT transform;and gives the source codes and simulated waves in 4×4 DCT transform which implemented in VHDL.The result of simulation shows that the algorithm can fast implement a 4×4 DCT transform.The new thoughts of this article lie that it privides a practical architecture used in integer DCT transform in H.264.It can be implemented quickly in circuit through hardware, and it is a practical taste in the implemention of integer DCT transform in H.264 on FPGA.It is good to understand the integer DCT transform in H.264 deeply,it also has certain practical meanings in the specific implemention in integer DCT transform in H.264.
Keywords:H.264;Macro Block;integer DCT;FPGA;VHDL
1 引 言
新一代視頻壓縮編碼標準在對圖像進行壓縮時與以往的視頻編碼標準相同,同樣采用基于塊的變換編碼。H.264標準中使用4×4的整數DCT變換作為殘差宏塊的基本變換,這種變換的對象是經過運動補償預測或者幀內預測后的包含殘差數據的4×4塊。這類變換是基于DCT變換,但又不同于DCT。由于DCT變換是實數,量化時需對系數進行四舍五入,從而影響了運算的精度。
同時,傳統的DCT存在不匹配問題,產生參考幀的偏移,直接影響到重建圖像的質量。H.264對圖像或預測殘差采用了4×4整數離散余弦變換技術,避免以往標準中使用的通用8×8離散余弦變換、逆變換經常出現的失配問題。同時采用整數DCT變換技術,可有效地減少
計算量,同時不損失圖像的準確度。
2 H.264整數DCT變換
一維N點離散余弦變換(DCT)可以表示為:
yk=Ck∑N-1n=0xncos(2n+1)kπ2N(1)
其中,xn是輸入時域序列中的第n項;yk是輸出頻域序列中的第k項;系數Ck=1/N,k=0;Ck=2/N,k=1,2,…,N-1。
二維N×N圖像塊的DCT可以理解為先對圖像塊的每行進行一維DCT,然后對經行變換的塊每列再應用一維DCT。可以表示為:
Ymn=CmCn∑N-1i=0∑N-1j=0Xijcos(2j+1)nπ2Ncos(2i+1)mπ2N(2)
其中,Xij是圖像塊X中第i行第j列圖像或其殘差值;Ymn是變換結果矩陣Y相應頻率點上的DCT系數。可以用矩陣表示:
Y=AXAT(3)
其中,N×N變換矩陣A中的系數:
Aij=Cicos(2j+1)iπ2N(4)
H.264對4×4的圖像塊(亮度塊或Cr,Cb色度塊)進行操作,則相應的4×4 DCT變換矩陣A為:
A=12cos(0)12cos(0)12cos(0)12cos(0)
1/2cos(π/8)1/2cos(3π/8)1/2cos(5π/8)1/2cos(7π/8)
1/2cos(2π/8)1/2cos(6π/8)1/2cos(10π/8)1/2cos(14π/8)
1/2cos(3π/8)1/2cos(9π/8)1/2cos(15π/8)1/2cos(21π/8)〗
=1/21/21/21/2
1/2cos(π/8)1/2cos(3π/8)-1/2cos(3π/8)-1/2cos(π/8)
1/2-1/2-1/21/2
1/2cos(3π/8)-1/2cos(π/8)1/2cos(π/8)-1/2cos(π/8)〗(5)
設a=1/2,b=1/2cos(π/8)及c=1/2·cos(3π/8),則:
A=aaaa
bc-cb
a-a-aa
c-bb-c(6)
A中的a,b和c是實數,而圖像塊X中的元素是整數。對實數的DCT,由于在解碼端的浮點運算精度問題,會造成解碼后的數據的失配,進而引起漂移。H.264較其他圖像編碼使用了更多的預測過程,甚至內部編碼模式也依賴于空間預測。因此,H.264對預測漂移是十分敏感的。為此,H.264對4×4 DCT中的A進行了改造,采用整數DCT技術,可有效地減少計算量,同時不損失圖象的準確度。式(3)可以等效為:
Y=(CXCT)E=
1111
1d-d-1
1-1-11
d-11-d〗X111d
1d-1-1
1-d-11
1-11-d〗
a2aba2ab
abb2abb2
a2aba2ab
abb2abb2〗(7)
其中,d=c/b,符號“”表示(CXCT)結果中的每個元素乘以矩陣E中對應位置的系數值的運算。為簡化運算,取d=0.5。同時為了保持變換的正交性,對b進行修正,取b=2/5。對矩陣C中的第2行和第4行,以及矩陣CT中的第2列和第4列元素乘以2,相應地改造矩陣E為Ef,以保持式(7)成立,得到:
Y = (Cf XCTf )Ef =
1111
21-1-2
1-1-11
1-22-1〗X1211
11-1-2
1-1-12
1-21-1〗
a2ab/2a2ab/2
ab/2b2/4ab/2b2/4
a2ab/2a2ab/2
ab/2b2/4ab/2b2/4〗(8)
其中,運算“”對每個矩陣元素只進行1次乘法,同時它將被歸納到量化運算中。這樣,(Cf XCTf )中只剩下整數的加法、減法和移位(乘以2)運算。H.264將DCT中“Ef”運算的乘法融合到后面的量化過程中,實際的DCT輸出為:W=Cf XCTf。將該矩陣的乘法改造成2次一維整數DCT變換,并且每次的一維整數DCT可以采用疊形快速算法,以節省計算時間,如圖1所示。
圖1 DCT的疊形快速算法
3 H.264整數DCT變換的FPGA實現
圖2為用FPGA實現H.264整數DCT變換的框圖。以上的每個行變換單元僅處理1行數據,每個列變換單元僅處理1列數據;由于在從行變換到列變換中間經過1個矩陣轉置過程所以在給列變換單元輸入數據時,輸入的數據需要重新組合后再送給每個列變換單元。
圖2 用FPGA實現H.264整數DCT變換的框圖
數據輸入為經過運動補償預測或者幀內預測后的包含殘差數據的4×4塊。共16個數據,按順序送給每個行變換單元,每個數據用8位二進制表示,即表示輸入塊的相應像素點,每個像素點范圍為0~255;由于在進行行變換以后的輸入行單元的數據進行了8次加法(包括減法)和2次移位運算,所以經過數據組合后輸入到列變換單元的數據范圍發生了改變;所以為防止該輸入數據溢出將它定義為16位,經列變換后即為一個殘差數據的4×4塊經過整數DCT變換的結果。其輸出數據不會超過16位,故用16位定義不會溢出。因為行列變換各有4個變換單元所以處理1個殘差數據的4×4塊后需至少等待2個時鐘周期,之后讀取下一個4×4塊。行變換單元VHDL描述如下:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_SIGNED.all;
entity dct is
PORT(data0,data1,data2,data3:IN
STD_LOGIC_VECTOR(7 DOWNTO 0);
out0,out1,out2,out3:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
end dct;
architecture comp of dct is
SIGNAL temp0,temp1:STD_LOGIC_
VECTOR(15 DOWNTO 0);
SIGNAL temp2,temp3:STD_LOGIC_
VECTOR(14 DOWNTO 0);
SIGNAL temp4,temp5,temp6:STD_LOGIC_
VECTOR(8 DOWNTO 0);
BEGIN
PROCESS(temp0,temp1,temp2,temp3,data0,data1,data2,data3,temp5,temp6,temp4)
BEGIN
temp4<=(data0(7)data0)+(data3(7)
data3)-(data1(7)data1)-(data2(7)data2);
out2<=(temp4(7)temp4(7)temp4(7)
temp4(7)temp4(7)temp4(7)
temp4(7)temp4);
temp5<=(data1(7)data1)-(data2(7)
data2);
temp0<=(temp5(7)temp5(7)temp5(7)temp5(7)temp5(7)temp5(7)temp5(7)temp5);
temp6<=(data0(7)data0)-(data3(7)
data3);
temp1<=(temp6(7)temp6(7)temp6(7)temp6(7)temp6(7)temp6(7)temp6(7)temp6);
temp2<=temp0(14 DOWNTO 0);
temp3<=temp1(14 DOWNTO 0);
out1<=temp3'0'+temp0;
out3<=temp1-(temp2'0');
END PROCESS;
END comp;
仿真波形如圖3所示,該仿真時輸入數據為:1,-1,1,1。輸出為:2,-2,2,4;經驗證正確。列變換單元VHDL描述可參考行變換單元代碼。一個4×4塊的DCT變換的代碼可以直接調用行、列變換單元模塊來實現。該設計可快速實現H.264整數DCT變換。
圖3 仿真波形圖
4 結 語
為了實現H.264視頻壓縮的高壓縮率,必須進行大量的計算,而整數DCT變換計算量大,用FPGA實現可大大加快其處理速度。以上實現可用并行計算能加速整數DCT變換的處理效率。
參考文獻
[1]Wiegand T,Sullivan G J,Bjontegaard G,et al.Overview of H.264/AVC Video Coding Standard.IEEE Trans.Circuits Syst.Video Technol.,2003(13):560-576.
[2]Draft ITU-T Recommendation and Final Draft International Standard of Joint Video Specification(ITU-T Rec.H.264/ISO/IEC 14 496-10 AVC.in Joint Video Team(JVT) of ISO/IEC MPEG and ITU-T VCEG,JVTG050,2003.
[3]Schafer Ralf,Wiegand Thomas,Schwarz Heiko.The Emerging H.264/AVC Standard EBU Technical Review.2003.
[4]Mathias Wien.Variable Block-Size Transforms for H.264/AVC.IEEE Trans.Circuit Syst.Video Technol.,2003,13:604-613.
[5]畢厚杰.多媒體信息的傳輸與處理.北京:人民郵電出版社,1999.
[6]朱秀昌.數字圖像處理與圖像通信.北京:北京郵電大學出版社,2002.
[7]陳傳波,金先級.數字圖像處理.北京:機械工業出版社,2004.
[8]畢厚杰.新一代視頻壓縮編碼標準H.264/AVC.北京:人民郵電出版社,2005.
[9]侯伯亨,顧新.VHDL硬件描述語言與數字邏輯電路設計.西安:西安電子科技大學出版社,1997.
[10]趙俊超.集成電路設計VHDL教程.北京:北京希望電子出版社,2002.
[11]李玉山.電子系統集成設計技術.北京:電子工業出版社,2002.
作者簡介 朱南坤 男,1979年出生,安徽合肥人,碩士。研究方向為數字圖像處理及視頻壓縮。
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文