HEVC中哈达玛变换计算SATD的向量指令优化

摘要

在HEVC中,有一种率失真的快速计算方法,用到的是SATD(Sum of Absolute Transformed DIfference),具体来说就是残差矩阵经过哈达玛变换,得到系数矩阵,绝对值求和得到SATD值。x265中4x4尺寸对应的函数就是satd_4x4,该函数提供x86的向量指令优化,本文就介绍向量优化后,该算法的结构。

正文

整个satd_4x4过程总的来说可以用一个公式来表示

S A T D = ∑ ∑ ∣ H X H ∣ SATD = \sum\sum|HXH| SATD=HXH

具体一点的话就是

H X H = 1 4 { [ 1 1 1 1 1 − 1 1 − 1 1 1 − 1 − 1 1 − 1 − 1 1 ] [ r 00 r 01 r 02 r 03 r 10 r 11 r 12 r 13 r 20 r 21 r 22 r 23 r 30 r 31 r 32 r 33 ] [ 1 1 1 1 1 − 1 1 − 1 1 1 − 1 − 1 1 − 1 − 1 1 ] } HXH = \frac{1}{4} \begin{Bmatrix}\begin{bmatrix} 1&1&1&1\\ 1&-1&1&-1\\ 1&1&-1&-1\\ 1&-1&-1&1\\ \end{bmatrix}\begin{bmatrix} r_{00}&r_{01}&r_{02}&r_{03}\\ r_{10}&r_{11}&r_{12}&r_{13}\\ r_{20}&r_{21}&r_{22}&r_{23}\\ r_{30}&r_{31}&r_{32}&r_{33}\\ \end{bmatrix}\begin{bmatrix} 1&1&1&1\\ 1&-1&1&-1\\ 1&1&-1&-1\\ 1&-1&-1&1\\ \end{bmatrix} \end{Bmatrix} HXH=411111111111111111r00r10r20r30r01r11r21r31r02r12r22r32r03r13r23r331111111111111111

左边是列变换,右边是行变换。理论知识差不多就是这样,具体怎么得到的就需要参考专业知识了,这里就不多做介绍了。

接下来看具体的实现,具体用什么指令这里也不详细讲了,这里讲述的向量是128位的。satd_4x4该函数得到的参数是

(const pixel *pix1, intptr_t stride_pix1, const pixel *pix2, intptr_t stride_pix2)

两个源矩阵和各自的步长。
这里规定几个表述方法 r o w n row_{n} rown 表示第n行, c o l u m n m column_{m} columnm 表示第m列, v(x)i(y)就表示有x个y位数,且为有符号表示, v(x)u(y)就表示无符号。

首先就是基本的数据装载过程,经过访存、插入、复制得到

v16i8 p i x 1 _ 0 pix1\_0 pix1_0 = { r o w 1 , r o w 1 , r o w 0 , r o w 0 row_{1}, row_{1}, row_{0}, row_{0} row1,row1,row0,row0}
v16i8 p i x 1 _ 1 pix1\_1 pix1_1 = { r o w 3 , r o w 3 , r o w 2 , r o w 2 row_{3}, row_{3}, row_{2}, row_{2} row3,row3,row2,row2}

pix1和pix2各有一对,同样的结构。
然后使用了一个常量数据

v16i8 con = {-1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1}

相邻位置与上面的数据点乘, 举例来说就是

p i x 1 _ 0 [ 0 ] ∗ c o n [ 0 ] + p i x 1 _ 0 [ 1 ] ∗ c o n [ 1 ] pix1\_0[0] * con[0] + pix1\_0[1] * con[1] pix1_0[0]con[0]+pix1_0[1]con[1]

以此类推,得到一个v8i16的数据类型,结构对于每一行都一样,列结构表示为。

v8i16 pix = { c o l 2 − c o l 3 , c o l 0 − c o l 1 , c o l 2 + c o l 3 , c o l 0 + c o l 1 , . . . col_{2} - col_{3}, col_{0} - col_{1}, col_{2} + col_{3}, col_{0} + col_{1}, ... col2col3,col0col1,col2+col3,col0+col1,...}

剩下的四个就是另一行,结构相同。然后将所有数据 pix1 - pix2,得到残差(residual),两个数据, v 8 i 16   r e s 0 , r e s 1 v8i16\ res0, res1 v8i16 res0,res1。行结构和上面一样分别是

r e s 0 = { r o w 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值