首页 > 范文大全 > 正文

H.264整数DCT的FPGA实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇H.264整数DCT的FPGA实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:h.264整数dct变换算法有助于减少计算复杂度,提高编码速度,进一步提高视频或图像的压缩效率。分析H.264整数DCT变换的快速算法及其实现原理,并提出一种用来具体实现一个4×4块的DCT变换的结构;同时给出用VHDL语言实现4×4块DCT变换的内部模块的源代码和仿真波形。仿真结果表明用该算法可快速实现一个4×4块的整数DCT变换。提出一种切实可行的用于H.264整数DCT变换的结构, 该结构可完全用硬件电路快速实现;对于用fpga实现H.264整数DCT变换做了一次实践性的尝试,对深入理解H.264整数DCT变换及其算法的具体实现具有一定的实践意义。

关键词:H.264;宏块;整数DCT;FPGA;VHDL

中图分类号:TP391文献标识码:B

文章编号:1004-373X(2008)24-158-03

Implementation of Integer DCT in H.264 on FPGA

ZHU Nankun,HUANG Shitan

(Xi′an Micro-electronics Technology Institute,Xi′an,710075,China)

Abstract:The algorithm of integer transform in H.264 is good to reduce the complexities in computations and it is good to improve the speed in encoder,it can greatly improve the compress rate of videos or images from this. This article analyses the fast algorithm and principle of the integer in H.264,and privides an specific architecture which to be used to implement a 4×4 DCT transform;and gives the source codes and simulated waves in 4×4 DCT transform which implemented in VHDL.The result of simulation shows that the algorithm can fast implement a 4×4 DCT transform.The new thoughts of this article lie that it privides a practical architecture used in integer DCT transform in H.264.It can be implemented quickly in circuit through hardware, and it is a practical taste in the implemention of integer DCT transform in H.264 on FPGA.It is good to understand the integer DCT transform in H.264 deeply,it also has certain practical meanings in the specific implemention in integer DCT transform in H.264.

Keywords:H.264;Macro Block;integer DCT;FPGA;VHDL

1 引 言

新一代视频压缩编码标准在对图像进行压缩时与以往的视频编码标准相同,同样采用基于块的变换编码。H.264标准中使用4×4的整数DCT变换作为残差宏块的基本变换,这种变换的对象是经过运动补偿预测或者帧内预测后的包含残差数据的4×4块。这类变换是基于DCT变换,但又不同于DCT。由于DCT变换是实数,量化时需对系数进行四舍五入,从而影响了运算的精度。

同时,传统的DCT存在不匹配问题,产生参考帧的偏移,直接影响到重建图像的质量。H.264对图像或预测残差采用了4×4整数离散余弦变换技术,避免以往标准中使用的通用8×8离散余弦变换、逆变换经常出现的失配问题。同时采用整数DCT变换技术,可有效地减少

计算量,同时不损失图像的准确度。

2 H.264整数DCT变换

一维N点离散余弦变换(DCT)可以表示为:

yk=Ck∑N-1n=0xncos(2n+1)kπ2N(1)

其中,xn是输入时域序列中的第n项;yk是输出频域序列中的第k项;系数Ck=1/N,k=0;Ck=2/N,k=1,2,…,N-1。

二维N×N图像块的DCT可以理解为先对图像块的每行进行一维DCT,然后对经行变换的块每列再应用一维DCT。可以表示为:

Ymn=CmCn∑N-1i=0∑N-1j=0Xijcos(2j+1)nπ2Ncos(2i+1)mπ2N(2)

其中,Xij是图像块X中第i行第j列图像或其残差值;Ymn是变换结果矩阵Y相应频率点上的DCT系数。可以用矩阵表示:

Y=AXAT(3)

其中,N×N变换矩阵A中的系数:

Aij=Cicos(2j+1)iπ2N(4)

H.264对4×4的图像块(亮度块或Cr,Cb色度块)进行操作,则相应的4×4 DCT变换矩阵A为:

A=12cos(0)12cos(0)12cos(0)12cos(0)

1/2cos(π/8)1/2cos(3π/8)1/2cos(5π/8)1/2cos(7π/8)

1/2cos(2π/8)1/2cos(6π/8)1/2cos(10π/8)1/2cos(14π/8)

1/2cos(3π/8)1/2cos(9π/8)1/2cos(15π/8)1/2cos(21π/8)〗

=1/21/21/21/2

1/2cos(π/8)1/2cos(3π/8)-1/2cos(3π/8)-1/2cos(π/8)

1/2-1/2-1/21/2

1/2cos(3π/8)-1/2cos(π/8)1/2cos(π/8)-1/2cos(π/8)〗(5)

设a=1/2,b=1/2cos(π/8)及c=1/2・cos(3π/8),则:

A=aaaa

bc-cb

a-a-aa

c-bb-c(6)

A中的a,b和c是实数,而图像块X中的元素是整数。对实数的DCT,由于在解码端的浮点运算精度问题,会造成解码后的数据的失配,进而引起漂移。H.264较其他图像编码使用了更多的预测过程,甚至内部编码模式也依赖于空间预测。因此,H.264对预测漂移是十分敏感的。为此,H.264对4×4 DCT中的A进行了改造,采用整数DCT技术,可有效地减少计算量,同时不损失图象的准确度。式(3)可以等效为:

Y=(CXCT)E=

1111

1d-d-1

1-1-11

d-11-d〗X111d

1d-1-1

1-d-11

1-11-d〗

a2aba2ab

abb2abb2

a2aba2ab

abb2abb2〗(7)

其中,d=c/b,符号“”表示(CXCT)结果中的每个元素乘以矩阵E中对应位置的系数值的运算。为简化运算,取d=0.5。同时为了保持变换的正交性,对b进行修正,取b=2/5。对矩阵C中的第2行和第4行,以及矩阵CT中的第2列和第4列元素乘以2,相应地改造矩阵E为Ef,以保持式(7)成立,得到:

Y = (Cf XCTf )Ef =

1111

21-1-2

1-1-11

1-22-1〗X1211

11-1-2

1-1-12

1-21-1〗

a2ab/2a2ab/2

ab/2b2/4ab/2b2/4

a2ab/2a2ab/2

ab/2b2/4ab/2b2/4〗(8)

其中,运算“”对每个矩阵元素只进行1次乘法,同时它将被归纳到量化运算中。这样,(Cf XCTf )中只剩下整数的加法、减法和移位(乘以2)运算。H.264将DCT中“Ef”运算的乘法融合到后面的量化过程中,实际的DCT输出为:W=Cf XCTf。将该矩阵的乘法改造成2次一维整数DCT变换,并且每次的一维整数DCT可以采用叠形快速算法,以节省计算时间,如图1所示。

图1 DCT的叠形快速算法

3 H.264整数DCT变换的FPGA实现

图2为用FPGA实现H.264整数DCT变换的框图。以上的每个行变换单元仅处理1行数据,每个列变换单元仅处理1列数据;由于在从行变换到列变换中间经过1个矩阵转置过程所以在给列变换单元输入数据时,输入的数据需要重新组合后再送给每个列变换单元。

图2 用FPGA实现H.264整数DCT变换的框图

数据输入为经过运动补偿预测或者帧内预测后的包含残差数据的4×4块。共16个数据,按顺序送给每个行变换单元,每个数据用8位二进制表示,即表示输入块的相应像素点,每个像素点范围为0~255;由于在进行行变换以后的输入行单元的数据进行了8次加法(包括减法)和2次移位运算,所以经过数据组合后输入到列变换单元的数据范围发生了改变;所以为防止该输入数据溢出将它定义为16位,经列变换后即为一个残差数据的4×4块经过整数DCT变换的结果。其输出数据不会超过16位,故用16位定义不会溢出。因为行列变换各有4个变换单元所以处理1个残差数据的4×4块后需至少等待2个时钟周期,之后读取下一个4×4块。行变换单元VHDL描述如下:

library IEEE;

use IEEE.STD_LOGIC_1164.all;

use IEEE.STD_LOGIC_ARITH.all;

use IEEE.STD_LOGIC_SIGNED.all;

entity dct is

PORT(data0,data1,data2,data3:IN

STD_LOGIC_VECTOR(7 DOWNTO 0);

out0,out1,out2,out3:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));

end dct;

architecture comp of dct is

SIGNAL temp0,temp1:STD_LOGIC_

VECTOR(15 DOWNTO 0);

SIGNAL temp2,temp3:STD_LOGIC_

VECTOR(14 DOWNTO 0);

SIGNAL temp4,temp5,temp6:STD_LOGIC_

VECTOR(8 DOWNTO 0);

BEGIN

PROCESS(temp0,temp1,temp2,temp3,data0,data1,data2,data3,temp5,temp6,temp4)

BEGIN

temp4

data3)-(data1(7)&data1)-(data2(7)&data2);

out2

temp4(7)&temp4(7)&temp4(7)&

temp4(7)&temp4);

temp5

data2);

temp0

temp6

data3);

temp1

temp2

temp3

out1

out3

END PROCESS;

END comp;

仿真波形如图3所示,该仿真时输入数据为:1,-1,1,1。输出为:2,-2,2,4;经验证正确。列变换单元VHDL描述可参考行变换单元代码。一个4×4块的DCT变换的代码可以直接调用行、列变换单元模块来实现。该设计可快速实现H.264整数DCT变换。

图3 仿真波形图

4 结 语

为了实现H.264视频压缩的高压缩率,必须进行大量的计算,而整数DCT变换计算量大,用FPGA实现可大大加快其处理速度。以上实现可用并行计算能加速整数DCT变换的处理效率。

参考文献

[1]Wiegand T,Sullivan G J,Bjontegaard G,et al.Overview of H.264/AVC Video Coding Standard.IEEE Trans.Circuits Syst.Video Technol.,2003(13):560-576.

[2]Draft ITU-T Recommendation and Final Draft International Standard of Joint Video Specification(ITU-T Rec.H.264/ISO/IEC 14 496-10 AVC.in Joint Video Team(JVT) of ISO/IEC MPEG and ITU-T VCEG,JVTG050,2003.

[3]Schafer Ralf,Wiegand Thomas,Schwarz Heiko.The Emerging H.264/AVC Standard EBU Technical Review.2003.

[4]Mathias Wien.Variable Block-Size Transforms for H.264/AVC.IEEE Trans.Circuit Syst.Video Technol.,2003,13:604-613.

[5]毕厚杰.多媒体信息的传输与处理.北京:人民邮电出版社,1999.

[6]朱秀昌.数字图像处理与图像通信.北京:北京邮电大学出版社,2002.

[7]陈传波,金先级.数字图像处理.北京:机械工业出版社,2004.

[8]毕厚杰.新一代视频压缩编码标准H.264/AVC.北京:人民邮电出版社,2005.

[9]侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计.西安:西安电子科技大学出版社,1997.

[10]赵俊超.集成电路设计VHDL教程.北京:北京希望电子出版社,2002.

[11]李玉山.电子系统集成设计技术.北京:电子工业出版社,2002.

作者简介 朱南坤 男,1979年出生,安徽合肥人,硕士。研究方向为数字图像处理及视频压缩。

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文