📄 dct.c
字号:
#include "macros.h"#include "sim.h"#include "global_e.h"
#include "TMConfig.h"
#include <math.h>#ifndef PI# ifdef M_PI# define PI M_PI# else# define PI 3.14159265358979323846# endif#endifint zigzag[8][8] =
{ {0, 1, 5, 6,14,15,27,28}, {2, 4, 7,13,16,26,29,42}, {3, 8,12,17,25,30,41,43}, {9,11,18,24,31,40,44,53}, {10,19,23,32,39,45,52,54}, {20,22,33,38,46,51,55,60}, {21,34,37,47,50,56,59,61}, {35,36,48,49,57,58,62,63},};
static short coef[8][4] =
{
0x2d41, 0x2d41, 0x2d41, 0x2d41,
0x3ec5, 0x3537, 0x238e, 0xc7c,
0x3b21, 0x187d,-0x187d,-0x3b21,
0x3537,-0xc7c, -0x3ec5,-0x238e,
0x2d41,-0x2d41,-0x2d41, 0x2d41,
0x238e,-0x3ec5, 0xc7c, 0x3537,
0x187d,-0x3b21, 0x3b21,-0x187d,
0xc7c, -0x238e, 0x3537,-0x3ec5
};
static short icoef[8][4] =
{
0x2d41, 0x3b21, 0x2d41, 0x187e, 0x3ec5, 0x3537, 0x238e, 0xc7c,
0x2d41, 0x187e,-0x2d41,-0x3b21, 0x3537,-0xc7c, -0x3ec5,-0x238e,
0x2d41,-0x187e,-0x2d41, 0x3b21, 0x238e,-0x3ec5, 0xc7c, 0x3537,
0x2d41,-0x3b21, 0x2d41,-0x187e, 0xc7c, -0x238e, 0x3537,-0x3ec5
};
int Dct( short int *block, short int *coeff){ int j1, i, j, k; float b[8]; float b1[8]; float d[8][8]; float f0=(float).7071068; float f1=(float).4903926; float f2=(float).4619398; float f3=(float).4157348; float f4=(float).3535534; float f5=(float).2777851; float f6=(float).1913417; float f7=(float).0975452;
for (i = 0, k = 0; i < 8; i++, k += 8)
{ for (j = 0; j < 8; j++)
{ b[j] = (float)block[k+j]; } /* Horizontal transform */ for (j = 0; j < 4; j++)
{ j1 = 7 - j; b1[j] = b[j] + b[j1]; b1[j1] = b[j] - b[j1]; } b[0] = b1[0] + b1[3]; b[1] = b1[1] + b1[2]; b[2] = b1[1] - b1[2]; b[3] = b1[0] - b1[3]; b[4] = b1[4]; b[5] = (b1[6] - b1[5]) * f0; b[6] = (b1[6] + b1[5]) * f0; b[7] = b1[7]; d[i][0] = (b[0] + b[1]) * f4; d[i][4] = (b[0] - b[1]) * f4; d[i][2] = b[2] * f6 + b[3] * f2; d[i][6] = b[3] * f6 - b[2] * f2; b1[4] = b[4] + b[5]; b1[7] = b[7] + b[6]; b1[5] = b[4] - b[5]; b1[6] = b[7] - b[6]; d[i][1] = b1[4] * f7 + b1[7] * f1; d[i][5] = b1[5] * f3 + b1[6] * f5; d[i][7] = b1[7] * f7 - b1[4] * f1; d[i][3] = b1[6] * f3 - b1[5] * f5; } /* Vertical transform */ for (i = 0; i < 8; i++)
{ for (j = 0; j < 4; j++)
{ j1 = 7 - j; b1[j] = d[j][i] + d[j1][i]; b1[j1] = d[j][i] - d[j1][i]; } b[0] = b1[0] + b1[3]; b[1] = b1[1] + b1[2]; b[2] = b1[1] - b1[2]; b[3] = b1[0] - b1[3]; b[4] = b1[4]; b[5] = (b1[6] - b1[5]) * f0; b[6] = (b1[6] + b1[5]) * f0; b[7] = b1[7]; d[0][i] = (b[0] + b[1]) * f4; d[4][i] = (b[0] - b[1]) * f4; d[2][i] = b[2] * f6 + b[3] * f2; d[6][i] = b[3] * f6 - b[2] * f2; b1[4] = b[4] + b[5]; b1[7] = b[7] + b[6]; b1[5] = b[4] - b[5]; b1[6] = b[7] - b[6]; d[1][i] = b1[4] * f7 + b1[7] * f1; d[5][i] = b1[5] * f3 + b1[6] * f5; d[7][i] = b1[7] * f7 - b1[4] * f1; d[3][i] = b1[6] * f3 - b1[5] * f5; } /* Zigzag - scanning */ for (i = 0; i < 8; i++)
{ for (j = 0; j < 8; j++)
{ *(coeff + zigzag[i][j]) = (int)(d[i][j]); } }
return 0;}
int idct(short int *coeff,short int *block){ int j1, i, j; double b[8], b1[8], d[8][8]; double f0=.7071068; double f1=.4903926; double f2=.4619398; double f3=.4157348; double f4=.3535534; double f5=.2777851; double f6=.1913417; double f7=.0975452; double e, f, g, h; /* Horizontal */ /* Descan coefficients first */
for (i = 0; i < 8; i++)
{ for (j = 0; j < 8; j++)
{ b[j] = *( coeff + zigzag[i][j]); } e = b[1] * f7 - b[7] * f1; h = b[7] * f7 + b[1] * f1; f = b[5] * f3 - b[3] * f5; g = b[3] * f3 + b[5] * f5; b1[0] = (b[0] + b[4]) * f4; b1[1] = (b[0] - b[4]) * f4; b1[2] = b[2] * f6 - b[6] * f2; b1[3] = b[6] * f6 + b[2] * f2; b[4] = e + f; b1[5] = e - f; b1[6] = h - g; b[7] = h + g; b[5] = (b1[6] - b1[5]) * f0; b[6] = (b1[6] + b1[5]) * f0; b[0] = b1[0] + b1[3]; b[1] = b1[1] + b1[2]; b[2] = b1[1] - b1[2]; b[3] = b1[0] - b1[3]; for (j = 0; j < 4; j++)
{ j1 = 7 - j; d[i][j] = b[j] + b[j1]; d[i][j1] = b[j] - b[j1]; } } /* Vertical */ for (i = 0; i < 8; i++)
{ for (j = 0; j < 8; j++)
{ b[j] = d[j][i]; } e = b[1] * f7 - b[7] * f1; h = b[7] * f7 + b[1] * f1; f = b[5] * f3 - b[3] * f5; g = b[3] * f3 + b[5] * f5; b1[0] = (b[0] + b[4]) * f4; b1[1] = (b[0] - b[4]) * f4; b1[2] = b[2] * f6 - b[6] * f2; b1[3] = b[6] * f6 + b[2] * f2; b[4] = e + f; b1[5] = e - f; b1[6] = h - g; b[7] = h + g; b[5] = (b1[6] - b1[5]) * f0; b[6] = (b1[6] + b1[5]) * f0; b[0] = b1[0] + b1[3]; b[1] = b1[1] + b1[2]; b[2] = b1[1] - b1[2]; b[3] = b1[0] - b1[3]; for (j = 0; j < 4; j++)
{ j1 = 7 - j; d[j][i] = b[j] + b[j1]; d[j1][i] = b[j] - b[j1]; } } for (i = 0; i < 8; i++)
{ for (j = 0; j < 8; j++)
{ *(block + i * 8 + j) = mnint(d[i][j]); } }
return 0;}
int Dct_MY(short *block, short *coeff)
{
short sfb[8][8],*fbs,*blk;
int *m,*fa,*fb,i,j,*c,*fs;
int p0, p1, p2, p3, p4, p5, p6, p7,
p8, p9, p10, p11, p12, p13, p14, p15,
p16, p17, p18, p19, p20, p21, p22, p23,
p24, p25, p26, p27, p28, p29, p30, p31;
int q0, q1, q2, q3, q4, q5, q6, q7,
q8, q9, q10, q11, q12, q13, q14, q15,
q16, q17, q18, q19, q20, q21, q22, q23,
q24, q25, q26, q27, q28, q29, q30, q31;
int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
int add0, add1, add2, add3, add4, add5, add6, add7;
m = (int *)block;
fb = (int *)sfb;
c = (int *)coef;
fbs = (short *)sfb;
blk = coeff;
m = (int *)block;
p4 = PACK16MSB(m[4],m[0]);
p0 = PACK16LSB(m[4],m[0]);
p5 = PACK16MSB(m[5],m[1]);
p1 = PACK16LSB(m[5],m[1]);
p6 = PACK16MSB(m[6],m[2]);
p2 = PACK16LSB(m[6],m[2]);
p7 = PACK16MSB(m[7],m[3]);
p3 = PACK16LSB(m[7],m[3]);
p12 = PACK16MSB(m[12],m[8]);
p8 = PACK16LSB(m[12],m[8]);
p13 = PACK16MSB(m[13],m[9]);
p9 = PACK16LSB(m[13],m[9]);
p14 = PACK16MSB(m[14],m[10]);
p10 = PACK16LSB(m[14],m[10]);
p15 = PACK16MSB(m[15],m[11]);
p11 = PACK16LSB(m[15],m[11]);
p20 = PACK16MSB(m[20],m[16]);
p16 = PACK16LSB(m[20],m[16]);
p21 = PACK16MSB(m[21],m[17]);
p17 = PACK16LSB(m[21],m[17]);
p22 = PACK16MSB(m[22],m[18]);
p18 = PACK16LSB(m[22],m[18]);
p23 = PACK16MSB(m[23],m[19]);
p19 = PACK16LSB(m[23],m[19]);
p28 = PACK16MSB(m[28],m[24]);
p24 = PACK16LSB(m[28],m[24]);
p29 = PACK16MSB(m[29],m[25]);
p25 = PACK16LSB(m[29],m[25]);
p30 = PACK16MSB(m[30],m[26]);
p26 = PACK16LSB(m[30],m[26]);
p31 = PACK16MSB(m[31],m[27]);
p27 = PACK16LSB(m[31],m[27]);
q1 = p8; q8 = p1;
q5 = p12; q12 = p5;
q2 = p16; q16 = p2;
q6 = p20; q20 = p6;
q3 = p24; q24 = p3;
q7 = p28; q28 = p7;
q10 = p17; q17 = p10;
q14 = p21; q21 = p14;
q11 = p25; q25 = p11;
q15 = p29; q29 = p15;
q19 = p26; q26 = p19;
q23 = p30; q30 = p23;
q0 = p0; q4 = p4;
q9 = p9; q13 = p13;
q18 = p18; q22 = p22;
q27 = p27; q31 = p31;
temp0 = ROL(q3,16);
temp1 = ROL(q2,16);
temp2 = ROL(q7,16);
temp3 = ROL(q6,16);
temp4 = ROL(q11,16);
temp5 = ROL(q10,16);
temp6 = ROL(q15,16);
temp7 = ROL(q14,16);
p0 = DSPIDUALADD(q0,temp0);
p1 = DSPIDUALADD(q1,temp1);
p2 = DSPIDUALADD(q4,temp2);
p3 = DSPIDUALADD(q5,temp3);
p4 = DSPIDUALADD(q8,temp4);
p5 = DSPIDUALADD(q9,temp5);
p6 = DSPIDUALADD(q12,temp6);
p7 = DSPIDUALADD(q13,temp7);
p16 = DSPIDUALSUB(q0,temp0);
p17 = DSPIDUALSUB(q1,temp1);
p18 = DSPIDUALSUB(q4,temp2);
p19 = DSPIDUALSUB(q5,temp3);
p20 = DSPIDUALSUB(q8,temp4);
p21 = DSPIDUALSUB(q9,temp5);
p22 = DSPIDUALSUB(q12,temp6);
p23 = DSPIDUALSUB(q13,temp7);
temp0 = ROL(q19,16);
temp1 = ROL(q18,16);
temp2 = ROL(q23,16);
temp3 = ROL(q22,16);
temp4 = ROL(q27,16);
temp5 = ROL(q26,16);
temp6 = ROL(q31,16);
temp7 = ROL(q30,16);
p8 = DSPIDUALADD(q16,temp0);
p9 = DSPIDUALADD(q17,temp1);
p10 = DSPIDUALADD(q20,temp2);
p11 = DSPIDUALADD(q21,temp3);
p12 = DSPIDUALADD(q24,temp4);
p13 = DSPIDUALADD(q25,temp5);
p14 = DSPIDUALADD(q28,temp6);
p15 = DSPIDUALADD(q29,temp7);
p24 = DSPIDUALSUB(q16,temp0);
p25 = DSPIDUALSUB(q17,temp1);
p26 = DSPIDUALSUB(q20,temp2);
p27 = DSPIDUALSUB(q21,temp3);
p28 = DSPIDUALSUB(q24,temp4);
p29 = DSPIDUALSUB(q25,temp5);
p30 = DSPIDUALSUB(q28,temp6);
p31 = DSPIDUALSUB(q29,temp7);
q0 = IFIR16(c[0],p0);
q1 = IFIR16(c[1],p1);
q2 = IFIR16(c[0],p2);
q3 = IFIR16(c[1],p3);
q4 = IFIR16(c[0],p4);
q5 = IFIR16(c[1],p5);
q6 = IFIR16(c[0],p6);
q7 = IFIR16(c[1],p7);
q8 = IFIR16(c[0],p8);
q9 = IFIR16(c[1],p9);
q10 = IFIR16(c[0],p10);
q11 = IFIR16(c[1],p11);
q12 = IFIR16(c[0],p12);
q13 = IFIR16(c[1],p13);
q14 = IFIR16(c[0],p14);
q15 = IFIR16(c[1],p15);
add0 = q0+q1;
add1 = q2+q3;
add2 = q4+q5;
add3 = q6+q7;
add4 = q8+q9;
add5 = q10+q11;
add6 = q12+q13;
add7 = q14+q15;
fbs[0] = ASRI(15,add0);
fbs[1] = ASRI(15,add1);
fbs[2] = ASRI(15,add2);
fbs[3] = ASRI(15,add3);
fbs[4] = ASRI(15,add4);
fbs[5] = ASRI(15,add5);
fbs[6] = ASRI(15,add6);
fbs[7] = ASRI(15,add7);
q0 = IFIR16(c[4],p0);
q1 = IFIR16(c[5],p1);
q2 = IFIR16(c[4],p2);
q3 = IFIR16(c[5],p3);
q4 = IFIR16(c[4],p4);
q5 = IFIR16(c[5],p5);
q6 = IFIR16(c[4],p6);
q7 = IFIR16(c[5],p7);
q8 = IFIR16(c[4],p8);
q9 = IFIR16(c[5],p9);
q10 = IFIR16(c[4],p10);
q11 = IFIR16(c[5],p11);
q12 = IFIR16(c[4],p12);
q13 = IFIR16(c[5],p13);
q14 = IFIR16(c[4],p14);
q15 = IFIR16(c[5],p15);
add0 = q0+q1;
add1 = q2+q3;
add2 = q4+q5;
add3 = q6+q7;
add4 = q8+q9;
add5 = q10+q11;
add6 = q12+q13;
add7 = q14+q15;
fbs[16] = ASRI(15,add0);
fbs[17] = ASRI(15,add1);
fbs[18] = ASRI(15,add2);
fbs[19] = ASRI(15,add3);
fbs[20] = ASRI(15,add4);
fbs[21] = ASRI(15,add5);
fbs[22] = ASRI(15,add6);
fbs[23] = ASRI(15,add7);
q0 = IFIR16(c[8],p0);
q1 = IFIR16(c[9],p1);
q2 = IFIR16(c[8],p2);
q3 = IFIR16(c[9],p3);
q4 = IFIR16(c[8],p4);
q5 = IFIR16(c[9],p5);
q6 = IFIR16(c[8],p6);
q7 = IFIR16(c[9],p7);
q8 = IFIR16(c[8],p8);
q9 = IFIR16(c[9],p9);
q10 = IFIR16(c[8],p10);
q11 = IFIR16(c[9],p11);
q12 = IFIR16(c[8],p12);
q13 = IFIR16(c[9],p13);
q14 = IFIR16(c[8],p14);
q15 = IFIR16(c[9],p15);
add0 = q0+q1;
add1 = q2+q3;
add2 = q4+q5;
add3 = q6+q7;
add4 = q8+q9;
add5 = q10+q11;
add6 = q12+q13;
add7 = q14+q15;
fbs[32] = ASRI(15,add0);
fbs[33] = ASRI(15,add1);
fbs[34] = ASRI(15,add2);
fbs[35] = ASRI(15,add3);
fbs[36] = ASRI(15,add4);
fbs[37] = ASRI(15,add5);
fbs[38] = ASRI(15,add6);
fbs[39] = ASRI(15,add7);
q0 = IFIR16(c[12],p0);
q1 = IFIR16(c[13],p1);
q2 = IFIR16(c[12],p2);
q3 = IFIR16(c[13],p3);
q4 = IFIR16(c[12],p4);
q5 = IFIR16(c[13],p5);
q6 = IFIR16(c[12],p6);
q7 = IFIR16(c[13],p7);
q8 = IFIR16(c[12],p8);
q9 = IFIR16(c[13],p9);
q10 = IFIR16(c[12],p10);
q11 = IFIR16(c[13],p11);
q12 = IFIR16(c[12],p12);
q13 = IFIR16(c[13],p13);
q14 = IFIR16(c[12],p14);
q15 = IFIR16(c[13],p15);
add0 = q0+q1;
add1 = q2+q3;
add2 = q4+q5;
add3 = q6+q7;
add4 = q8+q9;
add5 = q10+q11;
add6 = q12+q13;
add7 = q14+q15;
fbs[48] = ASRI(15,add0);
fbs[49] = ASRI(15,add1);
fbs[50] = ASRI(15,add2);
fbs[51] = ASRI(15,add3);
fbs[52] = ASRI(15,add4);
fbs[53] = ASRI(15,add5);
fbs[54] = ASRI(15,add6);
fbs[55] = ASRI(15,add7);
c = (int *)coef[1];
fbs = (short *)sfb[1];
q0 = IFIR16(c[0],p16);
q1 = IFIR16(c[1],p17);
q2 = IFIR16(c[0],p18);
q3 = IFIR16(c[1],p19);
q4 = IFIR16(c[0],p20);
q5 = IFIR16(c[1],p21);
q6 = IFIR16(c[0],p22);
q7 = IFIR16(c[1],p23);
q8 = IFIR16(c[0],p24);
q9 = IFIR16(c[1],p25);
q10 = IFIR16(c[0],p26);
q11 = IFIR16(c[1],p27);
q12 = IFIR16(c[0],p28);
q13 = IFIR16(c[1],p29);
q14 = IFIR16(c[0],p30);
q15 = IFIR16(c[1],p31);
add0 = q0+q1;
add1 = q2+q3;
add2 = q4+q5;
add3 = q6+q7;
add4 = q8+q9;
add5 = q10+q11;
add6 = q12+q13;
add7 = q14+q15;
fbs[0] = ASRI(15,add0);
fbs[1] = ASRI(15,add1);
fbs[2] = ASRI(15,add2);
fbs[3] = ASRI(15,add3);
fbs[4] = ASRI(15,add4);
fbs[5] = ASRI(15,add5);
fbs[6] = ASRI(15,add6);
fbs[7] = ASRI(15,add7);
q0 = IFIR16(c[4],p16);
q1 = IFIR16(c[5],p17);
q2 = IFIR16(c[4],p18);
q3 = IFIR16(c[5],p19);
q4 = IFIR16(c[4],p20);
q5 = IFIR16(c[5],p21);
q6 = IFIR16(c[4],p22);
q7 = IFIR16(c[5],p23);
q8 = IFIR16(c[4],p24);
q9 = IFIR16(c[5],p25);
q10 = IFIR16(c[4],p26);
q11 = IFIR16(c[5],p27);
q12 = IFIR16(c[4],p28);
q13 = IFIR16(c[5],p29);
q14 = IFIR16(c[4],p30);
q15 = IFIR16(c[5],p31);
add0 = q0+q1;
add1 = q2+q3;
add2 = q4+q5;
add3 = q6+q7;
add4 = q8+q9;
add5 = q10+q11;
add6 = q12+q13;
add7 = q14+q15;
fbs[16] = ASRI(15,add0);
fbs[17] = ASRI(15,add1);
fbs[18] = ASRI(15,add2);
fbs[19] = ASRI(15,add3);
fbs[20] = ASRI(15,add4);
fbs[21] = ASRI(15,add5);
fbs[22] = ASRI(15,add6);
fbs[23] = ASRI(15,add7);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -