摘 要: 闡述H.264標準中的整數反變換運算及反量化" title="反量化">反量化。該硬件原型包含亮度直流系數的反哈達瑪變換和反量化以及亮度系數和色度系數的反變換過程。根據蝶形算法,該硬件原型采用分時復用" title="復用">復用技術和全零信號,節省運算時間。仿真結果表明,該設計能滿足高清數字視頻的實時處理應用。
關鍵詞: H.264;整數變換;反量化;分時復用(TDM)
?
H.264是由ITU-T的VCEG(視頻編碼" title="視頻編碼">視頻編碼專家組)和ISO/IEC的MPEG(運動圖像編碼專家組)共同開發的一個新的數字視頻編碼國際標準,它以提高視頻編碼在壓縮效率和網絡環境下更高的穩定性為應用目標。H.264在各功能模塊的實現細節上引入一些新的技術,例如幀內預測、1/4精度的運動補償、基于4×4塊的整數變換等。這些措施使得H.264算法具有很高的編碼效率,在相同的重建圖像質量下,能夠比H.263節約50%左右的碼率[1,2]。在H.264 Baseline 中,反變換解碼和反量化過程中采用了整數DCT逆變" title="逆變">逆變換,并將尺度調整融合到反量化過程中。由于反變換過程僅通過加法和移位操作完成,用整數運算代替浮點運算,不僅提高變換速度,也解決反變換的失配問題,同時反量化過程用乘法和移位操作代替除法運算,因而適合硬件實現。本文針對H.264Baseline高清視頻解碼芯片中ITIQ模塊的設計進行論述及硬件實現結構。
1 H.264的反量化和反變換
反量化公式如式(1)所示:
其中Wij′為反量化后的系數,將作為反變換的輸入,Zij為反量化的輸入,Qstep為量化步長,PF為縮放因子,系數64用來消除取整誤差。H.264標準不直接說明Qstep或PF,而是根據0≤QP≤5和每個系數位置,定義參數Vij=(Qstep×PF×64),QP(量化參數)每增加6,Qstep增大一倍。公式(1)改為:
Vij為縮放比例因素。QP與Qstep的對應關系、Vij與QP%6以及像素位置關系可查表獲得[3]。4×4塊亮度DC系數在解碼器里,先是一個反哈達瑪變換,然后是反量化。反哈達瑪變換:
反量化:
其中(i,j=0,…,3),V(0,0)對應于Vij位置(0,0)的縮放比例因素,floor( )為取整函數。
反變換:
??? ?
這是H.264中所用到的整數反變換公式,其變換核CMT W′Cm僅用加減法(和右移)即可實現。中間的點乘操作可以合并到前面的反量化過程中去,由于把變換和量化融合在一起,因而有效地減少了壓縮編碼的運算量[4]。
2 硬件設計
由于整數DCT逆變換與亮度直流系數哈達瑪逆變換在算法上有許多共同點,并且兩者在時間上也不會重疊,所以在硬件設計上采用模塊復用。相關聯模塊結構如圖1所示,ENTR模塊(entropy decode)是H.264 decode IP 中的熵解碼模塊。INT模塊包含幀內預測和幀間預測,它把反變換后的殘差值與預測值相加且移位后可得重構的圖像像素值。ENTR模塊把亮度直流系數傳給ITIQ 模塊做哈達瑪反變換和反量化,ITIQ再把反量化后的亮度直流系數傳回ENTR模塊。ENTR模塊把反量化后的亮度(DC系數和AC系數)和色度(DC系數和AC系數)數據存入CB模塊中。CB模塊再把數據傳給ITIQ模塊做反變換,ITIQ模塊把結果又傳給CB模塊,CB模塊再把反變換后的殘差傳給INT模塊。色度DC系數的哈達瑪反變換和反量化及亮度(DC系數和AC系數)和色度(DC系數和AC系數)的反量化在ENTR模塊中完成。
?
2.1 CB模塊的設計
由于反變換分為水平與垂直變換,做完水平變換的數據要先存儲,然后再根據存儲的數據做垂直變換。CB模塊的功能是存儲和控制,總共存儲兩組數據,每組256bit。ENTR模塊把經過反量化后的亮度(DC系數和AC系數)和色度(DC系數和AC系數)的數據存入CB模塊中,CB模塊再把數據傳給ITIQ模塊做反變換,ITIQ模塊做完后把結果又傳給CB模塊,CB模塊再把反變換后的殘差給INT模塊。CB模塊有一計數信號,ENTR模塊每寫入一組數據加1,當計數信號為2時發信號給ENTR模塊不能再寫入數據,INT模塊每讀完一組數據時計數信號減1。CB模塊發信號給ITIQ模塊啟動反變換,當反變換完成時CB模塊發信號給INT模塊允許讀取。在中低碼率編碼過程中,運動補償參差值經過整數變換、量化運算后,常常會出現大量的零系數,尤其低速運動的視頻序列出現的全零塊更多。全零塊不需做反變換,可節省運算時間,由ENTR模塊發全零塊信號ENTR_CB_zero給CB模塊,CB模塊直接把數據傳給INT模塊,而省去反變換運算這一步。這種情況要用信號itiq_do_zero控制:當ITIQ模塊正在做反變換時,ENTR模塊發全零塊信號給CB模塊,全零數據不能馬上傳給INT模塊,要等待前面的數據傳給INT模塊后,才能輪到全零塊數據。因此當CB_ITIQ_enable為1時,將itiq_do_zero置1,當反變換完成后再置0。剛好只存儲兩組數據,可采用3信號分別對應3模塊來控制數據地址的翻轉,起始值都為0。如信號0表示兩模塊連接0地址,信號1表示兩模塊連接1地址。ENTR模塊每寫入一組數據entr_cb_flag加1,entr_cb_flag為0表示數據寫入cb[0],entr_cb_flag為1表示數據寫入cb[1]。CB模塊每完成一次反變換itiq_cb_flag加1,如果itiq_do_zero為1,則在反變換完成后下一時鐘周期" title="時鐘周期">時鐘周期itiq_cb_flag再加1,itiq_cb_flag為0表示數據寫入cb[0],itiq_cb_flag為1表示數據寫入cb[1]。INT模塊每讀取完一組數據int_cb_flag加1,int_cb_flag為0表示從cb[0]中讀取數據,int_cb_flag為1表示從cb[1]中讀取數據。itiq_finish_cnt信號控制INT模塊是否讀取,當它為1或2時發一讀信號給INT模塊。當反變換做完時itiq_finish_cnt加1;當ENTR_CB_
zero為1且itiq_do_zero為0時itiq_finish_cnt加1,否則要等反變換做完后下一周期再加1; INT模塊每讀取完一組數據則減1。
2.2 ITIQ模塊的設計
ITIQ硬件結構如圖2所示。基于Hadamard反變換和反向整數DCT變換有很多相似之處,并且調用本模塊不會同時出現,本模塊進行功能復用,根據啟動信號選通不同的數據進行運算。輸入數據一組為256bit,對應4×4塊排列如表1所示。本模塊根據面積與速度的協調,采用8個加法器(具體設計如表2所示),一次讀取64bit進行運算。總共有8個狀態,前4個狀態是水平變換,后4個狀態是垂直變換。在本模塊中采用的算法是蝶形算法,具體算法如圖3所示。在反變換水平變換時,a2=r2-r0中r2要先右移一位再減r0,a3=r2+r0 中r0要先右移一位再加r2。
?
軟件模型中反量化系數可通過查表得到,因它是相應固定的值,在硬件中可根據輸入當前量化系數直接賦相對應的值。哈達瑪逆變換得到的數據再與相對應的反量化系數相乘。當QP值小于36時,在軟件模型中的加法可簡化為進位則加1(當往右移4位時,如第4位為1則移位后結果再加1,依此類推),其他情況則將相乘后的結果進行相對應的左移。
狀態機圖如圖4所示。狀態說明:Idle為起始狀態,如果無解碼要求(即En=0),則狀態機停留在Idlie狀態,否則狀態機跳轉到S1狀態。En信號為反變換或哈達瑪逆變換啟動信號。
?
S1:讀取data_in[63:0]共64bit數據做蝶形運算,En=1跳轉到S2狀態,否則跳轉到Idlie狀態。r0=data_in [63:48],r1=data_in[47:32],r2=data_in[31:16],r3=data_in[15:0]。
S2:讀取data_in[127:64]共64bit數據做蝶形運算,En=1跳轉到S3狀態,否則跳轉到Idlie狀態。r0=data_in[127:112],r1=data_in[111:96],r2=data_in[95:80],r3=data_in[80:64]。
S3:讀取data_in[191:128]共64bit數據做蝶形運算,En=1跳轉到S4狀態,否則跳轉到Idlie狀態。r0=data_in[191:176],r1=data_in[175:160],r2=data_in[159:144],r3=data_in[143:128]。
S4:讀取data_in[255:192]共64bit數據做蝶形運算,En=1跳轉到S5狀態,否則跳轉到Idlie狀態。r0=data_in[255:240],r1=data_in[239:224],r2=data_in[223:208],r3=data_in[207:192]。
S5:讀取64bit數據做蝶形運算,En=1跳轉到S6狀態,否則跳轉到Idlie狀態。r0=data_in[207:192],r1=data_in[143:128],r2=data_in[79:64],r3=data_in[15:0]。
S6:讀取64bit數據做蝶形運算,En=1跳轉到S7狀態,否則跳轉到Idlie狀態。r0=data_in[223:208],r1=data_in[159:144],r2=data_in[111:96],r3=data_in[31:16]。
S7:讀取64bit數據做蝶形運算,En=1跳轉到S8狀態,否則跳轉到Idlie狀態。r0=data_in[239:224],r1=data_in[175:160],r2=data_in[111:96],r3=data_in[47:32]。
S8:讀取64bit數據做蝶形運算,En=1跳轉到S1狀態,否則跳轉到Idlie狀態。r0=data_in[255:240],r1=data_in[191:176],r2=data_in[127:112],r3=data_in[63:48]。
本設計采用的硬件平臺是Synopsys公司的VCS,整個設計在Unix環境下進行。在PC機上進行整個IP環境仿真,在QCIF格式下,ITIQ模塊完成一個宏塊的運算操作需要694個時鐘周期。在D1格式下,ITIQ模塊完成一個宏塊的運算操作需要570個時鐘周期。能夠滿足高清解碼的要求。在FPGA上仿真,在最高頻率100MHz下解碼比較流暢。目前該芯片正在流片中。
參考文獻
[1] SCHAFER R,WIEGAND T,SCHWARZ H.The emerging?H.264/AVC standard.EBU technical review,2003,(1).
[2] 王嵩,薛全,張穎.H.264視頻編碼新標準及性能分析[J].電視技術,2003,(6).
[3] H.264/MPEG-4 Part 10 White Paper- transform and?quantization.
[4] 畢厚杰.新一代視頻壓縮編碼標準-H.264/AVC[M].北京:人民郵電出版社,2005.