基于FPGA的H.264 DCT算法的硬件實(shí)現(xiàn)
摘要:二維離散余弦(DCT)在H.264視頻編碼中承擔(dān)者信號從時(shí)域到頻域變換的作用。在現(xiàn)場可編程邏輯門陣列(FPGA)上設(shè)計(jì)了高效的采用流水線結(jié)構(gòu)的H.264 DCT硬件電路。首先,把二維4×4 DCT變換轉(zhuǎn)換成二次一維DCT變換;其次,DCT變換之間加一個(gè)兩端口的RAM,以實(shí)現(xiàn)數(shù)列的轉(zhuǎn)置;最后,在頂層設(shè)計(jì)一個(gè)有限狀態(tài)機(jī)控制整個(gè)流程。該設(shè)計(jì)采用較少的資源實(shí)現(xiàn)了較好的功能,獲得了可靠的實(shí)驗(yàn)結(jié)果。
關(guān)鍵詞:二維離散余弦變換;FPGA;H.264;DCT
0 引言
目前,基于分塊DCT的編碼技術(shù)已成為圖像/視頻編碼國際標(biāo)準(zhǔn)的核心技術(shù),一方面是因?yàn)镈CT具有良好的去相關(guān)性和能量壓縮性,另一方面是因?yàn)镈CT具有快速實(shí)現(xiàn)算法。隨著數(shù)字多媒體技術(shù)的快速發(fā)展,H.264視頻壓縮標(biāo)準(zhǔn)在多個(gè)領(lǐng)域得到了廣泛的應(yīng)用。然而,在當(dāng)前有限的網(wǎng)絡(luò)帶寬、FPGA有限的資源以及要求更高壓縮速率情況下,對二維離散余弦變換(DCT)提出了更高的要求。H.264對圖像或預(yù)測殘差采用了4×4整數(shù)離散余弦變換技術(shù),避免了以往標(biāo)準(zhǔn)中使用的通用8×8離散余弦變換、逆變換經(jīng)常出現(xiàn)的失配問題。
1 H.264的整數(shù)DCT變換
一維N點(diǎn)離散余弦變挽(DCT)可以表示為:
式中:xn是輸入時(shí)域序列中第n項(xiàng);yK是輸出頻域序列中的第K項(xiàng);系數(shù)CK定義如下:
H.264對4×4圖像塊進(jìn)行操作,則相應(yīng)的4×4DCT變換矩陣A為:
A中的a,b和c是實(shí)數(shù),而圖像塊X中的元素是整數(shù)。對實(shí)數(shù)的DCT,由于在解碼端的浮點(diǎn)運(yùn)算精度問題,會(huì)造成解碼后的數(shù)據(jù)的失配,進(jìn)而引起漂移。H.264比其他圖像編碼使用了更多的預(yù)測過程,甚至內(nèi)部編碼模式也依賴于空間預(yù)測。因此,H.264對預(yù)測漂移是十分敏感的。為此,H.264對4×4 DCT中的A進(jìn)行了改造,采用了整數(shù)DCT技術(shù),有效地減少計(jì)算量,同時(shí)不損失圖像準(zhǔn)確度。式(1)可以等效為:
式中:d=c/b≈0.414;符號表示結(jié)果中的每個(gè)元素乘以矩陣E中對應(yīng)位置上系數(shù)值的運(yùn)算。為了簡化計(jì)算,去d為0.5,同時(shí)又要保持變換的正交性,對b進(jìn)行修正,取。對矩陣C中的第2行和第4行,以及矩陣CT中的第2列和第4列元素乘以2,相應(yīng)地改造矩陣E為Ef,以保持式(7)成立,得到:
式中運(yùn)算對每個(gè)矩陣元素只進(jìn)行一次乘法,同時(shí)它將被歸納到量化運(yùn)算中。這樣,中只剩下整數(shù)的加法、減法和移位運(yùn)算。式(8)的矩陣乘法運(yùn)算可以改造成兩次一維整數(shù)DCT變換,例如先對圖像或其殘差塊的每行進(jìn)行一維整數(shù)DCT,然后對經(jīng)行變換塊的每列再應(yīng)用一維整數(shù)DCT變換。每次一維整數(shù)DCT可以采用蝶形快速算法,以節(jié)省時(shí)間,如圖1所示。
整數(shù)DCT變換是基于DCT的,但是又有一些不同:
(1)它是一個(gè)整數(shù)變換(所有的操作都可以使用整數(shù)算法,而不丟失解碼精度);
(2)它可以實(shí)現(xiàn)編碼端正變換與解碼端反變換之間的零誤差匹配;
(3)變換的核心部分可以僅僅使用加法和移位操作實(shí)現(xiàn);
(4)變換中的一部分尺度乘法運(yùn)算可以和量化器結(jié)合到一起,減少了乘法的數(shù)量。
2 H.264整數(shù)DCT變換的FPGA實(shí)現(xiàn)
H.264中以4×4塊為單位,運(yùn)算過程中只有移位和加法,降低了算法的復(fù)雜度,易于硬件實(shí)現(xiàn)。設(shè)計(jì)時(shí)可把二維DCT變換分割為兩次一維整數(shù)變換,而一維變換可以用蝶形快速算法實(shí)現(xiàn),整個(gè)過程只需64次加法和16次移位運(yùn)算。
圖2為H.264整數(shù)DCT變換的框圖。首先,輸入的數(shù)據(jù)在控制單元的控制下進(jìn)行一維DCT變換;然后,將結(jié)果存入雙端口RAM中,待整個(gè)4× 4塊一維變換后,將數(shù)據(jù)按照轉(zhuǎn)置的概念取出,再進(jìn)行一維DCT變換;最后,將其結(jié)果輸出即可。在設(shè)計(jì)中,為了加快系統(tǒng)的速度,采用兩個(gè)一維DCT變換模塊。
2.1 一維DCT蝶形算法模塊
根據(jù)圖1所示的快速算法,在加法器之間插入寄存器,以提高時(shí)鐘頻率和流水線處理,乘法運(yùn)算可用移位操作,因此可以快速地實(shí)現(xiàn)一維DCT蝶形算法。產(chǎn)生的結(jié)果存入雙端口RAM,以實(shí)現(xiàn)二維矩陣的轉(zhuǎn)置。在設(shè)計(jì)中,為了實(shí)現(xiàn)并行處理和最大的速率,設(shè)置兩個(gè)一維DCT蝶形算法模塊和4個(gè)雙端口RAM,在雙端口RAM的前后分別設(shè)計(jì)了數(shù)據(jù)選擇通路。第一個(gè)一維DCT實(shí)現(xiàn)行變換,第二個(gè)一維DCT實(shí)現(xiàn)列變換,由于在從行變換到列變換中間經(jīng)過1個(gè)矩陣轉(zhuǎn)置過程,所以在給列變換單元輸入數(shù)據(jù)時(shí),輸入的數(shù)據(jù)需要重新組合后再送給每個(gè)列變換單元。
在設(shè)計(jì)矩陣轉(zhuǎn)置是用4個(gè)RAM代替1個(gè)RAM,再增加兩個(gè)4通道的旋轉(zhuǎn)多路器,同時(shí)配合對4個(gè)RAM的編址讀操作,一次輸入原始矩陣的一列。并行矩陣轉(zhuǎn)置模塊的寫操作:每個(gè)時(shí)鐘周期變換一次RAM_BANK的接入順序,每個(gè)RAM_BANK每次寫入地址隨時(shí)鐘周期按順序遞增。
2.2 控制單元FSM
圖3顯示共有11個(gè)狀態(tài),主要對2個(gè)一維DCT變換模塊,4個(gè)RAM塊和2個(gè)數(shù)據(jù)選擇通路進(jìn)行控制,采用獨(dú)熱編碼,較好地實(shí)現(xiàn)了各底層模塊電路的鏈接。在設(shè)計(jì)中,采用異步復(fù)位,其好處是:重要綜合工具工藝庫有可異步復(fù)位觸發(fā)器,那么該觸發(fā)器的數(shù)據(jù)輸入通道就不需要額外的組合邏輯。同時(shí),采用了專用握手信號實(shí)現(xiàn)各模塊間有序的數(shù)據(jù)交換。
3 結(jié)論
通過圖4可以看出,在50 MHz的時(shí)鐘頻率下電路很好地完成了二維DCT的轉(zhuǎn)換,遲滯也比較小,實(shí)驗(yàn)結(jié)果與所設(shè)計(jì)的電路功能完全一致。仿真界面如圖5所示。
在Altera的CycloneⅡ平臺上,通過QuartusⅡ編譯報(bào)告可以看出,此電路共消耗了732個(gè)LE和256 b的RAM。
4 結(jié)語
本文采用高效的流水線結(jié)構(gòu),并基于FPGA設(shè)計(jì)實(shí)現(xiàn)了H.264硬件電路,無論是硬件占用資源,還是處理精度,完全可以滿足H.264視頻偏碼的需要。
fpga相關(guān)文章:fpga是什么
評論