📄 1.txt
字号:
#include <stdio.h>
#include <math.h>
void main()
{
int i,j;
const double a=0.5;
const double b=sqrt(0.4);
int QP=4; //
int D[4][4];
int W[4][4];
int Z[4][4];
float Wi[4][4];
float Di[4][4];
float Xi[4][4];
int X[4][4]=
{
{5 , 11, 8 , 10},
{9 , 8 , 4 , 12},
{1 , 10, 11, 4 },
{19, 6, 15, 7 }
};
int Cf[4][4]=
{
{1, 1, 1, 1},
{2, 1, -1, -2},
{1,-1, -1, 1},
{1,-2, 2, -1}
};
int Cft[4][4]=
{
{1, 2, 1, 1 },
{1, 1, -1, -2},
{1,-1, -1, 2},
{1,-2, 1, -1}
};
float Ci[4][4]=
{
{2, 2, 2, 1 },
{2, 1, -2, -2},
{2, -1, -2, 2 },
{2, -2, 2, -1}
};
float Cit[4][4]=
{
{2 , 2 , 2, 2 },
{2 , 1 , -1, -2 },
{2 , -2 , -2, 2 },
{1 , -2 , 2, -1 }
};
int MF[6][6]=
{
{13107, 5243, 8066},
{11916, 4660, 7490},
{10082, 4194, 6554},
{9362, 3647, 5825},
{8192, 3355, 5243},
{7282, 2893, 4559}
};
int V[6][6]=
{
{10, 16, 13 },
{11, 18, 14 },
{13, 20, 16 },
{14, 23, 18 },
{16, 25, 20 },
{18, 29, 23 }
};
int matrix_multiply(int a[4][4],int b[4][4],int c[4][4]);
float matrix_multiply_f(float a[4][4],float b[4][4],float c[4][4]);
void matrix_display(int a[4][4]);
void matrix_display_f(float a[4][4]);
matrix_multiply(Cf,X,D); //
matrix_multiply(D,Cft,W); //
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
int sign=1;
// int qbits=15+int(QP/6);
int qbits=16; //2005.6.21:: why the qbits is 16(H.264 white-paper) not 15?
int mf,k; //
int f=(int)(pow(2,qbits)/3);
if(W[i][j]<0)
{
sign=-1;
W[i][j]*=-1;
}
if((i==0||i==2)&&(j==0||j==2))
k=0;
else
if((i==1||i==3)&&(j==1||j==3))
k=1;
else
k=2;
mf=MF[QP][k];
Z[i][j]=(W[i][j]*mf+f)>>qbits;
Z[i][j]*=sign;
}
printf("\nDisplay the matrix Z[4][4]:\n");
matrix_display(Z);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
int v,k,f,t; //
t=(int)((float)QP/6+0.5); //
f=(int)pow(2,t); //
if((i==0||i==2)&&(j==0||j==2))
k=0;
else
if((i==1||i==3)&&(j==1||j==3))
k=1;
else
k=2;
v=V[QP][k];
Wi[i][j]=Z[i][j]*v*f;
}
printf("\nDisplay the matrix Wi[4][4]:\n");
matrix_display_f(Wi);
matrix_multiply_f(Ci,Wi,Di); //
matrix_multiply_f(Di,Cit,Xi); //
for(i=0;i<4;i++)
for(j=0;j<4;j++)
Xi[i][j]/=64;
matrix_display_f(Xi);
}
// multiply the matrix of a and b
int matrix_multiply(int a[4][4],int b[4][4],int c[4][4])
{
int i,j,k;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
c[i][j]=0;
for(k=0;k<4;k++)
c[i][j]+=a[i][k]*b[k][j];
}
return 0;
}
// multiply the matrix of a and b
float matrix_multiply_f(float a[4][4],float b[4][4],float c[4][4])
{
int i,j,k;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
c[i][j]=0;
for(k=0;k<4;k++)
c[i][j]+=a[i][k]*b[k][j];
}
return 0;
}
void matrix_display(int a[4][4])
{
int i,j;
printf("=====================================================\n");
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
printf("%d\t",(int)a[i][j]);
if(j==3)
printf("\n");
}
printf("=====================================================\n");
}
void matrix_display_f(float a[4][4])
{
int i,j;
printf("=====================================================\n");
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
printf("%d\t",(int)a[i][j]);
if(j==3)
printf("\n");
}
printf("=====================================================\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -