11.6 典型实例21:整数DCT变换的设计与实现
11.6.1 实例的内容及目标
1.实例的主要内容
本节旨在设计实现了视频压缩标准H.264算法中的整数DCT变换部分,帮助读者了解并行流水设计技巧在算法优化中的作用。
2.实例目标
通过本实例,读者应达到以下目标。
· 了解数字域变换的基本原理和用处。
· 掌握DCT和整数DCT变换的变换方法。
· 学习硬件结构设计方法。
· 学习流水线设计方法。
· 编程实现DCT变换。
11.6.2 整数DCT变换的原理
1.DCT简介
H.264是一种图像压缩编码方法,它的变换编码和以前各种标准中的DCT有所不同。以前标准中直接采用DCT的定义进行变换,会带来两个问题。第一,需要进行浮点数操作,从而造成系统设计及运算上的复杂性;第二,由于变换核都是无理数,而有限精度的浮点数不可能精确地表示无理数,再加上浮点数的运算可能会引入舍入误差,这就使得在具体实现时会导致编解码的不匹配(mismatch),即反变换的输出结果和正变换的输入不一致。
为了解决这些问题,H.264采用基于4×4块的整数操作而不是实数运算,使得变换操作仅用整数加减和移位操作就可以完成。这样既降低了设计复杂度,又避免了编解码误匹配,能够得到与4×4 DCT变化类似的编码效果,而由此带来的编码性能的减少微乎其微。
由于变换中无乘法,采用基于提升结构的无乘法二进制DCT(Bin DCT),只包括加法和16位算术移位,这样大大减小了运算复杂度。尤其是对低端处理,减少了乘法运算且保持了整数变换的优点,精确的整数排除了编码器和解码器之间反变换的误匹配,保证了变换的效果。
2.DCT设计原理
我们可以通过各种公式推导出整数DCT正变换的公式。
(11.1)
公式(11.1)中,虽然乘以1/2的操作可以用右移来实现,但这样会产生截断误差,因此,我们将1/2提到矩阵外面,并与右边的点乘合并,得到公式(11.2)。
(11.2)
这就是H.264中所用到的整数变换公式,其变换核仅用加减法(和左移)即可以实现,而后面的点乘操作可以合并到随后的量化过程中去。
H.264中所用到的反DCT变换公式如下:
(11.3)
其中与Y点乘的操作与反量化合并,乘以系数1/2的操作由右移来实现,由于反量化后的结果足够地大,所以这里不会出现截断误差的问题。以上各式中,,。
H.264的整数DCT变换可以分做两步完成:先对需要做变换的矩阵的每一列做一维变换,再对其结果的每一行做一维变换,这个次序也可以反过来,先行后列。这样二维变换就可以用一维变换来实现。在具体实现过程中,为了减少运算量,每一步可以采用蝶型算法,以公式(11.2)的第一步对X的第一列进行一维变换为例,其运算过程如下式所示。
(11.4)
其中为第一列的元素,为滤波结果。由公式(11.4)可见计算有很多重复,如就同时被计算和的公式所使用,所以可以将其暂时保存起来以避免重复计算,对应的蝶型算法如图11.21所示。
从图中可以看见,若按公式(11.4)计算需要进行12次加法、4次乘法。而按图11.19中的蝶型算法仅需8次加法、2次乘法,它利用了运算中的冗余,大大降低了运算量。
11.6.3 实例步骤
1.创建新工程并添加源文件
如图11.22所示,首先创建一个新工程并为工程添加源文件。
2.添加测试文件,并添加激励
如图11.23所示,为工程添加测试文件。
图11.22 创建新工程并添加设计文件 图11.23 添加测试文件
在测试文件中为测试添加激励,如图11.24所示。
图11.24 添加激励
3.使用ModelSim进行仿真
要使用ModelSim对工程进行仿真首先要在计算机上面安装ModelSim软件。安装好以后在ISE 7.1i的菜单里面选择Edit→Preferences,如图11.25所示。
在上面的对话框里面,“Integrated Tools”复选页里面的Model Tech Simulator里面选择modelsim.exe的路径,单击“OK”按钮。
图11.25 设置仿真工具参数
然后再选择菜单里面的View→Refresh,刷新刚才更改的设置,如图11.26所示。
图11.26 刷新设置
刷新后就会看见Process View里面的图标变成Modelsim Simulator的一些功能,如图11.27所示。
图11.27 ModelSim仿真选项
此时双击“Simulate Behavioral Model”就可以对工程进行行为仿真了,如图11.28所示。
图11.28 打开ModelSim进行行为仿真
在ModelSim的波形窗口中观察到的行为仿真结果如图11.29所示。
图11.29 行为仿真结果
11.6.4 小结
本节介绍视频压缩标准H.264算法中的整数DCT变换模块的设计与实现方法,并通过ModelSim软件仿真验证的设计结果。