H.264編碼器中亞像素運(yùn)動估計的硬件設(shè)計
引言
運(yùn)動估計就是在幀間預(yù)測時設(shè)法找到當(dāng)前幀的像素(或圖像塊)是從上一幀圖像的什么位置移動過來的,以該位置上的像素(或圖像塊)作為預(yù)測依據(jù),以此提高預(yù)測的準(zhǔn)確性。由于H.264中的運(yùn)動估計采用了一系列新技術(shù),如七種塊尺寸(將一個宏塊分割成16×16、16×8、8×16、8×8、8×4、4×8、4×4七種類型的子塊進(jìn)行運(yùn)動估計)、1/4像素精度運(yùn)動補(bǔ)償技術(shù)和多參考幀技術(shù)等,在使壓縮效率至少提高兩倍的同時,計算量也大大增加。實驗結(jié)果表明,運(yùn)動估計占H.264編碼器的60%~80%的時間。H.264中的運(yùn)動估計由整數(shù)運(yùn)動估計和分?jǐn)?shù)運(yùn)動估計兩部分組成。由于不論是自然視頻圖像序列或是合成視頻圖像序列,實際對象的運(yùn)動精度都是任意小的,所以引入分?jǐn)?shù)運(yùn)動估計能非常準(zhǔn)確地描述對象的運(yùn)動軌跡,能更進(jìn)一步去除視頻圖像序列的時間冗余,其精度達(dá)到了1/8像素精度。分像素的運(yùn)動矢量如圖1所示。
圖1 分像素運(yùn)動矢量
一般在實際應(yīng)用中,運(yùn)動估計普遍采用分級搜索算法:首先在搜索區(qū)內(nèi)找到最佳整像素運(yùn)動矢量,再在整像素最佳匹配點(diǎn)下尋找最佳1/2匹配點(diǎn),得到半像素精度的運(yùn)動矢量,接著在該半像素精度最佳匹配點(diǎn)周圍進(jìn)行1/4像素點(diǎn)搜索,得到1/4像素精度最佳匹配點(diǎn)以及相應(yīng)的運(yùn)動矢量。由于分像素運(yùn)動估計運(yùn)算量大,很多學(xué)者對分像素運(yùn)動估計從算法上進(jìn)行優(yōu)化,提出了很多快速搜索算法,減少搜索點(diǎn)數(shù)目以達(dá)到降低運(yùn)算復(fù)雜度的目的。本文就是基于這個目的,在塊匹配算法的基礎(chǔ)上,提出了一種1/4像素精度的亞像素運(yùn)動估計的硬件實現(xiàn)方法。在整像素運(yùn)動估計的基礎(chǔ)上用10×10整像素陣列實現(xiàn)半像素精度和1/4像素精度的最佳匹配點(diǎn)搜索,在空間上具有更高的并行度,硬件實現(xiàn)簡潔有效。
FME的運(yùn)動矢量
幀間編碼宏塊中的每個塊或亞宏塊分割區(qū)域都是根據(jù)參考幀中同尺寸的區(qū)域預(yù)測得到的,它們之間的關(guān)系用運(yùn)動矢量來表示。H.264對亮度成分和色度成分進(jìn)行亞像素搜索時,兩者之間的運(yùn)動矢量是有差異的,對亮度成分采用1/4像素精度,色度成分采用1/8像素精度。
假定點(diǎn)H是在整像素運(yùn)動估計中找到的最佳匹配點(diǎn),在此基礎(chǔ)上再進(jìn)行1/2像素點(diǎn)的搜索,如點(diǎn)(bb,aa等),如果MV的垂直和水平分量為整數(shù),參考塊相應(yīng)像素實際存在;如果其中一個或兩個為分?jǐn)?shù),則參考塊相應(yīng)的亮度和色度像素并不存在,需利用鄰近已編碼點(diǎn)進(jìn)行內(nèi)插而得。
內(nèi)插像素生成的步驟如下:
首先生成參考圖象亮度成分的半像素點(diǎn)。半像素點(diǎn)(如b、h、m)通過對相應(yīng)整像素點(diǎn)進(jìn)行6抽頭濾波得出,權(quán)重為(1/32、-5/32、5/8、5/8、-5/32、1/32)。b通過下式計算得出:
b=round((E-5F=20G+20H-5I+J)/32) (1)
類似的,h由A、C、G、M、R、T濾波得出。一旦鄰近(垂直或水平方向)整像素點(diǎn)的所有像素都計算出來,剩余的半像素點(diǎn)便可通過對6個垂直或水平方向的半像素點(diǎn)濾波得到。例如,j由cc、dd、h、m、ee、ff濾波得出。
半像素點(diǎn)計算出來后,在此基礎(chǔ)上,1/4像素點(diǎn)可通過線性內(nèi)插得出,如圖2所示。
圖2 亮度1/4像素內(nèi)插
1/4像素點(diǎn)(如a、c、i、k、d、f、n、q)由鄰近像素內(nèi)插而得,如
a=round((G+b)/2) (2)
剩余1/4像素點(diǎn)(p,r)由一對對角半像素點(diǎn)線性內(nèi)插得出,如e由b和h獲得。相應(yīng)地,對于色度成分的1/8像素精度的運(yùn)動矢量,也同樣通過整像素點(diǎn)線性內(nèi)插得出,如圖3所示。
圖3 色度1/8像素內(nèi)插
其中:
a=round([(8-dx)(8-dy)A+dx(8-dy)B+(8-dx)dyC+dx dyD]/64) (3)
FME模塊算法原理及硬件實現(xiàn)
在本設(shè)計中,F(xiàn)ME搜索采用的是如圖4所示的菱形全搜索方法。
圖4 菱形全搜索
即先利用整像素運(yùn)動估計搜索出最佳整像素點(diǎn),再在最佳整像素匹配點(diǎn)的基礎(chǔ)上搜索出最佳整像素點(diǎn)周圍的36個亞像素點(diǎn)(假設(shè)在圖5中正中心點(diǎn)是最佳整像素匹配點(diǎn))。等36個亞像素點(diǎn)都計算出來后,加上正中心的最佳整像素點(diǎn)共37個像素點(diǎn)。比較這37個像素點(diǎn)的SATD的值,將SATD值最小的像素點(diǎn)確定為最佳的預(yù)測點(diǎn)。
由于H.264采用樹形結(jié)構(gòu)運(yùn)動估計,每個宏塊可劃分成更小的子塊,其中4×4塊是宏塊劃分中最小的子塊,任何類型的子塊都可由若干個具有相同運(yùn)動矢量的4×4塊組成,因此本設(shè)計在硬件實現(xiàn)時將4×4塊作為處理的基本單位??紤]到硬件資源的節(jié)省及計算的并行度,在本設(shè)計模塊中每次能并行處理兩個4×4塊的亞像素點(diǎn)的搜索,一個宏塊(16×16)要分8次完成。
其中IME單元為FME單元提供10×10整像素點(diǎn)陣列,內(nèi)插法用于1/2像素點(diǎn)的插值,ave單元用于計算1/4像素精度的像素點(diǎn),Sram單元用于存儲計算出來的亞像素點(diǎn)的值。比較器單元由diff、DCT、satd三個單元組成,用于比較這些亞像素的SATD值,確定最佳的亞像素預(yù)測值。
假設(shè)當(dāng)前處理的4×4塊在參考幀中的最佳整像素匹配塊(4×4塊為匹配的塊),在硬件實現(xiàn)的過程中為減少搜索次數(shù),只要搜索出圖5中對應(yīng)的5×5塊的每個整像素點(diǎn)左上角的15個亞像素點(diǎn)(,然后將相鄰整像素點(diǎn)左上角的亞像素點(diǎn)進(jìn)行組合后就能將當(dāng)前處理的4×4塊中每個整像素點(diǎn)周圍的36個亞像素點(diǎn)都計算出來。
圖5 最佳整像素匹配塊
本設(shè)計在硬件實現(xiàn)的過程中為提高計算的并行度,利用15個六抽頭濾波器,25個均值器等硬件資源來計算圖8所示的亞像素點(diǎn)的值,計算依據(jù)分別如公式1、2所示,硬件搜索計算過程如圖6所示。
圖6 亞像素點(diǎn)硬件搜索步驟
通過上述15個步驟就可將圖8所示的亞像素點(diǎn)全部計算出來,并將計算出來的亞像素點(diǎn)的值都存入到開辟的Sram中,以便在進(jìn)行P幀重構(gòu)時從Sram中直接取出最佳的預(yù)測值給相關(guān)的模塊。由于如上文所述在對每個4×4塊進(jìn)行亞像素搜索時要計算出對應(yīng)的5×5塊(如圖7所示4×4塊對應(yīng)的5×5塊)的每個整像素點(diǎn)左上角的15個亞像素點(diǎn)的值(如圖8所示的15個亞像素點(diǎn)),加上最佳整像素點(diǎn)共16個像素點(diǎn)的值都要存儲起來,且對應(yīng)的5×5塊中的每個整像素點(diǎn)左上角的亞像素點(diǎn)的像素值都是并行計算出來的(如step1計算點(diǎn)2,是將對應(yīng)的5×5塊的25個整像素點(diǎn)左上角對應(yīng)的點(diǎn)2一次全計算出來),所以在進(jìn)行一個4×4塊的亞像素搜索時,要存儲的像素點(diǎn)共有25×16個。由于在本設(shè)計模塊中每次能并行處理兩個4×4塊單元,即利用兩套FME模塊資源并行處理兩個4×4塊的亞像素搜索,一個宏塊(16×16)要分8次完成??紤]到數(shù)據(jù)組織的方便性,本設(shè)計在一套FME模塊中開辟兩塊Sram資源,一塊大小為104×128,一個地址存儲13個像素點(diǎn)的值(每個像素點(diǎn)的值占8bit),另一塊大小為96×128,一個地址能存儲12個像素點(diǎn)的值(每個像素點(diǎn)的值占8bit),地址深度128剛好能存儲8個4×4塊的亞像素點(diǎn)的像素值,所以兩套FME模塊中的Sram資源剛好能把一個宏塊的亞像素點(diǎn)的像素值都存儲起來。此設(shè)計在硬件的實現(xiàn)過程中計算并行度高,硬件實現(xiàn)簡潔有效。
根據(jù)圖6所示的硬件架構(gòu)及上文描述的算法原理,利用Verilog HDL對其進(jìn)行建模,建立測試平臺在ModelSim環(huán)境中進(jìn)行編譯、仿真,驗證其功能的準(zhǔn)確性。然后使用Synplify工具對其進(jìn)行綜合,工作頻率可達(dá)68MHz。在FPGA 驗證平臺上,可實現(xiàn)對高清碼流(1920×1080)的編碼,利用Design Complier工具進(jìn)行綜合,在中芯國際0.18μm 工藝標(biāo)準(zhǔn)單元庫的基礎(chǔ)上,綜合后面積占150千門,工作時鐘頻率可達(dá)166MHz,達(dá)到了預(yù)期要求。
結(jié)語
H.264中的分?jǐn)?shù)運(yùn)動估計能有效提高預(yù)測精度,但大大增加了計算復(fù)雜度。同整數(shù)運(yùn)動估計一樣,分?jǐn)?shù)運(yùn)動估計存在兩個主要問題,一是計算量大,二是存儲訪問量大。而本文提出與其他實現(xiàn)方法相比在空間上具有更高的并行度,處理能力更高,不但減少了大量中間數(shù)據(jù)的存儲與傳輸,節(jié)省了存儲器資源,而且簡化了數(shù)據(jù)流和控制流,使硬件實現(xiàn)簡潔有效,非常適合高分辨率視頻的分像素運(yùn)動估計。