《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 業(yè)界動(dòng)態(tài) > H.264Baseline中ITIQ模塊的硬件實(shí)現(xiàn)

H.264Baseline中ITIQ模塊的硬件實(shí)現(xiàn)

2008-12-05
作者:黃志剛,雷 凱,李 揮

  摘 要: 闡述H.264標(biāo)準(zhǔn)中的整數(shù)反變換運(yùn)算及反量化" title="反量化">反量化。該硬件原型包含亮度直流系數(shù)的反哈達(dá)瑪變換和反量化以及亮度系數(shù)和色度系數(shù)的反變換過(guò)程。根據(jù)蝶形算法,該硬件原型采用分時(shí)復(fù)用" title="復(fù)用">復(fù)用技術(shù)和全零信號(hào),節(jié)省運(yùn)算時(shí)間。仿真結(jié)果表明,該設(shè)計(jì)能滿足高清數(shù)字視頻的實(shí)時(shí)處理應(yīng)用。
  關(guān)鍵詞: H.264;整數(shù)變換;反量化;分時(shí)復(fù)用(TDM)

?

  H.264是由ITU-T的VCEG(視頻編碼" title="視頻編碼">視頻編碼專(zhuān)家組)和ISO/IEC的MPEG(運(yùn)動(dòng)圖像編碼專(zhuān)家組)共同開(kāi)發(fā)的一個(gè)新的數(shù)字視頻編碼國(guó)際標(biāo)準(zhǔn),它以提高視頻編碼在壓縮效率和網(wǎng)絡(luò)環(huán)境下更高的穩(wěn)定性為應(yīng)用目標(biāo)。H.264在各功能模塊的實(shí)現(xiàn)細(xì)節(jié)上引入一些新的技術(shù),例如幀內(nèi)預(yù)測(cè)、1/4精度的運(yùn)動(dòng)補(bǔ)償、基于4×4塊的整數(shù)變換等。這些措施使得H.264算法具有很高的編碼效率,在相同的重建圖像質(zhì)量下,能夠比H.263節(jié)約50%左右的碼率[1,2]。在H.264 Baseline 中,反變換解碼和反量化過(guò)程中采用了整數(shù)DCT逆變" title="逆變">逆變換,并將尺度調(diào)整融合到反量化過(guò)程中。由于反變換過(guò)程僅通過(guò)加法和移位操作完成,用整數(shù)運(yùn)算代替浮點(diǎn)運(yùn)算,不僅提高變換速度,也解決反變換的失配問(wèn)題,同時(shí)反量化過(guò)程用乘法和移位操作代替除法運(yùn)算,因而適合硬件實(shí)現(xiàn)。本文針對(duì)H.264Baseline高清視頻解碼芯片中ITIQ模塊的設(shè)計(jì)進(jìn)行論述及硬件實(shí)現(xiàn)結(jié)構(gòu)。
1 H.264的反量化和反變換
  反量化公式如式(1)所示:
  
  其中Wij′為反量化后的系數(shù),將作為反變換的輸入,Zij為反量化的輸入,Qstep為量化步長(zhǎng),PF為縮放因子,系數(shù)64用來(lái)消除取整誤差。H.264標(biāo)準(zhǔn)不直接說(shuō)明Qstep或PF,而是根據(jù)0≤QP≤5和每個(gè)系數(shù)位置,定義參數(shù)Vij=(Qstep×PF×64),QP(量化參數(shù))每增加6,Qstep增大一倍。公式(1)改為:
  
  Vij為縮放比例因素。QP與Qstep的對(duì)應(yīng)關(guān)系、Vij與QP%6以及像素位置關(guān)系可查表獲得[3]。4×4塊亮度DC系數(shù)在解碼器里,先是一個(gè)反哈達(dá)瑪變換,然后是反量化。反哈達(dá)瑪變換:
  

  反量化:

  
  其中(i,j=0,…,3),V(0,0)對(duì)應(yīng)于Vij位置(0,0)的縮放比例因素,floor( )為取整函數(shù)。
  反變換:
??? ? 

  這是H.264中所用到的整數(shù)反變換公式,其變換核CMT W′Cm僅用加減法(和右移)即可實(shí)現(xiàn)。中間的點(diǎn)乘操作可以合并到前面的反量化過(guò)程中去,由于把變換和量化融合在一起,因而有效地減少了壓縮編碼的運(yùn)算量[4]
2 硬件設(shè)計(jì)
  由于整數(shù)DCT逆變換與亮度直流系數(shù)哈達(dá)瑪逆變換在算法上有許多共同點(diǎn),并且兩者在時(shí)間上也不會(huì)重疊,所以在硬件設(shè)計(jì)上采用模塊復(fù)用。相關(guān)聯(lián)模塊結(jié)構(gòu)如圖1所示,ENTR模塊(entropy decode)是H.264 decode IP 中的熵解碼模塊。INT模塊包含幀內(nèi)預(yù)測(cè)和幀間預(yù)測(cè),它把反變換后的殘差值與預(yù)測(cè)值相加且移位后可得重構(gòu)的圖像像素值。ENTR模塊把亮度直流系數(shù)傳給ITIQ 模塊做哈達(dá)瑪反變換和反量化,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ù)的哈達(dá)瑪反變換和反量化及亮度(DC系數(shù)和AC系數(shù))和色度(DC系數(shù)和AC系數(shù))的反量化在ENTR模塊中完成。

?


2.1 CB模塊的設(shè)計(jì)
  由于反變換分為水平與垂直變換,做完水平變換的數(shù)據(jù)要先存儲(chǔ),然后再根據(jù)存儲(chǔ)的數(shù)據(jù)做垂直變換。CB模塊的功能是存儲(chǔ)和控制,總共存儲(chǔ)兩組數(shù)據(jù),每組256bit。ENTR模塊把經(jīng)過(guò)反量化后的亮度(DC系數(shù)和AC系數(shù))和色度(DC系數(shù)和AC系數(shù))的數(shù)據(jù)存入CB模塊中,CB模塊再把數(shù)據(jù)傳給ITIQ模塊做反變換,ITIQ模塊做完后把結(jié)果又傳給CB模塊,CB模塊再把反變換后的殘差給INT模塊。CB模塊有一計(jì)數(shù)信號(hào),ENTR模塊每寫(xiě)入一組數(shù)據(jù)加1,當(dāng)計(jì)數(shù)信號(hào)為2時(shí)發(fā)信號(hào)給ENTR模塊不能再寫(xiě)入數(shù)據(jù),INT模塊每讀完一組數(shù)據(jù)時(shí)計(jì)數(shù)信號(hào)減1。CB模塊發(fā)信號(hào)給ITIQ模塊啟動(dòng)反變換,當(dāng)反變換完成時(shí)CB模塊發(fā)信號(hào)給INT模塊允許讀取。在中低碼率編碼過(guò)程中,運(yùn)動(dòng)補(bǔ)償參差值經(jīng)過(guò)整數(shù)變換、量化運(yùn)算后,常常會(huì)出現(xiàn)大量的零系數(shù),尤其低速運(yùn)動(dòng)的視頻序列出現(xiàn)的全零塊更多。全零塊不需做反變換,可節(jié)省運(yùn)算時(shí)間,由ENTR模塊發(fā)全零塊信號(hào)ENTR_CB_zero給CB模塊,CB模塊直接把數(shù)據(jù)傳給INT模塊,而省去反變換運(yùn)算這一步。這種情況要用信號(hào)itiq_do_zero控制:當(dāng)ITIQ模塊正在做反變換時(shí),ENTR模塊發(fā)全零塊信號(hào)給CB模塊,全零數(shù)據(jù)不能馬上傳給INT模塊,要等待前面的數(shù)據(jù)傳給INT模塊后,才能輪到全零塊數(shù)據(jù)。因此當(dāng)CB_ITIQ_enable為1時(shí),將itiq_do_zero置1,當(dāng)反變換完成后再置0。剛好只存儲(chǔ)兩組數(shù)據(jù),可采用3信號(hào)分別對(duì)應(yīng)3模塊來(lái)控制數(shù)據(jù)地址的翻轉(zhuǎn),起始值都為0。如信號(hào)0表示兩模塊連接0地址,信號(hào)1表示兩模塊連接1地址。ENTR模塊每寫(xiě)入一組數(shù)據(jù)entr_cb_flag加1,entr_cb_flag為0表示數(shù)據(jù)寫(xiě)入cb[0],entr_cb_flag為1表示數(shù)據(jù)寫(xiě)入cb[1]。CB模塊每完成一次反變換itiq_cb_flag加1,如果itiq_do_zero為1,則在反變換完成后下一時(shí)鐘周期" title="時(shí)鐘周期">時(shí)鐘周期itiq_cb_flag再加1,itiq_cb_flag為0表示數(shù)據(jù)寫(xiě)入cb[0],itiq_cb_flag為1表示數(shù)據(jù)寫(xiě)入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信號(hào)控制INT模塊是否讀取,當(dāng)它為1或2時(shí)發(fā)一讀信號(hào)給INT模塊。當(dāng)反變換做完時(shí)itiq_finish_cnt加1;當(dāng)ENTR_CB_
zero為1且itiq_do_zero為0時(shí)itiq_finish_cnt加1,否則要等反變換做完后下一周期再加1; INT模塊每讀取完一組數(shù)據(jù)則減1。
2.2 ITIQ模塊的設(shè)計(jì)
  ITIQ硬件結(jié)構(gòu)如圖2所示?;贖adamard反變換和反向整數(shù)DCT變換有很多相似之處,并且調(diào)用本模塊不會(huì)同時(shí)出現(xiàn),本模塊進(jìn)行功能復(fù)用,根據(jù)啟動(dòng)信號(hào)選通不同的數(shù)據(jù)進(jìn)行運(yùn)算。輸入數(shù)據(jù)一組為256bit,對(duì)應(yīng)4×4塊排列如表1所示。本模塊根據(jù)面積與速度的協(xié)調(diào),采用8個(gè)加法器(具體設(shè)計(jì)如表2所示),一次讀取64bit進(jìn)行運(yùn)算??偣灿?個(gè)狀態(tài),前4個(gè)狀態(tài)是水平變換,后4個(gè)狀態(tài)是垂直變換。在本模塊中采用的算法是蝶形算法,具體算法如圖3所示。在反變換水平變換時(shí),a2=r2-r0中r2要先右移一位再減r0,a3=r2+r0 中r0要先右移一位再加r2。

?


  軟件模型中反量化系數(shù)可通過(guò)查表得到,因它是相應(yīng)固定的值,在硬件中可根據(jù)輸入當(dāng)前量化系數(shù)直接賦相對(duì)應(yīng)的值。哈達(dá)瑪逆變換得到的數(shù)據(jù)再與相對(duì)應(yīng)的反量化系數(shù)相乘。當(dāng)QP值小于36時(shí),在軟件模型中的加法可簡(jiǎn)化為進(jìn)位則加1(當(dāng)往右移4位時(shí),如第4位為1則移位后結(jié)果再加1,依此類(lèi)推),其他情況則將相乘后的結(jié)果進(jìn)行相對(duì)應(yīng)的左移。
  狀態(tài)機(jī)圖如圖4所示。狀態(tài)說(shuō)明:Idle為起始狀態(tài),如果無(wú)解碼要求(即En=0),則狀態(tài)機(jī)停留在Idlie狀態(tài),否則狀態(tài)機(jī)跳轉(zhuǎn)到S1狀態(tài)。En信號(hào)為反變換或哈達(dá)瑪逆變換啟動(dòng)信號(hào)。

?


  S1:讀取data_in[63:0]共64bit數(shù)據(jù)做蝶形運(yùn)算,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ù)做蝶形運(yùn)算,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ù)做蝶形運(yùn)算,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ù)做蝶形運(yùn)算,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ù)做蝶形運(yùn)算,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ù)做蝶形運(yùn)算,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ù)做蝶形運(yùn)算,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ù)做蝶形運(yùn)算,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è)計(jì)采用的硬件平臺(tái)是Synopsys公司的VCS,整個(gè)設(shè)計(jì)在Unix環(huán)境下進(jìn)行。在PC機(jī)上進(jìn)行整個(gè)IP環(huán)境仿真,在QCIF格式下,ITIQ模塊完成一個(gè)宏塊的運(yùn)算操作需要694個(gè)時(shí)鐘周期。在D1格式下,ITIQ模塊完成一個(gè)宏塊的運(yùn)算操作需要570個(gè)時(shí)鐘周期。能夠滿足高清解碼的要求。在FPGA上仿真,在最高頻率100MHz下解碼比較流暢。目前該芯片正在流片中。


參考文獻(xiàn)
[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.

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。