阿达马(Hadamard)矩阵是由+1和-1元素构成的正交方阵。阿达马变换多被用来计算SATD(一种视频残差信号大小的衡量)。

这里介绍三个内容,1. SATD 2. H264中阿达马的应用 3. 阿达马变换的构建

1. SATD

SATD是一种视频残差信号大小的衡量标准。

SATD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。

SATD(Sum of Absolute Transformed Difference)即hadamard变换后再绝对值求和。

2. 在H264中使用4阶和8阶的阿达马变换来计算SATD,变换矩阵为:

当计算4x4块的SATD时,先使用下面的方法进行二维的阿达马变换:

然后计算所有系数绝对值之和并归一化。

类似的,当计算8x8块的SATD时,先使用下面的方法进行二维的Hadamard变换:

然后计算所有系数绝对值之和并归一化。

3. 阿达马变换的构建

阿达马变换转换主要型式为  点的转换矩阵,其最小单位矩阵为 2x2 的阿达马变换矩阵,以下分别为二点、四点与如何产生  点的阿达马变换转换步骤。

  • 二点阿达马变换转换:

  • 产生  点阿达马变换的步骤:

步骤一: 

步骤二: 根据正负号次序 (Sign change,正负号改变次数) 将矩阵 (Matrix) 内的列向量座顺序上的重新排列。

Hadmard 的 4x4变换,不难理解

 void hadamard4x4(int **block, int **tblock)
{
int i;
int tmp[];
int *pTmp = tmp, *pblock;
int p0,p1,p2,p3;
int t0,t1,t2,t3; // Horizontal
for (i = ; i < BLOCK_SIZE; i++)
{
pblock = block[i];
p0 = *(pblock++);
p1 = *(pblock++);
p2 = *(pblock++);
p3 = *(pblock ); t0 = p0 + p3;
t1 = p1 + p2;
t2 = p1 - p2;
t3 = p0 - p3; *(pTmp++) = t0 + t1;
*(pTmp++) = t3 + t2;
*(pTmp++) = t0 - t1;
*(pTmp++) = t3 - t2;
} // Vertical
for (i = ; i < BLOCK_SIZE; i++)
{
pTmp = tmp + i;
p0 = *pTmp;
p1 = *(pTmp += BLOCK_SIZE);
p2 = *(pTmp += BLOCK_SIZE);
p3 = *(pTmp += BLOCK_SIZE); t0 = p0 + p3;
t1 = p1 + p2;
t2 = p1 - p2;
t3 = p0 - p3; tblock[][i] = (t0 + t1) >> ;
tblock[][i] = (t2 + t3) >> ;
tblock[][i] = (t0 - t1) >> ;
tblock[][i] = (t3 - t2) >> ;
}
} void ihadamard4x4(int **tblock, int **block)
{
int i;
int tmp[];
int *pTmp = tmp, *pblock;
int p0,p1,p2,p3;
int t0,t1,t2,t3; // Horizontal
for (i = ; i < BLOCK_SIZE; i++)
{
pblock = tblock[i];
t0 = *(pblock++);
t1 = *(pblock++);
t2 = *(pblock++);
t3 = *(pblock ); p0 = t0 + t2;
p1 = t0 - t2;
p2 = t1 - t3;
p3 = t1 + t3; *(pTmp++) = p0 + p3;
*(pTmp++) = p1 + p2;
*(pTmp++) = p1 - p2;
*(pTmp++) = p0 - p3;
} // Vertical
for (i = ; i < BLOCK_SIZE; i++)
{
pTmp = tmp + i;
t0 = *pTmp;
t1 = *(pTmp += BLOCK_SIZE);
t2 = *(pTmp += BLOCK_SIZE);
t3 = *(pTmp += BLOCK_SIZE); p0 = t0 + t2;
p1 = t0 - t2;
p2 = t1 - t3;
p3 = t1 + t3; block[][i] = p0 + p3;
block[][i] = p1 + p2;
block[][i] = p1 - p2;
block[][i] = p0 - p3;
}
}

Hadmard 变换和反变换(JM18.6)

在JM18.6当中有用到4x2的Hadmard变换。

Hardmard 变换的更多相关文章

  1. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  2. Hilbert-Huang Transform(希尔伯特-黄变换)

    在我们正式开始讲解Hilbert-Huang Transform之前,不妨先来了解一下这一伟大算法的两位发明人和这一算法的应用领域 Section I 人物简介 希尔伯特:公认的数学界“无冕之王”,1 ...

  3. 【Win 10 应用开发】三维变换

    所谓三维变换,其实是在二维平面上产生三维的视觉效果.前面老周简单提了一下透视效果,如果透视效果不能满需求,那可以考虑用三维变换. UIElement类有一个属性叫Transform3D,它定义的类型为 ...

  4. CSS3之3d变换与关键帧

    3d变换是在transform基础上实现的 transform-style:preserve-3d; 建立3d空间 perspective:; 景深(设置用户看的距离) perspective-ori ...

  5. 纯CSS3实现多层云彩变换飞行动画

    查看效果:http://hovertree.com/texiao/css3/4/效果2 效果图: 代码如下: <!doctype html> <html lang="zh& ...

  6. CSS3之过渡及2D变换

    transition过渡 transition-duration:; 运动时间 transition-delay:; 延迟时间 transition-timing-function:; 运动形式 ea ...

  7. 为什么FFT时域补0后,经FFT变换就是频域进行内插?

    应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...

  8. 相机变换与Ray-Casting

    p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify; orphans: 0; widows ...

  9. 关于CSS3的小知识点之2D变换

        transition过渡 transition-duration:; 运动时间 transition-delay:; 延迟时间 transition-timing-function:; 运动形 ...

随机推荐

  1. CsvReader,CsvWriter的使用以及解决中文乱码

    public void Csv(){ try { String[] stringList; String sourceFilePath = "D:\\111\\前海自身.csv"; ...

  2. c#读取文本文档实践4-读入到list泛型集合计算后写入新文档

    商品 数量 单价英语 66 100语文 66 80数学 66 100化学 66 40物理 66 60 上面截图是要处理的文本文档内容,目的是计算出总价并加在最后一列. 这一篇与上一篇比较类似,目的相同 ...

  3. MySQL高可用之MHA搭建

    测试环境 节点1 172.16.200.231 6666               master         节点2 172.16.200.27 6666 slave1              ...

  4. jQuery.ajax() 函数详解

    jQuery.ajax()函数用于通过后台HTTP请求加载远程数据. jQuery.ajax()函数是jQuery封装的AJAX技术实现,通过该函数,我们无需刷新当前页面即可获取远程服务器上的数据. ...

  5. lightoj1030

    //Accepted 1688 KB 0 ms //http://kicd.blog.163.com/blog/static/126961911200910168335852/ //链接里的例子讲的很 ...

  6. 如何在Kali Linux中搭建钓鱼热点

    文中提及的部分技术可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用! 0×00 实验环境 操作系统:Kali 1.0 (VM) FackAP: easy-creds 硬件:NETGEAR wg ...

  7. php大力力 [042节] 今天做了一个删除功能

    php大力力 [042节] 今天做了一个删除功能 if(isset($_GET['action'])){ if($_GET['action']=="del"){ $sql = &q ...

  8. Ubuntu安装gfortran

    命令行运行 sudo apt-get install gfortran

  9. jq 一些小方法

    js 控制a标签的onclick方法 document.getElementById("a3").onclick = ""; window.document.g ...

  10. linux下locate为什么有时候某些文件

    这与locate命令的工作原理有关.他是通过查询数据库的方式查找文件的.并且数据库每天更新一次.你要找的文件可能没有更新到数据库中. 可以有两种选择: 第一,过一天后再查看一下,应该就会找到了. 第二 ...