老哥学习网 - www.lg9.cn 2024年05月16日 14:35 星期四
当前位置 首页 >人生感悟 >

熵编码 [AVS熵编码的FPGA实现]

发布时间:2019-01-17 19:43:17 浏览数:

  摘 要:本文从数字音视频编解码技术标准(AVS,Audio Video coding Standard)的熵编码原理出发,对算法模块进行分析,提出了一种使用较少存储空间来存储码表的方法,并结合算法特点给出了现场可编程门阵列(FPGA,Field-Programmable Gate Array)的实现方法。本设计中将码表查询、切换和指数哥伦布编码合并为一个流水线单元并行处理,节省了大量存储中间结果所需的空间;并将各任务并行执行,加快了处理速度。利用FPGA开发工具ISE10.1和仿真工具ModelSim SE 6.2b,完成了AVS熵编码的FPGA设计与实现。
  关键词:FPGA;AVS;熵编码;指数哥伦布编码。
  中图分类号:TN919.8 文献标识码:a DoI: 10.3969/j.issn.1003-6970.2012.02.035
  Implementation of AVS Entropy Encoding Based on FPGA
  BaI Yuting, ZHaNG Gang(Taiyuan University of Technology (Taiyuan), College of Information Engineering, Taiyuan 030024 China)
  【Abstract】a profound analysis of the entropy encoding algorithm for aVS (audio Video coding Standard) is performed based on the principle of entropy encoding method. this paper presents a method of using less rom to save data in coding table, and gives a realization method based on FPGA (Field-Programmable Gate Array) according to the algorithm characteristics. Coding table query, coding table switch and golomb coding are combined into a pipeline unit, saving a lot of intermediate memories. The parallel execution of entropy encoding task resultes in higher processing speed. Using the fPGa development tool ISe10.1 and ModelSim Se 6.2b, entropy encoding of aVS based on fPGa can be implemented.
  【Key words】fPGa; aVS; entropy encoding; Golomb coding.
   0 引 言
  AVS标准是中国数字音视频编解码技术标准工作组制定的具有自主知识产权的视频编码标准,性能高于MPEG2标准与H.264标准相当[1]。
  AVS视频压缩标准采用了一系列高运算量技术来达到高效率的视频编码。其中熵编码模块运算复杂,耗时较大。FPGA平台拥有强大的逻辑资源和寄存器资源,其并行执行的硬件实现方式可以应对设计中大量的高速电子线路设计需求。本文利用FPGA并行执行特点,合理规划熵编码各模块,完成了AVS熵编码FPGA平台设计与实现。
   1 AVS熵编码原理
  AVS DCT变换系数经量化后,能量集中在低频直流区域,高频区域数值较小,大部分为0。为进一步压缩码率AVS采用2D_VLC熵编码[2]。
  熵编码之前,要进行zig-zag扫描和游程编码。AVS对level数组扫描一次,统计非零系数的个数;初始化选择子表 tablenum=0;编码时从最后一个level和run读入,每次读入一组,最后一组为EOB标志位。
  symbol2D为run、level对应输出的二维变长编码值。当level的绝对值小于27,并且run的绝对值小于26时,在当前AVS_2DVLC_INTRA的子表内查询相应码字。如果symbol2D非负,说明这是正常情况下的编码。如果查得symbol2D为负值,或是level和run的绝对值超出码表的范围,按照逃逸事件编码处理。逃逸事件是将run和level分别进行编码的。如果是对EOB进行编码,则结束了整个块系数的熵编码。
  每编码完一个(level,run)序列,根据当前level的绝对值来确定下一对序列查表时所用的码表号。
   2 AVS熵编码器设计
  熵编码主要分为zig-zag扫描、游程编码、码字计算、码表切换、指数哥伦布编码和码流输出共6个子模块[3]。整个熵编码部分需要3块ram,2块rom存储器。ram1接收量化系数矩阵,经zig-zag扫描后的(run,level)对存储在ram2中,
  
  图1 熵编码流程图
  Fig.1 The flow chart of entropy encoding ram3暂存指数哥伦布编码后数据;rom1用于存放优化后的码表,rom2用于存放逃逸事件中用到的RefAbsLevel_T。
  zig-zag扫描和游程编码不是针对单一的量化系数,是以整个8*8子块为单位的进行的,只能选择顺序执行。码字计算包括码表查询和level是否为负值等相关的判断,码表切换可以与码表查询之后的运算并行执行[4];在第二对(run,level)查询二维变长编码值时,同时对第一个码字进行指数哥伦布编码。直至所有(run,level)对完成指数哥伦布编码,码流以字节为单位输出,如图2所示。
  
  图2 熵编码的流水线结构
  Fig.2 The pipeline structure of entropy encoding
   2.1 zig-zag扫描
  在进行正确的编码操作前,需要将量化后的数据进行zigzag扫描。接收量化系数时进行顺序重排,使数据按照zigzag后的顺序依次存放在ram1(16bit*64)中。8*8块中的量化系数按照图3所示存入相应的地址中,仿真过程如图4所示。
   2.2 游程编码
  游程run和幅值level按照扫描的先后顺序依次存入数组,作为熵编码的输入数据;使用多个变长码表对这些(run, level)对进行编码。从ram1中依次读出扫描后的数据,判断是否为非零系数。若为非零系数,当前值赋给level,run保持不变,并成对存储在ram2中;否则level值保持不变,run的值加1。编码一组(run, level)对需要三个周期(rle_cnt)。图5所示为游程编码过程中需要完成的任务和并行实现方式。图6为游程编码部分的仿真结果。
   2.3 码表优化、查询及切换
  帧内亮度块的熵编码过程,需要调用7张变长编码表,每张表需26*27字节存储空间,其中有效码字(非负值)仅有30个,码表中存在大量的逃逸标志位-1。
  FPGA高速存储资源有限,为节省存储空间,按照7个码表的顺序依次将每个码表中的有效值进行重新排序,存储到rom1[5]。为减少判断周期数,根据码表分布特点,选择level值或run值设置偏移量来查询码字的地址,前4张表使用run值作为偏移量,后三张表使用level值作为偏移量。每个码表有30个有效码字,码表的首地址只需将码表序号乘以30就可以。优化后,存储码字占用的空间仅是原来的4.3%,同时也方便查找。
  在VLC0_Intra中,run=0和level=0没有对应的二维变长编码值,因此rom1中地址是否为0可以作为区分逃逸事件和非逃逸事件的标志。查表AVS_2DVLC_INTRA的子表tablenum,若利用偏移量没有找到相应码字,将addra1置0,作为逃逸事件编码。逃逸事件是将一对run和level分别编码。码表切换主要是比较当前level的绝对值和跳转门限作比较,
  
  图3 量化系数的存放地址Fig.3 The storage address of quantization coefficient
  
  图4 zig-zag扫描子模块的仿真结果
  Fig.4 The simulation result of zig-zag scan sub-module
  可以分为五种情况,由case语句实现。
   2.4 指数哥伦布编码
  哥伦布编码主要是用循环来确定哥伦布的层数和长度,会占用大量的周期数,大大降低了硬件平台上的编码速度。本设计使用case语句对symbol2D进行判断,确定码字结构。由变长编码所固有的伸缩特性,编码输出的码字长度存在不一致性。VHDL语言中信号的位宽是固定的,于是code_num选用最长的位宽,码字长度另选变量numbits表示。
  每完成一次指数哥伦布编码,将code_ num和numbits存放在ram3中,直至所有(run,level)对编码结束。若是逃逸事件,有两组值写到ram3中,symbol2D和escape_level_diff。
  
   2.5 码流输出
  熵编码将各种信息以二进制的形式逐个比特写到码流,最终以字节为单位封装,这样会增加运算的时间,使得编码的效率极低。本文针对FPGA平台的特点对写码流作了优化,即以一个字节为单位写码流。
  由于码字长度的不确定性,写入码字的起始位置也是不确定的[6]。需要根据前一个码字的输出和相应的码长剩余信号对码字进行组合,得到最终的码流。设置一个变量w作为码字输出的缓存,t是w中码字的长度。每当t大于等于8时,输出码流,同时t减去8;否则继续读入下一个已编码的code_num和码字长度numbits,将code_num的低numbits位写到w中。这一部分由一个简单的状态机实现,如图7所示。最终输出的码流如图8所示。
   3 实验结果及分析
  本文使用VHDL设计并优化实现AVS熵编码器,并借助ModelSim SE 6.2b对其进行仿真。通过输入不同的量化系数矩阵观察仿真波形,输出的码流信息与AVS参考软件输出的结果一致。选择器件类型为virtex2p时,综合结果如图9所示。
  
  
  图7 码流输出的状态转移图Fig.7 The state transition diagram of bit stream output
  
  图8 码流输出的仿真结果Fig.8 The simulation result of bit stream output sub-module
  
  图9 仿真综合结果Fig.9 The result of synthesis and simulation
   4 结 论
  本文通过对码表存储结构和查询方式的改进,使得有效码字相对集中,提高了查表效率,并且节省了大量的码表存储空间。利用FPGA的特点,子模块最大程度地并行实现,提高 了编码速度。经仿真验证,本设计正确的且资源利用效率高。时钟最高频率达到115MHz,可用于高分辨率实时AVS编码器中。
  参考文献
  [1] AVS工作组, GB/T20090.2-2006.信息技术先进音视频编码第二部分:视频[S]. 北京:中国标准化出版社,2006.
  [2] 田晓华. AVS视频编码中整数变换与熵编码研究[D]. 武汉:华中科技大学,2004.
  [3] 毕厚杰. 视频压缩编码标准--H.264/AVC[M]. 北京:人民邮电出版社,2005.
  [4] 毛讯. 高速视频解码器设计研究[D]. 杭州:浙江大学,2001.
  [5] 江静. AVS熵编码技术研究及其在DSP上的实现[D]. 武汉:华中科技大学,2008.
  [6] 卫丽霞. 开源xAVS项目的研究与优化[D]. 太原:太原理工大学,2011.

推荐访问:编码 AVS FPGA

相关文章:

Top