headforever 2025-09-03 10:45 采纳率: 41%
浏览 5

h.264前端intra4x4交流数据在残差块Dn之后的DCT运算整数公式、量化整数公式、反量化整数公式、逆DCT整数运算公式?

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运算。


    六、总结

    重点总结

    1. DCT运算 使用整数近似,避免浮点运算。
    2. 量化反量化 均为整数操作,使用乘法与移位。
    3. 逆DCT 同样使用整数近似。
    4. 位宽分析
      • Dn: 8 bit
      • F_n, Q_n, R_n: 16 bit
      • D'_n: 8 bit
    5. 预测值P 为 8 bit,uF'n = D'_n + P 也为 8 bit。

    如需进一步了解H.264中Intra4x4预测模式(如DC预测、水平预测、垂直预测等),也可以继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 9月3日