一 计算原理

二 代码验证
- #include <stdio.h>
- #include <stdint.h>
- static void dct4x4dc( int16_t *d)
- {
- int16_t tmp[16];
-
- for( int i = 0; i < 4; i++ )
- {
- int s01 = d[i*4+0] + d[i*4+1];
- int d01 = d[i*4+0] - d[i*4+1];
- int s23 = d[i*4+2] + d[i*4+3];
- int d23 = d[i*4+2] - d[i*4+3];
-
- tmp[0*4+i] = s01 + s23; // 1 1 1 1
- tmp[1*4+i] = s01 - s23; // 1 1 -1 -1
- tmp[2*4+i] = d01 - d23; // 1 -1 -1 1
- tmp[3*4+i] = d01 + d23; // 1 -1 1 -1
- //刚好对应哈德玛矩阵,
- }
- //左边乘以 哈德玛矩阵
-
- //右边乘以哈德玛矩阵
- for( int i = 0; i < 4; i++ )
- {
- int s01 = tmp[i*4+0] + tmp[i*4+1]; //
- int d01 = tmp[i*4+0] - tmp[i*4+1];
- int s23 = tmp[i*4+2] + tmp[i*4+3];
- int d23 = tmp[i*4+2] - tmp[i*4+3];
-
- d[i*4+0] = ( s01 + s23 + 1 ) >> 1;
- d[i*4+1] = ( s01 - s23 + 1 ) >> 1;
- d[i*4+2] = ( d01 - d23 + 1 ) >> 1;
- d[i*4+3] = ( d01 + d23 + 1 ) >> 1;
- }
- }
-
- int main()
- {
- int16_t a[16] = {1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1};
- dct4x4dc(a);
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- printf("%d ", a[j*4 + i]);
- }
- printf("\n");
- }
-
- return 0;
- }
x264中的代码是把结果放大了8倍的。