一 计算原理
二 代码验证
#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倍的。