h.264前端intra4x4交流数据在残差块Dn之后的DCT运算整数公式、量化整数公式、反量化整数公式、逆DCT整数运算公式,以及各个运算阶段的系数位宽、预测值P系数位宽、uF'n系数(uF'n=D'n+ P)位宽?假设视频采样数据为8bit。
5条回答 默认 最新
檀越@新空间 2025-09-03 10:46关注上午好☀️☀️☀️️
本答案参考通义千问在H.264编码标准中,Intra4x4模式下的残差块处理是视频压缩的重要环节。在该模式下,图像数据被分割为4×4的块,进行DCT变换(离散余弦变换)、量化、反量化、逆DCT等操作,最终得到压缩后的码流。
以下是对 H.264 Intra4x4 残差块处理流程 的详细说明,包括各个阶段的整数公式、位宽分析以及相关系数的定义。
一、基本概念
- Dn:原始残差块(4×4),每个像素为8 bit。
- DCT运算:将空间域的残差块转换到频率域。
- 量化:对DCT系数进行压缩。
- 反量化:将量化后的系数还原。
- 逆DCT:将频率域的系数转换回空间域。
- P:预测值(来自相邻块的预测)。
- uF'n = D'n + P:预测误差块(用于后续处理)。
二、关键公式与算法
1. DCT运算(整数形式)
H.264使用的是整数DCT,而不是传统的浮点DCT。其计算公式如下:
对于一个4×4的残差块 $ D_n $,进行二维DCT变换后得到 $ F_n $:
$$ F_{i,j} = \sum_{x=0}^{3} \sum_{y=0}^{3} D_{x,y} \cdot \cos\left(\frac{(2x+1)i\pi}{8}\right) \cdot \cos\left(\frac{(2y+1)j\pi}{8}\right) $$
但H.264采用的是整数近似,具体公式如下(简化版本):
二维整数DCT变换公式(H.264标准):
$$ F_{i,j} = \frac{1}{2} \cdot \left( \sum_{x=0}^{3} \sum_{y=0}^{3} D_{x,y} \cdot w_x(i) \cdot w_y(j) \right) $$
其中:
- $ w_x(i) = \cos\left(\frac{(2x+1)i\pi}{8}\right) $
- $ w_y(j) = \cos\left(\frac{(2y+1)j\pi}{8}\right) $
注意:H.264中实际使用的DCT是整数近似,且不使用除法,而是通过移位和加减运算实现。
2. 量化公式(整数形式)
量化公式为:
$$ Q(F_{i,j}) = \text{round}\left( \frac{F_{i,j}}{QScale} \right) $$
其中:
- $ QScale $ 是量化步长(由QP决定)
round()表示四舍五入
量化后的系数为整数,通常为16位或更小。
3. 反量化公式(整数形式)
反量化公式为:
$$ R(Q_{i,j}) = Q_{i,j} \times QScale $$
反量化后得到的是整数近似的DCT系数,用于后续的逆DCT。
4. 逆DCT运算(整数形式)
逆DCT公式为:
$$ D'{x,y} = \sum{i=0}^{3} \sum_{j=0}^{3} R(Q_{i,j}) \cdot w_x(i) \cdot w_y(j) $$
同样,H.264使用的是整数近似,并避免使用除法,通过移位实现。
三、各阶段的位宽分析
| 阶段 | 系数类型 | 位宽 | 说明 | |------|----------|------|------| | Dn | 残差块 | 8 bit | 原始残差,每个像素为8 bit | | F_n | DCT系数 | 16 bit | DCT变换后,通常为16 bit | | Q(F_n) | 量化系数 | 16 bit 或更小 | 量化后的整数系数 | | R(Q(F_n)) | 反量化系数 | 16 bit | 反量化后的近似DCT系数 | | D'_n | 逆DCT后残差 | 8 bit | 最终输出为8 bit,用于重建 |
四、预测值P与uF'n的位宽
- P:预测值,通常是8 bit(来自相邻块的预测)
- uF'n = D'n + P:预测误差块,结果为8 bit(因为D'n是8 bit,P也是8 bit)
注意:在某些情况下,uF'n可能会有溢出,因此可能需要使用16 bit存储中间结果。
五、代码示例(伪代码)
// 假设 Dn 是 4x4 的残差块(8 bit) int8_t Dn[4][4]; // DCT变换(整数近似) int16_t Fn[4][4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { Fn[i][j] = 0; for (int x = 0; x < 4; x++) { for (int y = 0; y < 4; y++) { Fn[i][j] += Dn[x][y] * cos_table[x][i] * cos_table[y][j]; } } Fn[i][j] >>= 1; // 移位代替除以2 } } // 量化 int16_t Qn[4][4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { Qn[i][j] = round(Fn[i][j] / QScale); } } // 反量化 int16_t Rn[4][4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { Rn[i][j] = Qn[i][j] * QScale; } } // 逆DCT int8_t Dn_prime[4][4]; for (int x = 0; x < 4; x++) { for (int y = 0; y < 4; y++) { Dn_prime[x][y] = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { Dn_prime[x][y] += Rn[i][j] * cos_table[x][i] * cos_table[y][j]; } } Dn_prime[x][y] >>= 1; // 移位代替除以2 } }注:
cos_table是预计算的余弦表,用于加速DCT/IDCT运算。
六、总结
重点总结:
- DCT运算 使用整数近似,避免浮点运算。
- 量化 和 反量化 均为整数操作,使用乘法与移位。
- 逆DCT 同样使用整数近似。
- 位宽分析:
- Dn: 8 bit
- F_n, Q_n, R_n: 16 bit
- D'_n: 8 bit
- 预测值P 为 8 bit,uF'n = D'_n + P 也为 8 bit。
如需进一步了解H.264中Intra4x4预测模式(如DC预测、水平预测、垂直预测等),也可以继续提问!
解决 无用评论 打赏 举报