对SATD理解
为什么SATD越大,画面内容越复杂?
1. SATD的计算过程
- SATD 是将当前块与预测块的像素差值,经过变换(如Hadamard变换)后,取绝对值再求和。
- 公式简化为: $ \text{SATD} = \sum_{i} |T(\text{原始块} - \text{预测块})_i| $ , 其中$T$表示变换操作。
2. 物理意义
- 预测块:编码器会用运动估计、帧间/帧内预测等方法,预测当前块的内容。
- 残差:原始块与预测块的差异,称为残差。
- 变换:如Hadamard或DCT,将残差从空间域变换到频域,便于能量聚集和后续量化。
3. SATD与内容复杂度的关系
- 内容简单时:预测块和原始块很接近,残差很小,变换后绝对值和(SATD)也很小。
- 内容复杂时:预测块难以准确还原原始块,残差大,变换后SATD也大。
- 高频信息多(如纹理、噪声、运动剧烈):预测难度大,SATD大。
- 低频/平坦区域(如大面积纯色、静止):预测容易,SATD小。
4. 直观理解
- SATD 本质上是“预测失败的总量”,即编码器没法用简单预测还原的那部分内容。
- 预测失败越多,说明内容越复杂,编码难度越大。
5. 举例
- 静止蓝天:预测块和原始块几乎一样,SATD接近0。
- 树叶、草地、运动物体:预测块和原始块差异大,SATD很大。
6. 总结
- SATD越大,说明预测残差越大,内容越复杂。
- 复杂内容需要更多比特编码,SATD是衡量复杂度的有效指标。
为什么SATD越大,预测的比特数越多?
通过计算SATD(Sum of Absolute Transformed Differences,变换域绝对差和),可以预测每一帧的比特大小,但不是直接“得到”比特大小。其原理如下:
1. SATD是什么?
- SATD 是衡量一帧(或宏块、CU等)内容复杂度的指标,反映了该区域与预测值之间的残差能量。
- SATD 越大,说明内容越复杂,编码后残差越大,通常需要更多比特来表示。
2. SATD与比特数的关系
- 在视频编码中,比特数 ≈ 复杂度 / 量化步长(QScale)。
- 复杂度常用 SATD 或 SAD(绝对差和)来衡量。
- 量化步长越大,压缩越狠,比特数越少;复杂度越高,比特数越多。
3. 预测比特数的经验公式
编码器通常会用如下经验公式来预测比特数:
\[\text{bits} \approx \alpha \cdot \frac{\text{SATD}}{\text{QScale}}\]- 其中 (\alpha) 是通过统计回归等方法得到的经验参数。
- 这个公式的物理意义是:在相同量化强度下,内容越复杂(SATD大),需要的比特越多。
4. 实际代码实现
在 x265 的 ABR 码控中,预测比特数的函数通常类似这样:
double predictSize(Predictor *p, double q, double var)
{
// p->coeff, p->count, p->offset 通过历史数据拟合
return (p->coeff * var + p->offset) / q;
}
- 其中
var
就是 SATD,q
是 QScale。 - 预测出来的值就是当前帧在该 QScale 下大致会产生多少比特。
5. 为什么这样做有效?
- 统计学上,SATD 与实际编码比特数有很强的相关性。
- 编码器会不断用历史帧的实际比特数和SATD来拟合/更新预测参数,使得预测越来越准确。
6. 总结
- SATD 反映了帧的复杂度,复杂度越高,编码后比特数越多。
- 通过经验公式(SATD/QScale)可以较准确地预测每帧的比特数。
- 实际比特数还会受到熵编码、运动补偿等影响,但SATD是最主要的复杂度指标之一。