帧间的SAD和SATD

  1. 函数名:sad
    int sad(const pixel* pix1, intptr_t stride_pix1, const pixel* pix2, intptr_t stride_pix2,int lx, int ly)
    位深为8位的SAD函数

  2. int sad_int16_t(const int16_t* pix1, intptr_t stride_pix1, const int16_t* pix2, intptr_t stride_pix2,int lx, int ly)
    位深为10、12位的SAD函数

  3. 函数名:sad_x3
    函数功能:同时计算3个MV对应的3个SAD值
    通过3个预测的MV找到对应块,使用当前块-对应块获得SAD值,最后选择最小的SAD值对应的MV作为当前块的MV。
    http://blog.csdn.net/cabbage2008/article/details/50612487

  4. 函数名:sad_x4
    sad_x4:同时计算4个MV对应的4个SAD值

为什么要同时进行3组MV或者4组MV的同时计算,应该是为了并行加速或者用于并行能力比较强的处理器,比如DSP、FPGA硬件电路、GPU等

  1. 函数名:satd_4x4 两个参数
    static int satd_4x4(const int16_t* pix1, intptr_t stride_pix1)
    计算一个4x4块的SATD值,用于帧间亚象素搜索。

  2. 函数名:satd_8x4
    static int satd_8x4(const pixel* pix1, intptr_t stride_pix1, const pixel* pix2, intptr_t stride_pix2)
    计算8x4块(PU)的SATD值/2(跟拆分成4x4计算相同)

  3. 函数名:satd8(四个参数)
    int satd8(const pixel* pix1, intptr_t stride_pix1, const pixel* pix2, intptr_t stride_pix2)
    将当前块划分为若干个8x4的块(PU),分别计算8x4块的SATD值,并将所有8x4块的SATD值累加。该函数是调用satd_8x4实现的。这个函数能否使用循环展开?

  4. 函数名:_sa8d_8x8和sa8d_8x8都是两个参数
    _sa8d_8x8直接计算一个8x8块的SATD值 ;sa8d_8x8计算一个8x8块的SATD值,调用_sa8d_8x8函数的返回值加2后再右移2位。sa8d_8x8函数在psyCost_pp中调用,暂时不优化。

SAD和SATD的区别
Q:如果不用率失真最优化,为什么选择SATD+delta×r(mv,mode)作为模式选择的依据?为什么运动估计中,整象素搜索用SAD,而亚象素搜索用SATD?为什么帧内模式选择要用SATD?

SAD即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。整象素搜索即粗匹配,可用来缩小搜索范围。SATD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。因此,不用率失真最优化时,可将其作为模式选择的依据。亚象素搜索即精匹配,可使用SATD。一般帧内要对所有的模式进行检测,帧内预测选用SATD的原因同上。

在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。但是,转换后SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。而在亚象素搜索中,待搜索点不多,各点处的SAD差异相对不大,可以用SATD选择码流较少的匹配位置。

关于hadamard 变换理论

x264的哈达玛变换(hadamard)的实现和优化

代价函数设计

运动估计模块中,需要在众多候选的匹配位置中挑选出“最优”的一个参考块,利用其与当前块的残差进行后续编码操作。因此,为了评选出最优编码结构和预测模式,可以采用绝对误差和(Sum of Absolute Difference, SAD)、基于绝对误差变换和(Sum of Absolute Transform Distortion, SATD)、基于误差平方和(Sum of Square Error, SSE)的具有较低复杂度的模型函数以及率失真代价函数,作为选取的衡量标准。

SAD代价函数
绝对误差和,即SAD,其计算公式如式(2-2)所示:

SAD=∑x=0N−1∑y=0N−1|Orgvalue(x,y)−Predvalue(x,y)|

SAD= \sum_{x=0}^{N-1} \sum_{y=0}^{N-1} |Org_value(x, y)-Pred_value(x, y)|

式中的N为编码图像块尺寸,Org_value(x, y)表示编码图像块中(x, y)位置的原始图像像素值,Pred_value(x, y)表示预测块中(x, y)位置的像素值。
可见,SAD指当前编码块与预测块像素之差的绝对值之和。

SATD代价函数
绝对误差变换和,即SATD,其计算结果按照公式(2-3)求得:

SATD=∑x=0N−1∑y=0N−1|T(Orgvalue(x,y)−Predvalue(x,y))|2

SATD=\sum_{x=0}^{N-1}\sum_{y=0}^{N-1}\frac{|T(Org_value(x, y)-Pred_value(x, y))|}{2}

参考程序

#include "app_entry.h"
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <time.h>#pragma DATA_SECTION(src0,".data1")
unsigned char src0[]={
#include "data_in\\data_1_8.in"
};#pragma DATA_SECTION(src1,".data2")
unsigned char src1[]={
#include "data_in\\data_2_8.in"
};#pragma DATA_SECTION(src2,".data3")
unsigned char src2[]={
#include "data_in\\carphone00.in"
};int __satd88( int* piOrg, int* piCur, int iStrideOrg, int iStrideCur);//app entry point
void app_entry(){time_t op,ed;int i,satd;//time(&op);//for(i=0;i<10000;i++){satd=satd88(src0,src1,8,8);}//time(&ed);printf("satd = %d\n",satd);//printf("%d\n",sum);i=9;
}
/********************************************************************************
**                                                                             **
**                                                                             **
**                            ALL RIGHTS RESERVED                              **
**                                                                             **
*********************************************************************************File name:      _xCalcHADs8x8.asmAuthor:         zengfeiyangCreate Date:    2015-4-8 pm
********************************************************************************//*____________________________________________________________________________Func name   : __xCalcHADs8x8C-Syntax    : __xCalcHADs8x8( Pel *piOrg,Pel *piCur,Int iStrideOrg,Int iStrideCur,Int iStep )----------------------------------------------------------------------------Purpose     :Inputs      : U0 contains the point which point to piOrgU1 contains the point which point to piCurxr2 contains the number of iStrideOrgxr3 contains the number of iStrideCurxr4 contains the number of iStepOutputs     : noneData Memory :yr0~63 diff[64]   yr0~63 m1[16]  ybr0~63 m2[64]Prog Memory :Stack Memory:Cycles      :____________________________________________________________________________*/.global __satd88
//.global _input_data_1
//.global _input_data_2.text
__satd88:
//u0 = _input_data_1
//u1 = _input_data_2
xr0=u1
v0=xr0||u1=u0+8
u2=u0+16||v1=v0+8
v2=v0+16__start:
r1:0 = [u0 += 24,1]||r11:10 = [v0 += 24,1]
r3:2 = [u1 += 24,1]||r13:12 = [v1 += 24,1]
r5:4 = [u2 += 24,1]||r15:14 = [v2 += 24,1]cr21:20=cr11:10-cr1:0||r1:0 = [u0 += 24,1]||r11:10 = [v0 += 24,1]
cr23:22=cr13:12-cr3:2||r3:2 = [u1 += 24,1]||r13:12 = [v1 += 24,1]
cr25:24=cr15:14-cr5:4||r5:4 = [u2 += 24,1]||r15:14 = [v2 += 24,1]xr21=zr20||zr20=xr21||yr21=tr20||tr20=yr21||cr27:26=cr11:10-cr1:0||r1:0 = [u0 += 24,1]||r11:10 = [v0 += 24,1]
xr23=zr22||zr22=xr23||yr23=tr22||tr22=yr23||cr29:28=cr13:12-cr3:2||r3:2 = [u1 += 24,1]||r13:12 = [v1 += 24,1]
xr25=zr24||zr24=xr25||yr25=tr24||tr24=yr25||cr31:30=cr15:14-cr5:4r0=r20+r21<ba>||r1=r20-r21<ba>||xr27=zr26||zr26=xr27||yr27=tr26||tr26=yr27||cr33:32=cr11:10-cr1:0
r2=r22+r23<ba>||r3=r22-r23<ba>||xr29=zr28||zr28=xr29||yr29=tr28||tr28=yr29||cr35:34=cr13:12-cr3:2
r4=r24+r25<ba>||r5=r24-r25<ba>||xr31=zr30||zr30=xr31||yr31=tr30||tr30=yr31r6=r26+r27<ba>||r7=r26-r27<ba>||xr33=zr32||zr32=xr33||yr33=tr32||tr32=yr33
r8=r28+r29<ba>||r9=r28-r29<ba>||xr35=zr34||zr34=xr35||yr35=tr34||tr34=yr35yr0=xr1<bb>||xr1=yr0<bb>||tr0=zr1<bb>||zr1=tr0<bb>||r10=r30+r31<ba>||r11=r30-r31<ba>
yr2=xr3<bb>||xr3=yr2<bb>||tr2=zr3<bb>||zr3=tr2<bb>||r12=r32+r33<ba>||r13=r32-r33<ba>
yr4=xr5<bb>||xr5=yr4<bb>||tr4=zr5<bb>||zr5=tr4<bb>||r14=r34+r35<ba>||r15=r34-r35<ba>r20=r0+r1<bb>||r21=r0-r1<bb>||yr6=xr7<bb>||xr7=yr6<bb>||tr6=zr7<bb>||zr7=tr6<bb>
r22=r2+r3<bb>||r23=r2-r3<bb>||yr8=xr9<bb>||xr9=yr8<bb>||tr8=zr9<bb>||zr9=tr8<bb>
r24=r4+r5<bb>||r25=r4-r5<bb>||yr10=xr11<bb>||xr11=yr10<bb>||tr10=zr11<bb>||zr11=tr10<bb>r26=r6+r7<bb>||r27=r6-r7<bb>||yr12=xr13<bb>||xr13=yr12<bb>||tr12=zr13<bb>||zr13=tr12<bb>
r28=r8+r9<bb>||r29=r8-r9<bb>||yr14=xr15<bb>||xr15=yr14<bb>||tr14=zr15<bb>||zr15=tr14<bb>xr21=zr20<bb>||zr20=xr21<bb>||yr21=tr20<bb>||tr20=yr21<bb>||r30=r10+r11<bb>||r31=r10-r11<bb>
xr23=zr22<bb>||zr22=xr23<bb>||yr23=tr22<bb>||tr22=yr23<bb>||r32=r12+r13<bb>||r33=r12-r13<bb>
xr25=zr24<bb>||zr24=xr25<bb>||yr25=tr24<bb>||tr24=yr25<bb>||r34=r14+r15<bb>||r35=r14-r15<bb>r40=r20+r21<bb>||r41=r20-r21<bb>||xr27=zr26<bb>||zr26=xr27<bb>||yr27=tr26<bb>||tr26=yr27<bb>
r42=r22+r23<bb>||r43=r22-r23<bb>||xr29=zr28<bb>||zr28=xr29<bb>||yr29=tr28<bb>||tr28=yr29<bb>
r44=r24+r25<bb>||r45=r24-r25<bb>||xr31=zr30<bb>||zr30=xr31<bb>||yr31=tr30<bb>||tr30=yr31<bb>r46=r26+r27<bb>||r47=r26-r27<bb>||xr33=zr32<bb>||zr32=xr33<bb>||yr33=tr32<bb>||tr32=yr33<bb>
r48=r28+r29<bb>||r49=r28-r29<bb>||xr35=zr34<bb>||zr34=xr35<bb>||yr35=tr34<bb>||tr34=yr35<bb>
r50=r30+r31<bb>||r51=r30-r31<bb>
r52=r32+r33<bb>||r53=r32-r33<bb>r40=r40+r48<ab>||r41=r40-r48<ab>||r42=r41+r49<ab>||r43=r41-r49<ab>||r54=r34+r35<bb>||r55=r34-r35<bb>
r44=r42+r50<ab>||r45=r42-r50<ab>||r46=r43+r51<ab>||r47=r43-r51<ab>
r48=r44+r52<ab>||r49=r44-r52<ab>||r50=r45+r53<ab>||r51=r45-r53<ab>
r52=r46+r54<ab>||r53=r46-r54<ab>||r54=r47+r55<ab>||r55=r47-r55<ab>r0=r40+r48||r1=r42+r50||r2=r40-r48||r3=r42-r50
r4=r44+r52||r5=r46+r54||r6=r44-r52||r7=r46-r54
r8=r41+r49||r9=r43+r51||r10=r41-r49||r11=r43-r51
r12=r45+r53||r13=r47+r55||r14=r45-r53||r15=r47-r55r20=r0+r4||r21=r1+r5||r22=r0-r4||r23=r1-r5
r24=r2+r6||r25=r3+r7||r26=r2-r6||r27=r3-r7
r28=r8+r12||r29=r9+r13||r30=r8-r12||r31=r9-r13
r40=abs(r20)+abs(r21)||r41=abs(r22)+abs(r23)||r32=r10+r14||r33=r11+r15||r34=r10-r14||r35=r11-r15r42=abs(r24)+abs(r25)||r43=abs(r26)+abs(r27)
r44=abs(r28)+abs(r29)||r45=abs(r30)+abs(r31)
r48=r40+r41||r46=abs(r32)+abs(r33)||r47=abs(r34)+abs(r35)
r49=r42+r43
r50=r44+r45
r51=r46+r47
r52=r48+r49||r53=r50+r51
r54=r52+r53xr55=sigmaxyztr54xr8=r55 lshift -2__end:.code_align 16
ret
/*
.section data0,"aw",@progbits
_input_data_1:
.include "C:\\workspace1\\satd88\\data_in\\data_1.in"
.section data1,"aw",@progbits
_input_data_2:
.include "C:\\workspace1\\satd88\\data_in\\data_2.in"
.data
_output:
.end
*/
  • 使用平台ECS
  • 本文作为资料收集

帧间的SAD和SATD相关推荐

  1. satd残差_RDO、SAD、SATD、λ相关概念【转】

    率失真优化概述: 率失真优化(Rate D isto r t i on Op t i m ized)策略是在率失真理论[3 ]的基础上提出的一种代价函数方案, RDO 的主要思想是, 在计算代价函数时 ...

  2. x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  3. 【ECM技术】ECM(Enhanced Compression Model)帧间技术总结

    1.LIC技术 (Local illumimation compensation) 2. Non-adjacent spatial candidate 3.TM (Template matching) ...

  4. 【VTM10.0代码学习】帧间预测xCheckRdCostMerge2N*2N

      xCheckRdCostMerge函数在xCompressCU中被调用,这里包括了常规Merge模式.CIIP模式和MMVD模式,GPM在xCheckRDCostGeo函数中.也就是说常规Merg ...

  5. 帧间预测:运动估计和运动补偿

    运动补偿是通过先前的局部图像来预测.补偿当前的局部图像,它是减少帧序列冗余信息的有效方法.运动估计是从视频序列中抽取运动信息的一整套技术. 运动估计与运动补偿技术 MPEG-4采用I-VOP.P-VO ...

  6. H.266/VVC帧间预测总结

    一.帧间预测基本原理 帧间预测是利用视频帧与帧之间的相关性,去除视频帧间的时间冗余信息.统计表明,帧间差绝对值超过3的像素平均不到一帧像素的4%,因此,采用高效的帧间编码方式,可以很大程度上提高视频压 ...

  7. SAD和SATD的区别[摘]

    Q:如果不用率失真最优化,为什么选择SATD+delta×r(mv,mode)作为模式选择的依据?为什么运动估计中,整象素搜索用SAD,而亚象素用SATD?为什么帧内模式选择要用SATD? SAD即绝 ...

  8. satd残差_RDO、SAD、SATD、λ(转贴) - [h.264]

    经常有人问我这方面的问题,今天总结归纳一下. 众所周知,评价编码效率的有两大指标:码率和PSNR.码流越小,则压缩率越大:PSNR越大,重建图像越好.在模式选择的时候,判别公式实质上也就是对二者的综合 ...

  9. 【HEVC帧间预测论文】P1.2 An Efficient Inter Mode Decision Approach for H.264 Video Codin

    参考:An Efficient Inter Mode Decision Approach for H.264 Video Coding <HEVC标准介绍.HEVC帧间预测论文笔记>系列博 ...

最新文章

  1. 转 深入理解Midlet类
  2. 【Python 2 到 3 系列】 print 是函数
  3. 最浅显易懂的使用nginx实现端口映射的教程
  4. Java中HashMap的常用操作
  5. 最小化安装虚拟机(建立母盘和快照)
  6. Ubuntu的超宽屏支持2560*1080
  7. Redis的安装(windows)
  8. Struts2——知识点:Action Implements SessionAware
  9. 菜鸟学Linux 第096篇笔记 nginx
  10. paip.xdebug 配置attilax总结.txt
  11. mac unity3D汉化包
  12. 暑假学习打卡【2】——北理工乐学第一周第二周作业
  13. 意畅科技:亲近用户 升级服务 谋就网络安全行业市场 | 企业服务代理商系列谈...
  14. 多元统计之因子分析模型及Python分析示例
  15. 黑苹果声卡HDA无声问题
  16. (附源码)spring boot智能车APP毕业设计250623
  17. 李宏毅2021机器学习笔记——Transformer
  18. lambda累加求和
  19. PAT : 基础编程题目集_函数题答案(6-1 ~ 6-13)(C语言)
  20. 如何判断Hadoop集群是否搭建成功

热门文章

  1. 英语如此简单(转贴)
  2. 被动扫描、主动扫描的概念
  3. win8: html5+css3+js
  4. 阿里云 CDN+Oss 解决方案
  5. 第三方支付躺赚的好日子结束:银行直连模式瓦解
  6. 不动产登记+电子签章全程无纸化网上办,零跑腿!
  7. Unity 入门笔记 - 02 - 各种动画
  8. 智能洗拖地机哪个品牌好一点、拖洗地机品牌排行榜前十名
  9. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.xxx 的解决办法
  10. 毕业设计So Easy:JSP+layui+MySQL实现Web端图书管理系统