惠 超,蔣 林,朱 筠,王 萍,崔馨月
(1.西安郵電大學 電子工程學院,陜西 西安 710121; 2.西安科技大學 集成電路實驗室,陜西 西安 710054)
在基于塊匹配的視頻編解碼算法中,分數(shù)運動估計算法在編碼端占據(jù)了約1/4的復雜度[1,2],在解碼端占據(jù)了約1/2的復雜度,是視頻編解碼器中計算密集度最高的任務之一。
國內外學者進行了大量降低亞像素插值模塊復雜程度的研究,Hong等[3]提出了一種可配置濾波器的電路結構,雖然提高了硬件資源利用率,但卻增加了計算的復雜度。Liu等[4]和Wang等[5]對所有的幀間編碼塊通過自適應插值濾波器來獲取亞像素預測像素塊,降低了碼流所需濾波器系數(shù)和解碼計算復雜度,但在面積和性能上都達不到人們的期望值。Luo等[6]提出一種基于Wallace樹優(yōu)化的HEVC分像素插值濾波算法的實現(xiàn)方案,相比于傳統(tǒng)方法不僅減少了硬件面積,而且提高了模塊可工作的最高頻率,但只是針對8×8大小的編碼塊,難以滿足視頻編碼質量多標準的要求。Kalali等[7]提出了兩個近似的HEVC分數(shù)插值濾波器,通過修改插值濾波器系數(shù)來進行分數(shù)濾波,能耗降低了67.1%,但是以損耗峰值信噪比和增加比特率為代價。這些方法雖然都能滿足算法實現(xiàn)的需求,但其結構固定,不能根據(jù)處理速度自適應地改變硬件實現(xiàn)的規(guī)模。
綜上所述,基于多核體系結構視頻編碼算法的動態(tài)可重構是解決不同大小預測塊靈活切換,提高插值計算效率與計算速度的有效途徑。本文使用可重構視頻陣列處理器設計分像素插值算法塊重構映射方案,根據(jù)不同大小的編碼塊,靈活配置處理元邏輯功能和處理元之間的互連方式,結合數(shù)據(jù)復用和并行處理的思想進行算法驗證。實驗結果表明,本文提出的方案無論在數(shù)據(jù)復用率還是資源占用量上都有較大改善。
在幀間編碼中,運動矢量不一定總是像素的整數(shù)倍。與H.264/AVC不同,HEVC中亮度分數(shù)樣點的內插分兩種情況處理,對1/2像素位置插值使用一個8抽頭濾波器,對1/4像素位置插值使用一個7抽頭濾波器,由于沒有中間的舍入操作,并且使用了更長的濾波器可大幅度提高內插精度,抽頭系數(shù)見表1。
表1 亮度分數(shù)樣點插值濾波器抽頭系數(shù)
圖1所示的亮度分數(shù)樣點插值中,大寫字母表示整數(shù)像素所在的位置,小寫字母表示分數(shù)像素所在位置。以A0,0附近的亞像素點為例,a0,0、b0,0、c0,0分別為1/4精度、1/2精度、3/4精度的水平亞像素插值點,它們可由水平方向上的整像素點計算得出;d0,0、h0,0、n0,0分別為1/4精度、1/2精度、3/4精度的垂直亞像素插值點,它們可由垂直方向上的整像素點計算得出,虛線框內的中間9個點e0,0、f0,0、g0,0、i0,0、j0,0、k0,0、p0,0、q0,0和r0,0可由內插出來的垂直鄰近的像素a0,j、b0,j、c0,j濾波得到。若以A0,0為基準像素點進行1/2插值,h′0,0和h0,0分別為垂直方向的上亞像素插值點和下亞像插值素點,h′0,0的插值系數(shù)跟式(1)是一致的,不同之處是向上取垂直方向上的4個像素點,向下取垂直方向上的3個像素點
h0,0={4(A0,-2+A0,3)-(A0,-3+A0,4)- 11(A0,-1-A0,2)-40(A0,0+A0,1)}?6
(1)
b0,0={4(A-2,0+A3,0)-(A-3,0+A4,0)-
11(A-1,0+A2,0)-40(A0,0+A1,0)}?6
(2)
圖1 分數(shù)位置像素插值
同理b0,0和b′0,0分別為水平方向的右亞像素插值點和左亞像插值素點,b′0,0的插值系數(shù)跟式(2)是一致的,不同之處是向左取水平方向上的4個像素點,向右取水平方向上的3個像素點。同理,1/4內插點a0,0和3/4內插點c0,0, 可利用水平方向的7個整數(shù)點,采用7抽頭濾波器內插得到;1/4內插點d0,0和3/4內插點n0,0, 可利用垂直方向的7個整數(shù)點,采用7抽頭濾波器內插得到。對于1/4精度的插值,平均每一個整數(shù)像素將伴隨著15個插值生成的像素。
為了滿足分像素插值算法靈活切換的需求,使用可重構視頻陣列處理器來對算法進行映射??芍貥嬕曨l陣列處理器不僅具有通用處理器的靈活性而且兼?zhèn)鋵S眉呻娐返母咝裕哂懈咝阅?、低功耗的?yōu)點,適合用于加速計算密集型任務,分像素運動估計亮度分量插值算法作為典型的計算密集型任務非常適合在可重構視頻陣列處理器上實現(xiàn)。
此處理器由可重構視頻陣列結構和輸入存儲器(data input memory,DIM)、輸出存儲器(data output memory,DOM)組成,可重構視頻陣列結構包含主機接口、全局控制器和處理單元陣列(processing element,PE)。全局控制器是可重構機制的關鍵部分,用于實現(xiàn)對陣列計算資源的控制與管理,為了確保每一條指令同時到達處理元陣列,在主機接口和底層PE陣列之間形成一個H-Tree型層次化網(wǎng)絡,通過H-Tree型傳輸網(wǎng)絡給PE下發(fā)不同的配置信息實現(xiàn)算法的靈活切換,全局控制器也可以根據(jù)H-Tree型網(wǎng)絡反饋的信息對每個處理元的執(zhí)行狀態(tài)進行檢測和信息采集[8,9];PE陣列是整個系統(tǒng)的核心計算部分,它包括主控單元、功能運算單元、配置緩存和指令寄存器,相鄰處理元通過東、南、西、北4個方向的鄰接互連共享寄存器進行數(shù)據(jù)交互[10]。圖2所示的PE陣列包括4個處理元簇(processing element group,PEG),不同處理元簇通過路由器進行通信,每個PEG中包含4×4個PE,每個PE中又包含指令、數(shù)據(jù)存儲器。將多個子任務的配置信息存儲在可重構陣列結構中的數(shù)據(jù)存儲中,通過軟件編程控制正在執(zhí)行任務中數(shù)據(jù)的寫入和讀出,同時對任務執(zhí)行數(shù)據(jù)進行統(tǒng)計。當數(shù)據(jù)處理完成后,通過檢測數(shù)據(jù)存儲中標志位地址信息,向處理元下發(fā)重構信息,將PC(program counter)跳轉至對應代碼的標志位從而達到任務的自主切換。
圖2 視頻陣列處理器結構
圖3 分像素插值算法框架
圖3為分像素插值算法硬件實現(xiàn)框架,該算法位于幀間環(huán)路中,處于整數(shù)運動估計算法之后,在接收到整數(shù)運動估計傳來的運動矢量后開始提取參考像素并進行亞像素插值計算。在該算法中,四叉樹劃分的深度越小,待插值像素數(shù)目就越多,插值計算量也越大。如果同一時間只針對一種亞像素位置進行處理,雖然提高了編碼精度,但同時也增加了算法處理時間,進而影響整個HEVC的編碼效率,這是得不償失的。
由于不同像素點間的插值計算并無數(shù)據(jù)相關性,在不同處理單元中同時進行插值操作是提高插值效率與計算速度的有效途徑。此外,視頻算法中的數(shù)據(jù)處理大部分以N×N矩形塊進行,這種H-Tree型體系結構相比其它通用結構更能滿足HEVC算法設計需求,能更有效的對視頻算法進行并行化和可重構設計。此算法共用到PEG03和PEG04兩個處理元簇,每個處理元簇包含PE00到PE33共16個處理元。以8×8大小的編碼塊為例,圖4為4條路徑并行的分像素插值算法映射,具體操作步驟如下:
步驟1 原始像素和參考像素加載。PEG03中的PE30接到整數(shù)運動估計傳來的雙握手信號‘555’和‘999’后,通過鄰接互連寄存器,接收到3個數(shù)值,兩個運動矢量,一個整數(shù)運動估計的絕對差值和(sum of absolute diffe-rence,SAD)。
隨后對當前編碼塊是否需要做插值運算進行判斷,如若進行亞像素插值,給PEG03中的PE00、PEG04中的PE33分別下發(fā)握手信號‘222’和‘111’。PEG03中的PE00在接到握手信號222后,按8×8的塊開始從數(shù)據(jù)輸入存儲(data input memory,DIM)取原始像素值,并下發(fā)給PEG03中PE01、PE11、PE21和PE31的0-63號地址。與此同時,PEG04中的PE33按16×24的塊大小取參考像素值,在并下發(fā)給與數(shù)據(jù)輸出存儲(data output memory,DOM)相連的PE03、PE13、PE23的117-500號地址準備進行插值計算。按16×24的塊大小取參考像素值,在取數(shù)和計算過程中充分考慮1/2和1/4像素點中可復用的數(shù)據(jù),相比于不利用數(shù)據(jù)復用的情況,從外部存儲器讀取數(shù)據(jù)量減少了74.7%。
步驟2 分像素插值計算。不同PE在收到由DIM中取入的原始像素和由DOM中取入的參考像素后,開始進行1/2精度或者1/4精度插值計算。待參考像素下發(fā)完成后,PEG04中的PE03、PE13、PE23、PE33按1/2水平和垂直插值公式進行計算,對64個像素值進行1/2插值,并將插值結果保存到對應的數(shù)據(jù)存儲中。1/2插值計算完成后,4條路徑在同一時刻依次進行3/4插值、1/4插值和傾斜方向的亞像素點插值計算。最后將插值結果下發(fā)到PEG03進行殘差值的比較。值得注意的是,為了保證像素在計算中具有較高亞像素精度,所有像素在插值時都右移了6位,待進入后續(xù)幀間預測環(huán)節(jié)中,其像素值將被還原。
步驟3 SAD絕對差值和計算。在同一時間計算不同編碼塊的SAD值,不僅可以最大化資源配置利用率,而且還能縮短算法運行周期。PEG03中的PE01、PE11、PE21和PE31在收到原始像素與插值像素后,進行SAD計算,并將SAD結果下發(fā)到PE20與整數(shù)運動估計傳來的SAD值進行比較,若整數(shù)運動估計的SAD值更小,將對應的運動矢量、相應的整數(shù)標簽‘1212’保存到PE10的506、507、508號地址;若插值后編碼塊的SAD值更小,則將插值后的像素值通過PE10的鄰接互連寄存器輸出傳給幀間運動補償算法。
圖4 分像素插值算法并行映射
HEVC中,一幀圖像被分割為多個互補重疊的編碼單元,這些編碼單元按照四叉樹的方式遞歸劃分為多個子單元,子單元編碼塊大小為64×64、32×32、16×16和8×8。HEVC標準規(guī)定編碼單元的規(guī)模不能小于8×8,編碼平坦的區(qū)域用大尺寸塊表示,編碼復雜的區(qū)域用小尺寸塊表示。一個大小為64×64的最大編碼單元(largest coding unit,LCU)總共有85種劃分方式,面對如此眾多的劃分情況,調整算法模式以適用于不同規(guī)模的劃分成為提高視頻編碼效率的關鍵。
如圖5所示為HM中隨機挑選的3種測試序列四叉樹劃分結果,經(jīng)過對比分析得出8×8大小的編碼塊被選擇的平均概率為66%,16×16大小的編碼塊被選擇的平均概率為25%,其余大小編碼塊被選擇的平均概率僅為9%,因此本文主要對8×8和16×16大小的編碼塊進行重構切換。
圖5 不同測試序列四叉樹劃分占比情況
圖6 塊重構指令存放
塊重構是指不同塊大小的分像素插值算法的重構實現(xiàn),以滿足針對四叉樹劃分和計算時間的不同需求選擇不同的編碼規(guī)模。如圖6所示為分像素插值算法塊重構指令存放。首先對編碼塊大小為8×8與16×16的代碼進行分區(qū),隨后HPN向陣列下發(fā)執(zhí)行何種塊大小的狀態(tài),并將PC值指向對應代碼的標志位處。圖中PC1為執(zhí)行8×8代碼時的標志位,PC2為執(zhí)行16×16代碼時的標志位。當執(zhí)行重構指令時,從存儲塊中讀取出任務的配置信息,同時修改程序計數(shù)器,將配置信息的首地址寫入其中。PE根據(jù)配置信息,執(zhí)行相應操作,實現(xiàn)8×8與16×16的塊切換。具體操作步驟如下:
步驟1 首先將標準視頻測試序列轉換為處理器可操作的二進制灰度值,將灰度值以文本格式存入片外存儲器DIM中。其次對每個PE獨立的指令存儲器進行分區(qū)處理,例如可以分成兩段,上半段可以設置為編碼塊大小為8×8的CU進行插值計算的指令存儲區(qū),將核心運算代碼初始化到0-254號地址中;下半段可以設置為編碼塊大小為16×16的CU進行插值計算的指令存儲區(qū),將核心運算代碼初始化到255-511號地址中,最后將PC標志位‘0’和‘255’存儲到PEG04中PE33的510號和511號地址中。
步驟2 由于8×8大小的編碼塊被選擇的平均概率高過50%,本文默認執(zhí)行8×8大小編碼塊的分像素插值算法,如若編碼區(qū)域過于平坦,沒有過多的細節(jié)信息,需要使用大小為16×16的編碼塊進行計算,則全局控制器通過HPN網(wǎng)絡下發(fā)塊重構配置信息,執(zhí)行初始化于指令存儲后半段中塊大小為16×16的分像素插值算法。
步驟3 插值計算結束后需要進行最優(yōu)預測塊的選取,支持可變塊HEVC分像素插值算法需要根據(jù)原始像素與參考像素對插值后的編碼塊進行SAD比較。SAD計算同樣采取上述方法,將不同規(guī)模編碼塊對應的SAD算法分段存儲于指令存儲器中,根據(jù)插值計算時CU的大小,全局控制器通過HPN網(wǎng)絡將PC跳轉至與當前編碼規(guī)模相匹配的SAD算法的起始位置。PEG03中PE10的509號地址在接到握手信號‘666’時,說明分像素插值和SAD比較都已執(zhí)行完成,PE10開始向02簇執(zhí)行數(shù)據(jù)下發(fā)過程,通過雙握手‘888’、‘555’與02簇的PE13進行傳數(shù)。
為了驗證本文所提出動態(tài)可重構分像素插值算法的可行性,使用基于BEECube公司BEE4開發(fā)平臺搭建的視頻陣列處理器原型系統(tǒng)進行驗證和測試。實驗所涉及的可重構視頻陣列處理器用Verilog HDL語言描述,算法驗證測試環(huán)境和所使用的工具見表2。以標準測試序列akiyo.qicf作為測試序列在Questasim 10.1d工具下進行功能仿真驗證,采用90 nm CMOS技術工藝進行綜合。首先將此重構方案的指令和數(shù)據(jù)初始化到對應的指令存儲器和數(shù)據(jù)存儲器中,通過MATLAB端下發(fā)一幀測試序列來進行仿真和驗證。
表2 算法驗證測試環(huán)境和所使用工具
PE00連接片外輸入存儲DIM,按8×8或16×16的編碼單元取原始像素值;PE33連接片外輸出存儲DOM,根據(jù)分像素插值原理需求按24×16或48×32的塊大小取參考像素值。對于一幀1920×1080的圖像來說,如果都按8×8的塊進行編碼,總共有32 400塊,不采用數(shù)據(jù)復用的情況下,每個編碼塊需從DOM中讀取256個參考像素值,總共需要讀取32 400×256=8 294 400個參考像素值,但是利用數(shù)據(jù)復用的情況下,除了第一個塊取256個像素值,剩余的第一行和第一列每個塊只需要從DOM中取128個參考像素值,最后余下的塊僅僅需要從DOM中取64個參考像素值,總共需要讀取256+128×374+64×32 026=2 097 792個參考像素值。相比于不利用數(shù)據(jù)復用的情況,從外部存儲器讀取數(shù)據(jù)量減少了74.7%。(圖7中A、B、C和D這4塊都是大小為16×16的參考像素塊,以A參考塊為基準,B參考塊是與A同行相鄰的一個參考塊,C參考塊是與A同列相鄰的一個參考塊,可以看出,A和B相交的部分為同行相鄰的參考塊中數(shù)據(jù)復用的部分,A和C相交的部分為同列相鄰的參考塊中數(shù)據(jù)復用的部分,A、B、C和D相交的部分為4個參考塊中數(shù)據(jù)復用的部分。)
圖7 CU為8×8時數(shù)據(jù)復用簡化
在進行亞像素插值時,對同一個整數(shù)像素點來說,其上、下、左、右會用到大量相同的參考像素值,插值計算時數(shù)據(jù)復用結構如圖8所示。例如圖1中h′0,0需要用到地址為4,20,36,52,68,84,100,116號的參考像素值,h0,0需要用到地址為20,36,52,68,84,100,116,132號的參考像素值,8個參考像素值中有7個是不變的,若充分利用數(shù)據(jù)復用,垂直方向的下亞像素點所用到像素值只需要更新一個新值,插值計算部分讀取數(shù)據(jù)量減少了43.8%。同理可得16×16的編碼塊在取數(shù)據(jù)和插值計算部分的數(shù)據(jù)復用率分別為74.4%和42.7%。
圖8 插值計算時數(shù)據(jù)復用結構
圖9(a)為兩種編碼塊在像素加載與SAD值計算階段耗時統(tǒng)計,以DIM取原始像素為例,在采取數(shù)據(jù)復用后,16×16大小的編碼塊比8×8大小編碼塊相對耗時減少約7.5%。圖9(b)為分像素插值算法在串行和并行兩種情況下處理不同大小的編碼塊所需的時間對比,對于8×8的編碼塊來說,采用4路并行的處理方式進行插值計算比不同精度運動矢量串行計算的速度提升68.2%,加速比為3.14;對于16×16的編碼塊來說,采用4路并行的處理方式比串行計算速度提升74.7%,加速比為3.96。
圖9 不同CU大小下時間對比
表3是對部分性能的統(tǒng)計,根據(jù)實驗結果顯示在90 NM工藝下硬件實現(xiàn)時最大工作頻率可達357 MHZ,資源占用量為24 830個邏輯門。本文HEVC分像素插值算法將每個子任務劃分到陣列處理器上進行映射,在前一個編碼塊插值任務進行完后即可開始下一個編碼塊的計算,16個PE規(guī)模的陣列結構。
表3 性能分析
可同時處理1-4組子任務,最大并行度為4。為了更好地說明本算法的優(yōu)勢,將算法對應的硬件設計綜合情況與其它同類型文獻進行對比。由表3實驗數(shù)據(jù)得出,在相同的90 nm工藝下,與文獻[7]相比,雖然硬件消耗有所增加,但是最高頻率增加了19%,與文獻[11]相比,硬件消耗減少18.5%,最高頻率增加53.2%,與32 nm工藝的文獻[6]相比,雖然最高頻率還有待提高,但是硬件消耗減少24.7%,吞吐率增加了10.3%。由此可見,本設計可在硬件面積更小的情況下達到更高的工作頻率,這一點在與對照組的對比過程中尤為明顯。此外本設計用加法器和移位操作代替乘法器進行運算,使得計算速度更快,運算時鐘周期數(shù)更小。在并行方式的選擇上比文獻[6,7,11]更加靈活,支持1-4路組并行的處理方式,可以根據(jù)應用處理速度需求的不同進行選擇。在支持重構方面,相比于文獻[6,7,11]可以快速實現(xiàn)不同規(guī)模、不同塊大小算法之間的靈活切換,以應對不同圖像序列的劃分需求。
針對HEVC分像素插值算法計算量大、冗余度高、靈活性不足的問題,結合視頻陣列處理器的特點和現(xiàn)已存在的分像素插值算法特點,提出一種動態(tài)可重構且具有高數(shù)據(jù)復用率的分像素插值算法實現(xiàn)方法,并將算法映射到可重構視頻陣列處理器上。通過實驗得出此方法可有效解決分像素插值算法資源利用率不高、不同編碼塊之間難以靈活切換的問題。在90 nm工藝下硬件最大工作頻率可達357 MHz,資源占用量為24 830個邏輯門,參考像素的讀取數(shù)量減少了43.8%,且硬件資源消耗減少18.5%。此算法在高清視頻編碼和傳輸中有很強的實用性。此外,在未來研究中將進一步提高資源利用率與數(shù)據(jù)復用率,做到時間和空間上可重構。