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

📄 intlbt.cpp

📁 整数叠式变换,用c++编写的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	*(data1+6) = *(data1+6) + (*(data1+5) >>2);
	*(data1+5) = *(data1+5) - (*(data1+6) >>1);
	*(data1+6) = *(data1+6) + (*(data1+5) >>2);

	*(data1+7) = *(data1+7) + (*(data1+6) >>2) - (*(data1+6) >>5);
	*(data1+6) = *(data1+6) - (*(data1+7) >>2) - (*(data1+7) >>3) -(*(data1+7) >>5);
	*(data1+7) = *(data1+7) + (*(data1+6) >>2) - (*(data1+6) >>5);


}

void CIntLBT::I_IntLBT1D(int *data1, int *data2)
{
   /// data1 + data2  ---------> data1
   // 做一个 旋转逆变换
	*(data1+7) = *(data1+7) - (*(data1+6) >>2) + (*(data1+6) >>5);
	*(data1+6) = *(data1+6) + (*(data1+7) >>2) + (*(data1+7) >>3) + (*(data1+7) >>5);
	*(data1+7) = *(data1+7) - (*(data1+6) >>2) + (*(data1+6) >>5);

	*(data1+6) = *(data1+6) - (*(data1+5) >>2);
	*(data1+5) = *(data1+5) + (*(data1+6) >>1);
	*(data1+6) = *(data1+6) - (*(data1+5) >>2);

	*(data1+5) = *(data1+5) - (*(data1+4) >>2) + (*(data1+4) >>5);
	*(data1+4) = *(data1+4) + (*(data1+5) >>2) + (*(data1+5) >>3) + (*(data1+5) >>5);
    *(data1+5) = *(data1+5) - (*(data1+4) >>2) + (*(data1+4) >>5);
   
   *data1 = (*data1 - *(data1+4)) >>1;
   *(data1+1) = (*(data1+1) - *(data1+5)) >>1;
   *(data1+2) = (*(data1+2) - *(data1+6)) >>1;
   *(data1+3) = (*(data1+3) - *(data1+7)) >>1;
   
   // 做一个 旋转逆变换
   	*(data2+7) = *(data2+7) - (*(data2+6) >>2) + (*(data2+6) >>5);
	*(data2+6) = *(data2+6) + (*(data2+7) >>2) + (*(data2+7) >>3) + (*(data2+7) >>5);
	*(data2+7) = *(data2+7) - (*(data2+6) >>2) + (*(data2+6) >>5);

	*(data2+6) = *(data2+6) - (*(data2+5) >>2);
	*(data2+5) = *(data2+5) + (*(data2+6) >>1);
	*(data2+6) = *(data2+6) - (*(data2+5) >>2);

	*(data2+5) = *(data2+5) - (*(data2+4) >>2) + (*(data2+4) >>5);
	*(data2+4) = *(data2+4) + (*(data2+5) >>2) + (*(data2+5) >>3) + (*(data2+5) >>5);
    *(data2+5) = *(data2+5) - (*(data2+4) >>2) + (*(data2+4) >>5);

   *(data1+4) = (*data2 + *(data2+4)) >>1;
   *(data1+5) = (*(data2+1) + *(data2+5)) >>1;
   *(data1+6) = (*(data2+2) + *(data2+6)) >>1;
   *(data1+7) = (*(data2+3) + *(data2+7)) >>1;
//   I_DCT_Butterfly(data1);
}


void CIntLBT::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);

   int i;
   for (i=0; i<8; i++)  *(data+i) = *(datatmp+i);
   delete datatmp;
}

void CIntLBT::I_IntDCT1D(int *data)
{
	///////
	///        input X0, X2, X4, X6, X1, X3, X5, X7            
	////      output x0, x1,x2, ..., x7

	int *datatmp;
	datatmp = new int [8];
	*(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 CIntLBT::DCT_Butterfly1D(int *data)
{
   int *datatmp;
   datatmp = new int [8];
   IntDCT1D(data);
   ////   先做一个拉伸变换
   *(data+4) = *(data+4) + *data;
   *data = *data - (*(data+4) >>2) - (*(data+4) >>4);
   *(data+4) = *(data+4) - *data - (*data >>2) - (*data >>3) -(*data >>5);
   *data = *data + (*(data+4) >>2) - (*(data+4) >>5);

   int i;
   for (i=0; i<4; i++)
   {
      *(datatmp+i) = *(data+i) + *(data+i+4);
	  *(datatmp+i+4) = *(data+i) - *(data+i+4);
   }
   for (i=0; i<8; i++) *(data+i) = *(datatmp+i);
   delete datatmp;  

}

void CIntLBT::I_DCT_Butterfly(int *data)
{
    int *datatmp;
	datatmp = new int [8];
	int i;
	for (i=0; i<4; i++)
	{
		*(datatmp+i) = (*(data+i) + *(data+i+4)) >>1;
		*(datatmp+i+4) = (*(data+i) - *(data+i+4)) >>1;
	}
	////    做一个拉伸逆变换
	*datatmp = *datatmp - (*(datatmp+4) >>2) + (*(datatmp+4) >>5);
	*(datatmp+4) = *(datatmp+4) + *datatmp + (*datatmp >>2) + (*datatmp >>3) + (*datatmp >>5);
	*datatmp = *datatmp + (*(datatmp+4) >>2) + (*(datatmp+4) >>4);
	*(datatmp+4) = *(datatmp+4) - *datatmp;

    for (i=0; i<8; i++)  *(data+i) = *(datatmp+i);
	I_IntDCT1D(data);
	delete datatmp;
}

void CIntLBT::I_IntLBT_1to1(int *data)
{
   // 做一个 旋转逆变换
	int *data1;
	data1 = new int [8];
	int k;
	for (k=0; k<8; k++) *(data1+k) = *(data+k);
	*(data1+7) = *(data1+7) - (*(data1+6) >>2) + (*(data1+6) >>5);
	*(data1+6) = *(data1+6) + (*(data1+7) >>2) + (*(data1+7) >>3) + (*(data1+7) >>5);
	*(data1+7) = *(data1+7) - (*(data1+6) >>2) + (*(data1+6) >>5);

	*(data1+6) = *(data1+6) - (*(data1+5) >>2);
	*(data1+5) = *(data1+5) + (*(data1+6) >>1);
	*(data1+6) = *(data1+6) - (*(data1+5) >>2);

	*(data1+5) = *(data1+5) - (*(data1+4) >>2) + (*(data1+4) >>5);
	*(data1+4) = *(data1+4) + (*(data1+5) >>2) + (*(data1+5) >>3) + (*(data1+5) >>5);
    *(data1+5) = *(data1+5) - (*(data1+4) >>2) + (*(data1+4) >>5);
   
   *data = (*data1 + *(data1+4)) >>1;
   *(data+1) = (*(data1+1) + *(data1+5)) >>1;
   *(data+2) = (*(data1+2) + *(data1+6)) >>1;
   *(data+3) = (*(data1+3) + *(data1+7)) >>1;
   *(data+4) = (*data1 - *(data1+4)) >>1;
   *(data+5) = (*(data1+1) - *(data1+5)) >>1;
   *(data+6) = (*(data1+2) - *(data1+6)) >>1;
   *(data+7) = (*(data1+3) - *(data1+7)) >>1;
   delete data1;
}

⌨️ 快捷键说明

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