Hardmard 变换
阿达马(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 变换的更多相关文章
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- Hilbert-Huang Transform(希尔伯特-黄变换)
在我们正式开始讲解Hilbert-Huang Transform之前,不妨先来了解一下这一伟大算法的两位发明人和这一算法的应用领域 Section I 人物简介 希尔伯特:公认的数学界“无冕之王”,1 ...
- 【Win 10 应用开发】三维变换
所谓三维变换,其实是在二维平面上产生三维的视觉效果.前面老周简单提了一下透视效果,如果透视效果不能满需求,那可以考虑用三维变换. UIElement类有一个属性叫Transform3D,它定义的类型为 ...
- CSS3之3d变换与关键帧
3d变换是在transform基础上实现的 transform-style:preserve-3d; 建立3d空间 perspective:; 景深(设置用户看的距离) perspective-ori ...
- 纯CSS3实现多层云彩变换飞行动画
查看效果:http://hovertree.com/texiao/css3/4/效果2 效果图: 代码如下: <!doctype html> <html lang="zh& ...
- CSS3之过渡及2D变换
transition过渡 transition-duration:; 运动时间 transition-delay:; 延迟时间 transition-timing-function:; 运动形式 ea ...
- 为什么FFT时域补0后,经FFT变换就是频域进行内插?
应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...
- 相机变换与Ray-Casting
p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify; orphans: 0; widows ...
- 关于CSS3的小知识点之2D变换
transition过渡 transition-duration:; 运动时间 transition-delay:; 延迟时间 transition-timing-function:; 运动形 ...
随机推荐
- webix源码阅读
最近在用webix,需要一个类似九宫格的监控界面.自带的控件里没有,于是萌生出做一个Custom Component的需求.不过webix关于自定义控件的文档比较少,官方只有一篇<Creatin ...
- JavaScript基础--DOM对象加强篇(十四)
1.document 对象 定义:document对象代表的整个html文档,因此可以去访问到文档中的各个对象(元素)document重要的函数 1.1 write 向文档输出文本或js代码 1.2 ...
- CloseableHttpResponse的使用
*************************** *这篇随手弄出来了,很急躁,有空再改 *************************** 基本逻辑是: 1.定义一个客户端 2.定义一个方法 ...
- Caffe 源碼閱讀(二) SyncedMemory.hpp
1. to_cpu 數據由現存同步到內存 2. to_gpu 數據由內存同步到顯存 3. cpu_str_ 內存指針 4. gpu_str_ 顯存指針 5. size_ 數據大小 6. own_cpu ...
- C# 代码示例_结构/数组/枚举...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 关于项目使用可配置的properties 文件的实现
maven项目在项目install的时候配置如下 注意value的\ 之后利用spring3.0 以后的读取properties 配置如下 然后我们就可以在setter方法 ...
- Sublime Text 3安装插件指南
Sublime Text已经很用得很广泛,一般普通的功能已经够用,加入一些插件能些许加快开发. 安装 Package Control 有了插件控制器Package Control安装起来就很轻松了. ...
- 通过printf设置Linux终端输出的颜色和显示方式
转载自:http://www.cnblogs.com/clover-toeic/p/4031618.html 在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出 ...
- NSDictionary读取数据类型异常问题.
起因:做网络交互时,经常会使用JSON作为数据的承载体,本来是件好事,但是用多了,发现iOS侧偶尔会出现异常,几经比较发现是服务器给的数据有问题,该给INT的给按照STR给了,服务器能做动态更新,可客 ...
- hdu 4348 To the moon
题意:n个数 m次操作 操作分别为 C l r d: 把区间[l, r] 加 d Q l r : 查询区间[l, r]的和 H l r t: 查询时间t的时候[l, r]的和 B t: 回到时间t 思 ...
