文獻(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.