// IntDCT.cpp: implementation of the CIntDCT class.
// 作者:国防科技大学理学院数学系 张增辉 2001.11
// QQ: 15105473 email: zenghui1980@163.com
//
// 此为根据 T.D. Tran.的IntDCT流程图做的程序,包括以下部分:
// IntDCT2D(int **data, int height, int width) 二维的IntDCT变换,data为要进行变换的数据,height 和 w// idth分别为数据的尺寸
// I_IntDCT2D(int **data, int height, int width) 二维的IntDCT反变换,数据结构与正变换相同
// IntDCT1D(int *data) 一维IntDCT变换的程序,输入:x0 x1 ... x7;输出:X0 X2 X4 X6 X1 X3 X5 X7;
// I_IntDCT1D(int *data) 一维IntDCT反变换的程序,输入:X0 X2 X4 X6 X1 X3 X5 X7;输出:x0 x1 ... x7;
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "IntDCT.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CIntDCT::CIntDCT()
{
}
CIntDCT::~CIntDCT()
{
}
void CIntDCT::IntDCT1D(int *data)
{
//// input x0 x1 ... x7
//// output X0 X2 X4 X6 X1 X3 X5 X7
////
int *datatmp;
datatmp = new int [8];
*datatmp = *data + *(data + 7);
*(datatmp+1) = *(data+1) + *(data+6);
*(datatmp+2) = *(data+2) + *(data+5);
*(datatmp+3) = *(data+3) + *(data+4);
*(datatmp+4) = *(data+3) - *(data+4);
*(datatmp+5) = *(data+2) - *(data+5);
*(datatmp+6) = *(data+1) - *(data+6);
*(datatmp+7) = *data - *(data+7);
//蝶形运算结束
*data = *datatmp + *(datatmp+3);
*(data+1) = *(datatmp+1) + *(datatmp+2);
*(data+2) = *(datatmp+1) - *(datatmp+2);
*(data+3) = *datatmp - *(datatmp+3);
*data += *(data+1); //// *data = X0
*(data+1) = - *(data+1) + ((*data)>>1); /// *(data+1) = X4
*(data+3) = *(data+3) - (*(data+2) >>1) - (*(data+2) >>3);
*(data+2) += *(data+3);
*(data+3) = *(data+3) - (*(data+2) >>1) - (*(data+2) >>3);
// *(data+2) = X2 *(data+3) = X6
*(datatmp+5) = *(datatmp+5) - (*(datatmp+6) >>1) + (*(datatmp+6) >>4);
*(datatmp+6) = *(datatmp+6) + (*(datatmp+5) >>1) + (*(datatmp+5) >>2);
*(datatmp+5) = - *(datatmp+5) + (*(datatmp+6) >>1) - (*(datatmp+6) >>4);
*(data+4) = *(datatmp+4) + *(datatmp+5);
*(data+5) = *(datatmp+4) - *(datatmp+5);
*(data+6) = -*(datatmp+6) + *(datatmp+7);
*(data+7) = *(datatmp+6) + *(datatmp+7);
*(data+7) = *(data+7) - (*(data+4) >>1) -(*(data+4) >>2) -(*(data+4) >>4);
*(data+4) = *(data+4) + *(data+7);
*(data+7) = *(data+7) - (*(data+4) >>1) -(*(data+4) >>2) -(*(data+4) >>4);
// *(data+4) = X1 *(data+7) = X7
*(data+6) = *(data+6) - (*(data+5) >>2);
*(data+5) = *(data+5) + (*(data+6) >>1);
*(data+6) = *(data+6) - (*(data+5) >>2);
// *(data+5) = X3 *(data+7) = X5
/* *datatmp = *data; *(datatmp+1) = *(data+2);
*(datatmp+2) = *(data+1); *(datatmp+3) = *(data+3);
*(datatmp+4) = *(data+4); *(datatmp+5) = *(data+6);
*(datatmp+6) = *(data+5); *(datatmp+7) = *(data+7);
*/
*datatmp = *data; *(datatmp+1) = *(data+4);
*(datatmp+2) = *(data+2); *(datatmp+3) = *(data+6);
*(datatmp+4) = *(data+1); *(datatmp+5) = *(data+5);
*(datatmp+6) = *(data+3); *(datatmp+7) = *(data+7);
int i;
for (i=0; i<8; i++) *(data+i) = *(datatmp+i);
delete datatmp;
}
void CIntDCT::I_IntDCT1D(int *data)
{
///////
/// input X0, X2, X4, X6, X1, X3, X5, X7
//// output x0, x1,x2, ..., x7
int *datatmp;
datatmp = new int [8];
int i;
for (i=0; i<8; i++) *(datatmp+i) = *(data+i);
*data = *datatmp; *(data+1) = *(datatmp+2);
*(data+2) = *(datatmp+4); *(data+3) = *(datatmp+6) ;
*(data+4) = *(datatmp+1); *(data+5) = *(datatmp+3);
*(data+6) = *(datatmp+5); *(data+7) = *(datatmp+7);
*(datatmp+1) = - *(data+2) + (*data>>1);
*datatmp = *data - *(datatmp+1);
*(datatmp+3) = *(data+3) + (*(data+1) >>1) +(*(data+1) >>3);
*(datatmp+2) = *(data+1) - *(datatmp+3);
*(datatmp+3) = *(datatmp+3) +(*(datatmp+2) >>1) +(*(datatmp+2) >>3);
*(datatmp+6) = *(data+5) + (*(data+6) >>2);
*(datatmp+5) = *(data+6) - (*(datatmp+6) >>1);
*(datatmp+6) = *(datatmp+6) + (*(datatmp+5) >>2);
*(datatmp+7) = *(data+7) + (*(data+4) >>1) + (*(data+4) >>2) + (*(data+4) >>4);
*(datatmp+4) = *(data+4) - *(datatmp+7);
*(datatmp+7) = *(datatmp+7) + (*(datatmp+4) >>1) + (*(datatmp+4) >>2) + (*(datatmp+4) >>4);
// four inverse lifting step
*data = (*datatmp + *(datatmp+3)) >>1;
*(data+3) = (*datatmp - *(datatmp+3)) >>1;
*(data+1) = (*(datatmp+1) + *(datatmp+2)) >>1;
*(data+2) = (*(datatmp+1) - *(datatmp+2)) >>1;
*(data+4) = (*(datatmp+4) + *(datatmp+5)) >>1;
*(data+5) = (*(datatmp+4) - *(datatmp+5)) >>1;
*(data+6) = (- *(datatmp+6) + *(datatmp+7)) >>1;
*(data+7) = (*(datatmp+6) + *(datatmp+7)) >>1;
// four inverse butterfly
*(data+5) = - *(data+5) + (*(data+6) >>1) - (*(data+6) >>4);
*(data+6) = *(data+6) - (*(data+5) >>1) - (*(data+5) >>2);
*(data+5) = *(data+5) + (*(data+6) >>1) - (*(data+6) >>4);
/////////////////
*datatmp = (*data + *(data+7)) >>1;
*(datatmp+1) = (*(data+1) + *(data+6)) >>1;
*(datatmp+2) = (*(data+2) + *(data+5)) >>1;
*(datatmp+3) = (*(data+3) + *(data+4)) >>1;
*(datatmp+4) = (*(data+3) - *(data+4)) >>1;
*(datatmp+5) = (*(data+2) - *(data+5)) >>1;
*(datatmp+6) = (*(data+1) - *(data+6)) >>1;
*(datatmp+7) = (*data - *(data+7)) >>1;
// int i;
for(i=0; i<8; i++) *(data+i) = *(datatmp+i);
delete datatmp;
}
void CIntDCT::IntDCT2D(int **data, int height, int width)
{
int nheight, nwidth;
int i, j, k, l;
int *datatmp;
int ni, nj; //纪录处理数据的位置
datatmp = new int [8];
nheight = height >>3;
nwidth = width >>3;
ni = 0;
for (i=0; i<nheight; i++)
{
nj = 0;
for (j=0; j<nwidth; j++)
{ //对行做变换
for (k=0; k<8; k++)
{
for (l=0; l<8; l++)
*(datatmp+l) = *(*(data+ni+k) + nj+l);
IntDCT1D(datatmp);
for (l=0; l<8; l++)
*(*(data+ni+k) + nj+l) = *(datatmp + l);
}
////对列做变换
for (k=0; k<8; k++)
{
for (l=0; l<8; l++)
*(datatmp+l) = *(*(data+ni+l) + nj +k);
IntDCT1D(datatmp);
for (l=0; l<8; l++)
*(*(data+ni+l) + nj+k) = *(datatmp+l);
}
nj = nj + 8;
}
ni = ni + 8;
}
delete datatmp;
}
void CIntDCT::I_IntDCT2D(int **data, int height, int width)
{
int nheight, nwidth;
int i, j, k, l;
int *datatmp;
int ni, nj; //纪录处理数据的位置
datatmp = new int [8];
nheight = height >>3;
nwidth = width >>3;
ni = 0;
for (i=0; i<nheight; i++)
{
nj = 0;
for (j=0; j<nwidth; j++)
{
////对列做反变换
for (k=0; k<8; k++)
{
for (l=0; l<8; l++)
*(datatmp+l) = *(*(data+ni+l) + nj +k);
I_IntDCT1D(datatmp);
for (l=0; l<8; l++)
*(*(data+ni+l) + nj+k) = *(datatmp+l);
}
//对行做反变换
for (k=0; k<8; k++)
{
for (l=0; l<8; l++)
*(datatmp+l) = *(*(data+ni+k) + nj+l);
I_IntDCT1D(datatmp);
for (l=0; l<8; l++)
*(*(data+ni+k) + nj+l) = *(datatmp + l);
}
nj = nj + 8;
}
ni = ni + 8;
}
delete datatmp;
}
dct.rar_DCT变换_dct_dct calculator_离散余弦_离散余弦变换
版权申诉
7 浏览量
2022-09-19
15:42:51
上传
评论
收藏 6KB RAR 举报
JaniceLu
- 粉丝: 78
- 资源: 1万+