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