文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2014)02-0042-04
音視頻編碼標(biāo)準(zhǔn)AVS(Audio Video coding Standard)是我國(guó)具備自主知產(chǎn)權(quán)的第二代信源編碼標(biāo)準(zhǔn)[1]。AVS標(biāo)準(zhǔn)在獲得高編碼效率的同時(shí)降低了實(shí)現(xiàn)的復(fù)雜度[2]。AVS預(yù)測(cè)殘差系數(shù)首先經(jīng)過(guò)整數(shù)DCT變換和量化,量化器輸出是一個(gè)包含少數(shù)非零系數(shù)和大量零系數(shù)的矩陣,在熵編碼之前必須進(jìn)行重排序,并對(duì)零系數(shù)進(jìn)行有效的表示[3],因此要進(jìn)行zig-zag掃描和游程編碼。之后的輸出是一個(gè)數(shù)組,用(run,level)表示,其中run表示非零系數(shù)之前的零的個(gè)數(shù),level 表示非零系數(shù)的值。run、level之間存在很強(qiáng)的相關(guān)性,因此run、level共用一個(gè)可變長(zhǎng)碼字進(jìn)行編碼,這種編碼方式叫做二維可變長(zhǎng)編碼[4]。
由于AVS熵編碼運(yùn)算復(fù)雜,費(fèi)時(shí)較長(zhǎng),本文采取流水線設(shè)計(jì)方式,利用并行zig-zag掃描加快了編碼速度,并設(shè)計(jì)了碼長(zhǎng)確定器,節(jié)省了硬件資源,完成高清AVS熵編碼硬件設(shè)計(jì)。
1 熵編碼硬件設(shè)計(jì)
AVS熵編碼硬件設(shè)計(jì)包括量化數(shù)據(jù)輸入、zig-zag掃描、游程編碼、碼表切換、組合邏輯查找、指數(shù)哥倫布編碼和碼流輸出7個(gè)模塊,電路框圖如圖1所示。
1.1 并行zig-zag掃描
首先將量化系數(shù)輸入到Ram0中,一個(gè)時(shí)鐘輸入8個(gè),因此對(duì)于一個(gè)8×8的矩陣,只需要8個(gè)時(shí)鐘就可以完成輸入。然后按圖2所示存入相應(yīng)的Ram0地址,圖中的數(shù)字代表AVS標(biāo)準(zhǔn)中規(guī)定的zig-zag掃描的順序。
與傳統(tǒng)的MPEG/H.26L的VLC不同,在AVS中,采用zig-zag掃描的系數(shù)處理順序,這種掃描順序更易遵循level信息的變化[5]。本文采用并行zig-zag掃描,如圖3所示。一個(gè)時(shí)鐘周期內(nèi)讀出4個(gè)量化系數(shù)Out0、Out1、Out2、Out3,并且Ram0中的數(shù)據(jù)按圖3括號(hào)里的數(shù)字所代表的方向順序移動(dòng)一次。例如表中的4(0)、5(1)分別表示在時(shí)鐘沿到來(lái)時(shí)4號(hào)地址的數(shù)據(jù)移動(dòng)到0號(hào)地址,5號(hào)地址的數(shù)據(jù)移動(dòng)到1號(hào)地址。對(duì)于8×8塊,最多需要16個(gè)時(shí)鐘就可以完成掃描。與以往文獻(xiàn)[6]相比,本設(shè)計(jì)將掃描時(shí)間減少了一半,加快了處理速度。
1.2 游程編碼
本設(shè)計(jì)中的并行zig-zag掃描有可能在一個(gè)時(shí)鐘內(nèi)讀出4組(run,level),因此在存儲(chǔ)游程編碼輸出時(shí)利用了4個(gè)深度為16的Ram,結(jié)構(gòu)框圖如圖4所示。
圖4中的“掃描結(jié)果判斷邏輯”的實(shí)現(xiàn)方法:對(duì)掃描結(jié)果Out0~Out3進(jìn)行非零判斷。為方便描述,規(guī)定若掃描結(jié)果不為0,則用1表示,否則用0表示,因此Out0~Out3的結(jié)果可以描述為0000~1111。定義變量num,用來(lái)表示兩個(gè)level之間的0的個(gè)數(shù),初始化為0。掃描結(jié)果的存儲(chǔ)順序是先存Ram1~Ram4的0號(hào)地址,再存Ram1~Ram4的1號(hào)地址,依次存儲(chǔ)。例如,若掃描結(jié)果為0100,則令run0=num+1,level0=Out1,存儲(chǔ)(run0,level0),并令num=2。若掃描結(jié)果為1011,令run0=num, level0=Out0;run1=1,level1=Out2;run2=0,level2=Out3,依次存儲(chǔ)(run0,level0)、(run1,level1)、(run2,level2),并令num=0。
1.3 流水線設(shè)計(jì)
流水線技術(shù)的本質(zhì)是把一個(gè)很大的總運(yùn)算單元?jiǎng)澐殖啥鄠€(gè)獨(dú)立的子運(yùn)算單元,某一個(gè)時(shí)間段內(nèi)各個(gè)子單元可以并行工作,從而提高數(shù)據(jù)處理速度。
本設(shè)計(jì)中將碼表切換、組合邏輯查找和指數(shù)哥倫布編碼設(shè)計(jì)成流水線結(jié)構(gòu),同時(shí)這種硬件結(jié)構(gòu)也節(jié)省了大量存儲(chǔ)中間結(jié)果所需要的空間。流水線結(jié)構(gòu)如圖5所示,圖中的1~5表示第1~5組(run,level)。
1.4 碼表切換模塊設(shè)計(jì)
本模塊的功能是得到當(dāng)前(run,level)組對(duì)應(yīng)的碼表號(hào)。實(shí)現(xiàn)過(guò)程為:若前一組level的絕對(duì)值大于跳轉(zhuǎn)門(mén)限,則根據(jù)AVS標(biāo)準(zhǔn)中的碼表跳轉(zhuǎn)規(guī)則進(jìn)行碼表切換,得到當(dāng)前(run,level)組的碼表號(hào)tablenum,并更新跳轉(zhuǎn)門(mén)限;否則,碼表號(hào)tablenum不變,即當(dāng)前組的碼表號(hào)是由上一組level的絕對(duì)值決定的。該硬件結(jié)構(gòu)如圖6所示。1.5 組合邏輯查找
編碼時(shí)從最后一組(run,level)開(kāi)始,為節(jié)約存儲(chǔ)器資源,本文采取組合邏輯映射查表的方法,避免了訪問(wèn)存儲(chǔ)器帶來(lái)的延遲[7]。該方法由run、level和碼表號(hào)tablenum組成查表索引,輸入到組合邏輯中,得到對(duì)應(yīng)的碼字codenum。由于AVS熵編碼正常編碼部分對(duì)應(yīng)的碼字是0~59(共60個(gè)),很多查表索引對(duì)應(yīng)相同的碼字codenum,因此把相同的索引路徑合并,從而有效減少映射路徑,提高索引效率。例如由于表VLC0_Intra中(run,level)為(3,1)時(shí)所對(duì)應(yīng)的碼字和表VLC1_Intra中(run,level)為(2,1)時(shí)所對(duì)應(yīng)的碼字都是6,因此可將這兩條索引路徑合并,由同一條索引路徑映射出碼字。
1.6 指數(shù)哥倫布編碼
在AVS標(biāo)準(zhǔn)中宏塊層以上的語(yǔ)法元素采用定長(zhǎng)碼或0階指數(shù)哥倫布碼編碼[8]。殘差系數(shù)采用基于上下文的二維變長(zhǎng)編碼,即對(duì)通過(guò)組合邏輯查找得到的碼字codenum進(jìn)行0、1、2或3階指數(shù)哥倫布編碼,逃逸編碼則采用0或1階指數(shù)哥倫布編碼,在AVS標(biāo)準(zhǔn)中已經(jīng)規(guī)定了每張碼表對(duì)應(yīng)的指數(shù)哥倫布編碼的階數(shù)。圖7為產(chǎn)生階數(shù)K的硬件電路,其中flag為標(biāo)志位,若該碼字為正常編碼,則flag為0;若為逃逸編碼,則flag為1。
1.7 碼長(zhǎng)確定器和碼字輸出
由于指數(shù)哥倫布編碼屬于變長(zhǎng)編碼,因此在編碼時(shí)指數(shù)哥倫布碼長(zhǎng)度的確定是影響整個(gè)編碼器效率的關(guān)鍵問(wèn)題[9]。若要準(zhǔn)確地輸出,就必須確定出碼字的具體位數(shù),以往文獻(xiàn)[10]中是另外開(kāi)辟存儲(chǔ)空間來(lái)存儲(chǔ)每一個(gè)碼字的位數(shù)。本設(shè)計(jì)使用了碼長(zhǎng)確定器結(jié)構(gòu),直接從讀出的碼字進(jìn)行位數(shù)的判斷,從而節(jié)省了存儲(chǔ)空間。
由于碼字的后綴部分不超過(guò)16 bit,因此該結(jié)構(gòu)將高16位輸入分為兩組進(jìn)行檢測(cè)。“或門(mén)”將高8位輸入進(jìn)行“或”運(yùn)算,用來(lái)檢測(cè)碼字高8位中是否含有1。在MUX中,如果“或門(mén)”的輸出為1,則選擇Code[15:8]作為輸入;否則,選取Code[7:0]。編碼器從輸入的最高位開(kāi)始逐位檢查是否為1,若為1則輸出編碼值。如果最高位為1,則輸出111;如果次高位為1,則輸出110,依次類(lèi)推,R[2:0]依次減1輸出。如果“或門(mén)”的輸出為1,則選擇器對(duì)R[2:0]進(jìn)行加8操作,否則R[2:0]的值不變。選擇器的輸出M就是首1的具體位置。根據(jù)式(3)就可以得到碼字的長(zhǎng)度Length。碼長(zhǎng)確定器的硬件結(jié)構(gòu)如圖8所示。
在碼字輸出時(shí),熵編碼將各種信息以二進(jìn)制的形式逐個(gè)比特寫(xiě)入碼流,最終以字節(jié)為單位進(jìn)行封裝,這樣會(huì)增加運(yùn)算時(shí)間,使得編碼效率極低[10]。本設(shè)計(jì)中采用雙字節(jié)為單位寫(xiě)入碼流,極大地加快了熵編碼速度。實(shí)現(xiàn)方法:將完成編碼的碼字Code存儲(chǔ)到寬度為16的Ram中,設(shè)置一個(gè)32 bit的碼流緩沖器,變量pos表示碼流緩沖器中有效碼字的位置,初始值為31,在有效碼字?jǐn)?shù)大于或者等于16(即pos<16)時(shí),碼流緩沖器左移輸出16 bit數(shù)據(jù)Codestream,然后pos加16。變量Length表示輸入到緩沖器中碼字的位數(shù)。輸出模塊的硬件結(jié)構(gòu)如圖9所示。
2 驗(yàn)證、實(shí)現(xiàn)結(jié)果及仿真分析
2.1 驗(yàn)證
驗(yàn)證思路是將AVS參考軟件產(chǎn)生的測(cè)試向量作為激勵(lì),輸入到熵編碼模塊,然后將其結(jié)果與軟件編碼的結(jié)果進(jìn)行比對(duì),從而驗(yàn)證熵編碼模塊設(shè)計(jì)的正確性。本設(shè)計(jì)中參考軟件產(chǎn)生的測(cè)試向量為2,0,2, 0,1,0,11,5,2,
7,0,1,0,0,2,8,4,0,2,0,0,1,1,0,1,0……0共64個(gè)數(shù)據(jù)。熵編碼模塊的仿真輸出結(jié)果如圖10所示。
通過(guò)觀察熵編碼的仿真輸出結(jié)果與AVS參考軟件的輸出結(jié)果是一致的,從而驗(yàn)證了本設(shè)計(jì)的功能。
2.2 硬件實(shí)現(xiàn)結(jié)果
硬件模塊采用Verilog HDL硬件描述語(yǔ)言,實(shí)現(xiàn)了AVS熵編碼模塊的硬件設(shè)計(jì),使用Quartus II 8.0進(jìn)行綜合與仿真,目標(biāo)器件是Cyclone II系列的EP2C35F672C8。結(jié)果表明約消耗38K邏輯門(mén),工作頻率約為120 MHz。在所有量化系數(shù)有50%不為零的情況下(實(shí)際中不為零的量化系數(shù)所占比例遠(yuǎn)低于50%),完成一個(gè)8×8塊的數(shù)據(jù)編碼所需的時(shí)鐘周期為48,即所需時(shí)間為4×10-7 s。對(duì)于高清編碼(1 080p,30 f/s,視頻格式4:2:2),要求完成一個(gè)8×8塊所需時(shí)間為5×10-7 s,因此完全滿足高清編碼的要求。
2.3 仿真分析
本設(shè)計(jì)的整體仿真結(jié)果如圖11所示。
從圖11中可以看出,本設(shè)計(jì)一個(gè)時(shí)鐘內(nèi)讀出4個(gè)量化數(shù)據(jù)Out0~Out3,并且根據(jù)Out0~Out3中非零個(gè)數(shù)完成游程編碼,完成了本文中的并行zig-zag掃描的設(shè)計(jì)目標(biāo);碼表切換、組合邏輯查找和指數(shù)哥倫布編碼按照本文設(shè)計(jì)的流水線結(jié)構(gòu)進(jìn)行。此外,碼長(zhǎng)確定器的輸出Length正確,完成了本文中碼長(zhǎng)確定器的設(shè)計(jì)目標(biāo),可直接從讀出的碼字進(jìn)行位數(shù)的判斷。
本文采用組合邏輯進(jìn)行碼表查找,設(shè)計(jì)了碼長(zhǎng)確定器,節(jié)省了硬件資源;采用流水線設(shè)計(jì)和并行zig-zag掃描,加快了熵編碼的處理速度,編碼性能達(dá)到了高清視頻編碼的要求,對(duì)AVS高清視頻編碼芯片設(shè)計(jì)具有一定的參考意義。
參考文獻(xiàn)
[1] AVS工作組.信息技術(shù)先進(jìn)音視頻編碼:視頻[M].北京:中國(guó)標(biāo)準(zhǔn)出版社,2006.
[2] 李文軍,王祖強(qiáng),徐輝.基于FPGA的AVS幀內(nèi)預(yù)測(cè)電路設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2013,39(8):50-53.
[3] 劉寧.基于DSP的DCT變換和量化技術(shù)研究[D].浙江:浙江大學(xué),2007.
[4] Wang Qiang,Zhao Debin,Gao Wen.Context-based 2D-VLC entropy coder in AVS video coding standard[J].Journal of Computer Science and Technology,2006,21(3):315-322.
[5] Xu Long,Deng Lei,Ji Xingyang,et al.Hardware architecture for AVS entropy encoder[C].Consumer Electronics (ICCE),2008.
[6] 劉錦陽(yáng).基于FPGA的AVS實(shí)時(shí)高清視頻編碼器的研究與實(shí)現(xiàn)[D].上海:上海大學(xué),2009.
[7] 黃玄,陳杰,李霞,等.AVS高清視頻變長(zhǎng)解碼器算法與電路實(shí)現(xiàn)[J].微電子學(xué)與計(jì)算機(jī),2009,26(1):76-80.
[8] 周小龍,王祖強(qiáng),魏先政.AVS及H.264雙??勺冮L(zhǎng)解碼器設(shè)計(jì)[J].計(jì)算機(jī)工程,2012,38(12):222-224.
[9] 王小東.AVS視頻編碼器的熵編碼與插值部分的FPGA設(shè)計(jì)與實(shí)現(xiàn)[D].濟(jì)南:山東大學(xué),2011.
[10] 白玉婷,張剛.AVS熵編碼的FPGA實(shí)現(xiàn)[J].軟件,2012,33(2):102-104.