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