📄 d_idct.cpp
字号:
#include <math.h>
#include <iostream.h>
#include <iomanip.h>
//#define PI 201 //3.1415926 Q6
#define C 45 //1/sqrt(2) Q6
#define QUAR 1 //1/4 Q2
void main(void)
{
int u,v,x,y; //数组变量
int CU,CV; //系数
int AX,AY; //角度
int COSAX,COSAY; //
long TEMP;
long I[8][8]={0}; //FDCT结果
int D[8][8]=
{
{123,157,142,127,131,102,99,235},
{134,135,157,112,109,106,108,136},
{135,144,159,108,112,118,109,126},
{176,183,161,111,186,130,132,133},
{137,149,154,126,185,146,131,132},
{121,130,127,146,205,150,130,126},
{117,151,160,181,250,161,134,125},
{168,170,171,178,183,179,112,124}
}; //初始数据
long F[8][8]=
{
{1136,48,-40,-4,30,-77,13,46},
{-72,-4,114,-74,-7,-3,21,-6},
{16,-12,0,-44,25,-3,17,-39},
{7,-62,-15,-13,36,-25,-19,4},
{50,13,35,-5,9,-22,6,-8},
{42,-11,-9,-5,20,-30,-21,13},
{-16,-8,20,-7,3,1,11,-23},
{1,-14,-12,-18,-5,-2,6,-5}
};
int C_TABLE[360]={64,64,64,64,64,64,64,64,63,63,
63,63,63,62,62,62,62,61,61,61,
60,60,59,59,58,58,58,57,57,56,
55,55,54,54,53,52,52,51,50,50,
49,48,48,47,46,45,44,44,43,42,
41,40,39,39,38,37,36,35,34,33,
32,31,30,29,28,27,26,25,24,23,
22,21,20,19,18,17,15,14,13,12,
11,10,9,8,7,6,4,3,2,1,
0,-1,-2,-3,-4,-6,-7,-8,-9,-10,
-11,-12,-13,-14,-15,-17,-18,-19,-20,-21,
-22,-23,-24,-25,-26,-27,-28,-29,-30,-31,
-32,-33,-34,-35,-36,-37,-38,-38,-39,-40,
-41,-42,-43,-44,-44,-45,-46,-47,-48,-48,
-49,-50,-50,-51,-52,-52,-53,-54,-54,-55,
-55,-56,-56,-57,-58,-58,-58,-59,-59,-60,
-60,-61,-61,-61,-62,-62,-62,-62,-63,-63,
-63,-63,-63,-64,-64,-64,-64,-64,-64,-64,
-64,-64,-64,-64,-64,-64,-64,-64,-63,-63,
-63,-63,-63,-62,-62,-62,-62,-61,-61,-61,
-60,-60,-59,-59,-58,-58,-58,-57,-57,-56,
-55,-55,-54,-54,-53,-52,-52,-51,-50,-50,
-49,-48,-48,-47,-46,-45,-44,-44,-43,-42,
-41,-40,-39,-39,-38,-37,-36,-35,-34,-33,
-32,-31,-30,-29,-28,-27,-26,-25,-24,-23,
-22,-21,-20,-19,-18,-17,-16,-14,-13,-12,
-11,-10,-9,-8,-7,-6,-5,-3,-2,-1,
0,2,3,4,6,7,8,9,10,11,
12,13,14,15,17,18,19,20,21,22,
23,24,25,26,27,28,29,30,31,32,
33,34,35,36,37,38,38,39,40,41,
42,43,44,44,45,46,47,48,48,49,
50,50,51,52,52,53,54,54,55,55,
56,56,57,57,58,58,59,59,60,60,
60,61,61,62,62,62,62,63,63,63,
63,63,64,64,64,64,64,64,64,64};
for (x=0;x<8;x++)
for (y=0;y<8;y++)
for (u=0;u<8;u++)
for (v=0;v<8;v++)
{
if (u==0)
CU=C;
else
CU=64;
if (v==0)
CV=C;
else
CV=64;
AX=(2*x+1)*u*180/16;
AY=(2*y+1)*v*180/16;
if (AX>=0 && AX<360)
AX=AX;
if ((AX>=360)&&(AX<720))
AX=AX-360;
if ((AX>=720)&&(AX<1080))
AX=AX-720;
if (AX>=1080)
AX=AX-1080;
if ((AY>=0)&&(AY<360))
AY=AY;
if ((AY>=360)&&(AY<720))
AY=AY-360;
if ((AY>=720)&&(AY<1080))
AY=AY-720;
if (AY>=1080)
AY=AY-1080;
COSAX=C_TABLE[AX]; //Q6
COSAY=C_TABLE[AY]; //Q6
TEMP=CV*F[u][v]; //Q6
TEMP=CU*TEMP>>6; //Q12
TEMP=QUAR*TEMP; //Q18
TEMP=((TEMP*COSAX)>>6); //Q19
TEMP=((TEMP*COSAY)>>6); //Q20
I[x][y]+=TEMP; //Q20
// I[x][y]+=0.25*CU*CV*F[u][v]*cos((2*x+1)*u*pi/16)*cos((2*y+1)*v*pi/16);
}
cout<<"RESULTS OF D_IDCT "<<endl;
for (x=0;x<8;x++)
{
for (y=0;y<8;y++)
{
cout<<setw(8)<<(I[x][y]>>8)<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<endl;
cout<<"THE ERRORS ARE:"<<endl;
for (x=0;x<8;x++)
{
for (y=0;y<8;y++)
{
cout<<setw(8)<<(((int)I[x][y]>>8)-D[x][y])<<" ";
}
cout<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -