⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intdct.cpp

📁 该程序实现各种小波提升分解
💻 CPP
字号:
// 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);*(buffer+i*width+j)
			   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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -