www.pudn.com > Videodisplay.rar > IntWT.cpp
// IntWT.cpp: implementation of the CIntWT class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include "SPIHTcoding.h"
#include "IntWT.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CIntWT::CIntWT()
{
width=512;
height=512; //默认为512*512
}
CIntWT::~CIntWT()
{
}
void CIntWT::IDCT(int buffer[], int bufferLen)
{
int b[5];
if( bufferLen != 4 )
return;
// *********************** DCT ************************************
b[0] = buffer[0] + (int)( -0.5942*buffer[1] - 4.025*buffer[2] - 1.435*buffer[3] +0.5 );
b[1] = buffer[1] + (int)( 0.6935*b[0] + 3.185*buffer[2] + 1.133*buffer[3] +0.5 );
b[2] = buffer[2] + (int)( 0.4413*b[0] +0.2114*b[1] +0.2114*buffer[3] +0.5 );
b[3] = buffer[3] + (int)( -0.6935*b[0] - 1.133*b[1] + 3.185*b[2] +0.5 );
b[4] = b[0] + (int)( 1.435*b[1] - 4.025*b[2] +0.5942*b[3] +0.5 );
memcpy( buffer, b+1, sizeof(int)*4 );
}
void CIntWT::IDCT_I(int buffer[], int bufferLen)
{
int b[5];
if( bufferLen != 4 )
return;
memcpy( b+1, buffer, sizeof(int)*4 );
// ********************** Reverse DCT *****************************
b[0] = b[4] - (int)( 1.435*b[1] - 4.025*b[2] +0.5942*b[3] +0.5 );
buffer[3] = b[3] - (int)( -0.6935*b[0] - 1.133*b[1] + 3.185*b[2] +0.5 );
buffer[2] = b[2] - (int)( 0.4413*b[0] +0.2114*b[1] +0.2114*buffer[3] +0.5 );
buffer[1] = b[1] - (int)( 0.6935*b[0] + 3.185*buffer[2] + 1.133*buffer[3] +0.5 );
buffer[0] = b[0] - (int)( -0.5942*buffer[1] - 4.025*buffer[2] - 1.435*buffer[3] +0.5 );
}
void CIntWT::FDCT(double buffer[], int bufferLen)
{
if( bufferLen != 4 )
return;
double a[4];
memcpy( a, buffer, sizeof(double)*4 );
buffer[0] = ( a[0] + a[1] + a[2] + a[3] )*0.5;
buffer[1] = 0.653281*( a[0]-a[3] ) + 0.270598*( a[1]-a[2] );
buffer[2] = ( a[0] - a[1] - a[2] + a[3] )*0.5;
buffer[3] = 0.270598*( a[0]-a[3] ) + 0.653281*( a[1]-a[2] );
}
void CIntWT::FDCT_I(double buffer[], int bufferLen)
{
if( bufferLen != 4 )
return;
double a[4];
memcpy( a, buffer, sizeof(double)*4 );
buffer[0] = ( a[0] + a[2] )*0.5 + 0.653281*a[1] + 0.270598*a[3];
buffer[2] = ( a[0] - a[2] )*0.5 + 0.270598*a[1] - 0.653281*a[3];
buffer[1] = ( a[0] - a[2] )*0.5 - 0.270598*a[1] + 0.653281*a[3];
buffer[3] = ( a[0] + a[2] )*0.5 - 0.653281*a[1] - 0.270598*a[3];
}
//
// 插值(2,2)正变换 5/3
//
void CIntWT::Interpolate_22_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+1];
dBuffer = new int [iLen+1];
sBuffer = new int [iLen];
memcpy( Buffer, buffer, sizeof(int)*bufferLen );
*(Buffer+bufferLen) = *Buffer; // 周期延拓Buffer
d = dBuffer+1;
p = Buffer+1;
// 计算d
for( l=0; l>1 );
d++;
p += 2;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓dBuffer
s = sBuffer;
d = dBuffer + 1;
p = Buffer;
// 计算s
for( l=0; l>1 );
s++;
d++;
p += 2;
}
// 记录结果
memcpy( buffer, sBuffer, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+1, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// 插值(2,2)逆变换
//
void CIntWT::Interpolate_22I_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l, *dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+1];
memcpy( sBuffer , buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
*dBuffer = *(dBuffer+iLen); // 周期延拓dBuffer
d = dBuffer+1;
s = sBuffer;
// 计算 s[2*l]
for( l=0; l>1 );
//buffer[2*l] = *s;
buffer[2*l]=(*s) - ( ( (*(d-1))+(*d)+2 )>>1 );
s++;
d++;
}
sBuffer[iLen] = sBuffer[0]; // 周期延拓sBuffer
s = sBuffer;
d = dBuffer+1;
// 计算 s[2*l+1]
for( l=0; l>1 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// 插值(4,2)正变换
//
void CIntWT::Interpolate_42_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+5];
dBuffer = new int [iLen+1];
sBuffer = new int [iLen];
memcpy( Buffer+2, buffer, sizeof(int)*bufferLen );
// 左右周期延拓
Buffer[0] = Buffer[bufferLen];
Buffer[1] = Buffer[bufferLen+1];
Buffer[bufferLen+4] = Buffer[4];
Buffer[bufferLen+3] = Buffer[3];
Buffer[bufferLen+2] = Buffer[2];
p = Buffer+3;
d = dBuffer+1;
// 计算d
for( l=0; l>4 );
p += 2;
d++;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓d
d = dBuffer+1;
p = Buffer+2;
s = sBuffer;
// 计算s
for( l=0; l>2 );
s++;
d++;
p += 2;
}
// 记录结果
memcpy( buffer, sBuffer, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+1, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// 插值(4,2)逆变换
//
void CIntWT::Interpolate_42I_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l, *dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+3];
memcpy( sBuffer+1, buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
*dBuffer = *(dBuffer+iLen); // 周期延拓
d = dBuffer+1;
s = sBuffer+1;
// 计算 s[2*l]
for( l=0; l>2 );
buffer[2*l] = *s;
s++;
d++;
}
sBuffer[0] = sBuffer[iLen]; // 周期延拓
*(s+1) = sBuffer[2];
*s = sBuffer[1];
s = sBuffer+1;
d = dBuffer+1;
// 计算 s[2*l+1]
for( l=0; l>4 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// 插值(2,4)正变换
//
void CIntWT::Interpolate_24_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+1];
dBuffer = new int [iLen+3];
sBuffer = new int [iLen];
memcpy( Buffer, buffer, sizeof(int)*bufferLen );
*(Buffer+bufferLen) = *Buffer; // right周期延拓
p = Buffer+1;
d = dBuffer+2;
// 计算d
for( l=0; l>1 );
d++;
p += 2;
}
// left延拓
dBuffer[0] = dBuffer[iLen];
dBuffer[1] = dBuffer[iLen+1];
*d = dBuffer[2];
p = Buffer;
d = dBuffer+2;
s = sBuffer;
// 计算s
for( l=0; l>6 );
s++;
d++;
p += 2;
}
// 记录结果
memcpy( buffer, sBuffer, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+2, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// 插值(2,4)逆变换
//
void CIntWT::Interpolate_24I_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+3];
sBuffer = new int [iLen+1];
memcpy( sBuffer , buffer, sizeof(int)*iLen );
memcpy( dBuffer+2, buffer+iLen, sizeof(int)*iLen );
dBuffer[0] = dBuffer[iLen]; // left周期延拓
dBuffer[1] = dBuffer[iLen+1];
dBuffer[iLen+2] = dBuffer[2]; // right
s = sBuffer;
d = dBuffer+2;
// 计算 s[2*l]
for( l=0; l>6 );
buffer[2*l] = *s;
s++;
d++;
}
*s = sBuffer[0]; // 周期延拓
s = sBuffer;
d = dBuffer+2;
// 计算 s[2*l+1]
for( l=0; l>1 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// 插值(4,4)正变换 13/7-T
//
void CIntWT::Interpolate_44_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+5];
dBuffer = new int [iLen+3];
sBuffer = new int [iLen];
memcpy( Buffer+2, buffer, sizeof(int)*bufferLen );
// 左右周期延拓
Buffer[0] = Buffer[bufferLen]; // left
Buffer[1] = Buffer[bufferLen+1];
Buffer[bufferLen+4] = Buffer[4]; // right
Buffer[bufferLen+3] = Buffer[3];
Buffer[bufferLen+2] = Buffer[2];
d = dBuffer+2;
p = Buffer+3;
// 计算d
for( l=0; l>4 );
d++;
p += 2;
}
// 周期延拓
dBuffer[1] = dBuffer[iLen+1];
dBuffer[0] = dBuffer[iLen];
*d = dBuffer[2];
s = sBuffer;
d = dBuffer+2;
p = Buffer+2;
// 计算s
for( l=0; l>5 );
s++;
d++;
p += 2;
}
// 记录结果
memcpy( buffer, sBuffer, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+2, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// 插值(4,4)逆变换
//
void CIntWT::Interpolate_44I_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+3];
sBuffer = new int [iLen+3];
memcpy( sBuffer+1, buffer, sizeof(int)*iLen );
memcpy( dBuffer+2, buffer+iLen, sizeof(int)*iLen );
// 周期延拓
*(dBuffer+1) = *(dBuffer+iLen+1); // left
*dBuffer = *(dBuffer+iLen);
*(dBuffer+iLen+2) = *(dBuffer+2); // right
d = dBuffer+2;
s = sBuffer+1;
// 计算 s[2*l]
for( l=0; l>5 );
buffer[2*l] = *s;
s++;
d++;
}
sBuffer[0] = sBuffer[iLen]; // 周期延拓
sBuffer[iLen+1] = sBuffer[1];
sBuffer[iLen+2] = sBuffer[2];
d = dBuffer+2;
s = sBuffer+1;
// 计算 s[2*l+1]
for( l=0; l>4 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// 插值(6,2)正变换
//
void CIntWT::Interpolate_62_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+9];
dBuffer = new int [iLen+1];
sBuffer = new int [iLen];
memcpy( Buffer+4, buffer, sizeof(int)*bufferLen );
// 周期延拓
Buffer[0] = Buffer[bufferLen]; // left
Buffer[1] = Buffer[bufferLen+1];
Buffer[2] = Buffer[bufferLen+2];
Buffer[3] = Buffer[bufferLen+3];
Buffer[bufferLen+8] = Buffer[8]; // right
Buffer[bufferLen+7] = Buffer[7];
Buffer[bufferLen+6] = Buffer[6];
Buffer[bufferLen+5] = Buffer[5];
Buffer[bufferLen+4] = Buffer[4];
p = Buffer+5;
d = dBuffer+1;
// 计算d
for( l=0; l>8 );
d++;
p += 2;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓
d = dBuffer+1;
s = sBuffer;
p = Buffer+4;
// 计算s
for( l=0; l>2 );
p += 2;
s++;
d++;
}
// 记录结果
memcpy( buffer, sBuffer, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+1, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// 插值(6,2)逆变换
//
void CIntWT::Interpolate_62I_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+5];
memcpy( sBuffer+2, buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
*dBuffer = *(dBuffer+iLen); // 周期延拓
d = dBuffer+1;
s = sBuffer+2;
// 计算 s[2*l]
for( l=0; l>2 );
buffer[2*l] = *s;
s++;
d++;
}
sBuffer[0] = sBuffer[iLen]; // 周期延拓
sBuffer[1] = sBuffer[iLen+1];
sBuffer[iLen+2] = sBuffer[2];
sBuffer[iLen+3] = sBuffer[3];
sBuffer[iLen+4] = sBuffer[4];
d = dBuffer+1;
s = sBuffer+2;
// 计算 s[2*l+1]
for( l=0; l>8 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// (2+2,2) transform
//
void CIntWT::IntWT_22_2_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+1];
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+3];
memcpy( Buffer, buffer, sizeof(int)*bufferLen );
*(Buffer+bufferLen) = *Buffer; // 周期延拓
p = Buffer+1;
d = dBuffer+1;
// 计算中间变量d(1)
for( l=0; l>1 );
d++;
p += 2;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓d(1)
d = dBuffer+1;
s = sBuffer+1;
p = Buffer;
// 计算s
for( l=0; l>2 );
s++;
d++;
p += 2;
}
sBuffer[iLen+1] = sBuffer[1]; // 周期延拓s
sBuffer[iLen+2] = sBuffer[2];
sBuffer[0] = sBuffer[iLen];
d = dBuffer+1;
s = sBuffer+1;
// 计算d
for( l=0; l>4 );
d++;
s++;
}
// 记录结果
memcpy( buffer, sBuffer+1, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+1, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// (2+2,2) inverse transform
//
void CIntWT::IntWT_22_2I_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+3];
memcpy( sBuffer+1, buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
*sBuffer = *(sBuffer+iLen); // 周期延拓
sBuffer[iLen+2] = sBuffer[2];
sBuffer[iLen+1] = sBuffer[1];
d = dBuffer+1;
s = sBuffer+1;
// 计算 d(1)
for( l=0; l>4 );
d++;
s++;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓d(1)
d = dBuffer+1;
s = sBuffer+1;
// 计算 s[2*l]
for( l=0; l>2 );
buffer[2*l] = *s;
s++;
d++;
}
*s = sBuffer[1]; // 周期延拓s
s = sBuffer+1;
d = dBuffer+1;
// 计算 s[2l+1]
for( l=0; l>1 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// D4 orthogonal transform
//
void CIntWT::IntWT_D4_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*dBuffer, *sBuffer, *d, *s, *p;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+1];
p = buffer+1;
d = dBuffer+1;
// 计算中间变量d(1)
for( l=0; l>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+1];
memcpy( sBuffer , buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
sBuffer[iLen] = sBuffer[0]; // 周期延拓
d = dBuffer+1;
s = sBuffer+1;
// 计算 d(1)
for( l=0; l>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+1];
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+1];
memcpy( Buffer, buffer, sizeof(int)*bufferLen );
*(Buffer+bufferLen) = *Buffer; // 周期延拓
d = dBuffer+1;
p = Buffer+1;
// 计算中间变量d(1)
for( l=0; l>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+1];
memcpy( sBuffer , buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
dBuffer[0] = dBuffer[iLen]; // 周期延拓
d = dBuffer+1;
s = sBuffer;
// 计算 s(1)
for( l=0; l>1, l,
*dBuffer, *sBuffer, *p, *d, *s;
dBuffer = new int [iLen];
sBuffer = new int [iLen+2];
d = dBuffer;
p = buffer;
// 计算d(1)
for( l=0; l>1 );
s++; d++;
p += 2;
}
sBuffer[iLen+1] = sBuffer[1]; // 周期延拓sBuffer
sBuffer[0] = sBuffer[iLen];
s = sBuffer;
d = dBuffer;
// 计算d
for( l=0; l>2 );
d++; s++;
}
// 记录结果
memcpy( buffer, sBuffer+1, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer , sizeof(int)*iLen ); // 高半带
delete []sBuffer;
delete []dBuffer;
}
//
// 2/6 Inverse
//
void CIntWT::IntWT_26I_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l, *dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen];
sBuffer = new int [iLen+2];
memcpy( sBuffer+1, buffer, sizeof(int)*iLen );
memcpy( dBuffer , buffer+iLen, sizeof(int)*iLen );
*sBuffer = *(sBuffer+iLen); // 周期延拓sBuffer
sBuffer[iLen+1] = sBuffer[1];
d = dBuffer;
s = sBuffer;
// 计算 d(1)
for( l=0; l>2 );
s++;
d++;
}
d = dBuffer;
s = sBuffer+1;
// 计算 s[2*l]
for( l=0; l>1 );
buffer[2*l] = *s;
s++;
d++;
}
s = sBuffer+1;
d = dBuffer;
// 计算 s[2*l+1]
for( l=0; l>1, l,
*dBuffer, *sBuffer, *p, *d, *s;
dBuffer = new int [iLen];
sBuffer = new int [iLen+4];
d = dBuffer;
p = buffer;
// 计算d(1)
for( l=0; l>1 );
s++; d++;
p += 2;
}
sBuffer[iLen+2] = sBuffer[2]; // 周期延拓sBuffer
sBuffer[iLen+3] = sBuffer[3];
sBuffer[1] = sBuffer[iLen+1];
sBuffer[0] = sBuffer[iLen];
s = sBuffer;
d = dBuffer;
// 计算d
for( l=0; l>6 );
d++; s++;
}
// 记录结果
memcpy( buffer, sBuffer+2, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer , sizeof(int)*iLen ); // 高半带
delete []sBuffer;
delete []dBuffer;
}
//
// 2/10 Inverse
//
void CIntWT::IntWT_210I_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l, *dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen];
sBuffer = new int [iLen+4];
memcpy( sBuffer+2, buffer, sizeof(int)*iLen );
memcpy( dBuffer , buffer+iLen, sizeof(int)*iLen );
sBuffer[iLen+2] = sBuffer[2]; // 周期延拓sBuffer
sBuffer[iLen+3] = sBuffer[3];
sBuffer[1] = sBuffer[iLen+1];
sBuffer[0] = sBuffer[iLen];
d = dBuffer;
s = sBuffer;
// 计算 d(1)
for( l=0; l>6 );
s++;
d++;
}
d = dBuffer;
s = sBuffer+2;
// 计算 s[2*l]
for( l=0; l>1 );
buffer[2*l] = *s;
s++;
d++;
}
s = sBuffer+2;
d = dBuffer;
// 计算 s[2*l+1]
for( l=0; l>1, l,
*dBuffer, *sBuffer, *p, *d, *s;
dBuffer = new int [iLen+2];
sBuffer = new int [iLen+4];
d = dBuffer+1;
p = buffer;
// 计算d(1)
for( l=0; l>4 );
s++; d++;
p += 2;
}
sBuffer[iLen+2] = sBuffer[2]; // 周期延拓sBuffer
sBuffer[iLen+3] = sBuffer[3];
sBuffer[0] = sBuffer[iLen];
sBuffer[1] = sBuffer[iLen+1];
s = sBuffer;
d = dBuffer+1;
// 计算d
for( l=0; l>4 );
d++; s++;
}
// 记录结果
memcpy( buffer, sBuffer+2, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+1, sizeof(int)*iLen ); // 高半带
delete []sBuffer;
delete []dBuffer;
}
//
// 6-14 Inverse
//
void CIntWT::IntWT_614I_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l, *dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+2];
sBuffer = new int [iLen+4];
memcpy( sBuffer+2, buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
sBuffer[iLen+2] = sBuffer[2]; // 周期延拓sBuffer
sBuffer[iLen+3] = sBuffer[3];
sBuffer[0] = sBuffer[iLen];
sBuffer[1] = sBuffer[iLen+1];
s = sBuffer;
d = dBuffer+1;
// 计算 d(1)
for( l=0; l>4 );
s++;
d++;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓dBuffer
dBuffer[iLen+1] = dBuffer[1];
s = sBuffer+2;
d = dBuffer+1;
// 计算 s[2*l]
for( l=0; l>4 );
buffer[2*l] = *s;
s++;
d++;
}
s = sBuffer+2;
d = dBuffer+1;
// 计算 s[2*l+1]
for( l=0; l>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+1];
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+3];
memcpy( Buffer, buffer, sizeof(int)*bufferLen );
*(Buffer+bufferLen) = *Buffer; // 周期延拓
p = Buffer+1;
d = dBuffer+1;
// 计算中间变量d(1)
for( l=0; l>1 );
d++;
p += 2;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓d(1)
d = dBuffer+1;
s = sBuffer+1;
p = Buffer;
// 计算s
for( l=0; l>2 );
s++;
d++;
p += 2;
}
sBuffer[iLen+1] = sBuffer[1]; // 周期延拓s
sBuffer[iLen+2] = sBuffer[2];
sBuffer[0] = sBuffer[iLen];
d = dBuffer+1;
s = sBuffer+1;
// 计算d
for( l=0; l>5 );
d++;
s++;
}
// 记录结果
memcpy( buffer, sBuffer+1, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+1, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// 5/11-A
//
void CIntWT::IntWT_511AI_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+3];
memcpy( sBuffer+1, buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
*sBuffer = *(sBuffer+iLen); // 周期延拓
sBuffer[iLen+2] = sBuffer[2];
sBuffer[iLen+1] = sBuffer[1];
d = dBuffer+1;
s = sBuffer+1;
// 计算 d(1)
for( l=0; l>5 );
d++;
s++;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓d(1)
d = dBuffer+1;
s = sBuffer+1;
// 计算 s[2*l]
for( l=0; l>2 );
buffer[2*l] = *s;
s++;
d++;
}
*s = sBuffer[1]; // 周期延拓s
s = sBuffer+1;
d = dBuffer+1;
// 计算 s[2l+1]
for( l=0; l>1 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// 5/11-C
//
void CIntWT::IntWT_511C_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+1];
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+3];
memcpy( Buffer, buffer, sizeof(int)*bufferLen );
*(Buffer+bufferLen) = *Buffer; // 周期延拓
p = Buffer+1;
d = dBuffer+1;
// 计算中间变量d(1)
for( l=0; l>1 );
d++;
p += 2;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓d(1)
d = dBuffer+1;
s = sBuffer+1;
p = Buffer;
// 计算s
for( l=0; l>2 );
s++;
d++;
p += 2;
}
sBuffer[iLen+1] = sBuffer[1]; // 周期延拓s
sBuffer[iLen+2] = sBuffer[2];
sBuffer[0] = sBuffer[iLen];
d = dBuffer+1;
s = sBuffer+1;
// 计算d
for( l=0; l>4 );
d++;
s++;
}
// 记录结果
memcpy( buffer, sBuffer+1, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+1, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// 5/11-C Inverse
//
void CIntWT::IntWT_511CI_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+3];
memcpy( sBuffer+1, buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
*sBuffer = *(sBuffer+iLen); // 周期延拓
sBuffer[iLen+2] = sBuffer[2];
sBuffer[iLen+1] = sBuffer[1];
d = dBuffer+1;
s = sBuffer+1;
// 计算 d(1)
for( l=0; l>4 );
d++;
s++;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓d(1)
d = dBuffer+1;
s = sBuffer+1;
// 计算 s[2*l]
for( l=0; l>2 );
buffer[2*l] = *s;
s++;
d++;
}
*s = sBuffer[1]; // 周期延拓s
s = sBuffer+1;
d = dBuffer+1;
// 计算 s[2l+1]
for( l=0; l>1 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// 13/7-C
//
void CIntWT::IntWT_137C_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+5];
dBuffer = new int [iLen+3];
sBuffer = new int [iLen];
memcpy( Buffer+2, buffer, sizeof(int)*bufferLen );
// 左右周期延拓
Buffer[0] = Buffer[bufferLen]; // left
Buffer[1] = Buffer[bufferLen+1];
Buffer[bufferLen+4] = Buffer[4]; // right
Buffer[bufferLen+3] = Buffer[3];
Buffer[bufferLen+2] = Buffer[2];
d = dBuffer+2;
p = Buffer+3;
// 计算d
for( l=0; l>4 );
d++;
p += 2;
}
// 周期延拓
dBuffer[1] = dBuffer[iLen+1];
dBuffer[0] = dBuffer[iLen];
*d = dBuffer[2];
s = sBuffer;
d = dBuffer+2;
p = Buffer+2;
// 计算s
for( l=0; l>4 );
s++;
d++;
p += 2;
}
// 记录结果
memcpy( buffer, sBuffer, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+2, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// 13/7-C Inverse
//
void CIntWT::IntWT_137CI_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+3];
sBuffer = new int [iLen+3];
memcpy( sBuffer+1, buffer, sizeof(int)*iLen );
memcpy( dBuffer+2, buffer+iLen, sizeof(int)*iLen );
// 周期延拓
*(dBuffer+1) = *(dBuffer+iLen+1); // left
*dBuffer = *(dBuffer+iLen);
*(dBuffer+iLen+2) = *(dBuffer+2); // right
d = dBuffer+2;
s = sBuffer+1;
// 计算 s[2*l]
for( l=0; l>4 );
buffer[2*l] = *s;
s++;
d++;
}
sBuffer[0] = sBuffer[iLen]; // 周期延拓
sBuffer[iLen+1] = sBuffer[1];
sBuffer[iLen+2] = sBuffer[2];
d = dBuffer+2;
s = sBuffer+1;
// 计算 s[2*l+1]
for( l=0; l>4 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// SPB
//
void CIntWT::IntWT_SPB_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*deBuffer, *sBuffer, *p, *s, *de;
deBuffer = new int [iLen+1];
sBuffer = new int [iLen+2];
de = deBuffer;
p = buffer;
// 计算d(1)
for( l=0; l>1 );
s++;
de++;
p += 2;
}
sBuffer[iLen+1] = sBuffer[1]; // 周期延拓sBuffer
sBuffer[0] = sBuffer[iLen];
deBuffer[iLen] = 0; // 补0
s = sBuffer+1;
de = deBuffer;
p = buffer+iLen;
// 计算d
for( l=0; l>3 );
de++;
p++;
s++;
}
// 记录结果
memcpy( buffer, sBuffer+1, sizeof(int)*iLen ); // 低半带
// memcpy( buffer+iLen, dBuffer , sizeof(int)*iLen ); // 高半带
delete []sBuffer;
delete []deBuffer;
}
//
// SPB Inverse
//
void CIntWT::IntWT_SPBI_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l, *deBuffer, *dBuffer, *sBuffer, *de, *d, *s;
dBuffer = new int [iLen];
deBuffer = new int [iLen+1];
sBuffer = new int [iLen+2];
memcpy( sBuffer+1, buffer, sizeof(int)*iLen );
memcpy( dBuffer , buffer+iLen, sizeof(int)*iLen );
sBuffer[0] = sBuffer[iLen]; // 周期延拓sBuffer
sBuffer[iLen+1] = sBuffer[1];
deBuffer[iLen] = 0; // 补0
d = dBuffer+iLen-1;
de = deBuffer+iLen-1;
s = sBuffer+iLen;
// 计算 d(1)
for( l=0; l>3 );
s--;
d--;
de--;
}
de = deBuffer;
s = sBuffer+1;
// 计算 s[2*l]
for( l=0; l>1 );
buffer[2*l] = *s;
s++;
de++;
}
s = sBuffer+1;
de = deBuffer;
// 计算 s[2*l+1]
for( l=0; l>1, l,
*deBuffer, *sBuffer, *p, *de, *s;
deBuffer = new int [iLen+1];
sBuffer = new int [iLen+3];
de = deBuffer;
p = buffer;
// 计算d(1)
for( l=0; l>1 );
s++;
de++;
p += 2;
}
sBuffer[iLen+2] = sBuffer[2]; // 周期延拓sBuffer
sBuffer[0] = sBuffer[iLen];
sBuffer[1] = sBuffer[iLen+1];
deBuffer[iLen] = 0; // 补0
s = sBuffer+2;
de = deBuffer;
p = buffer+iLen;
// 计算d
for( l=0; l>4 );
de++;
s++;
p++;
}
// 记录结果
memcpy( buffer, sBuffer+2, sizeof(int)*iLen ); // 低半带
// memcpy( buffer+iLen, dBuffer , sizeof(int)*iLen ); // 高半带
delete []sBuffer;
delete []deBuffer;
}
//
// SPC Inverse
//
void CIntWT::IntWT_SPCI_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*deBuffer, *dBuffer, *sBuffer, *de, *d, *s;
deBuffer = new int [iLen+1];
dBuffer = new int [iLen];
sBuffer = new int [iLen+3];
memcpy( sBuffer+2, buffer, sizeof(int)*iLen );
memcpy( dBuffer , buffer+iLen, sizeof(int)*iLen );
sBuffer[0] = sBuffer[iLen]; // 周期延拓sBuffer
sBuffer[1] = sBuffer[iLen+1];
sBuffer[iLen+2] = sBuffer[2];
deBuffer[iLen] = 0; // 补0
d = dBuffer+iLen-1;
de = deBuffer+iLen-1;
s = sBuffer+iLen+1;
// 计算 d(1)
for( l=0; l>4 );
s--;
d--;
de--;
}
de = deBuffer;
s = sBuffer+2;
// 计算 s[2*l]
for( l=0; l>1 );
buffer[2*l] = *s;
s++;
de++;
}
s = sBuffer+2;
de = deBuffer;
// 计算 s[2*l+1]
for( l=0; l>1, l,
*Buffer, *dBuffer, *sBuffer, *p, *d, *s;
Buffer = new int [bufferLen+5];
dBuffer = new int [iLen+1];
sBuffer = new int [iLen];
memcpy( Buffer+2, buffer, sizeof(int)*bufferLen );
// 左右周期延拓
Buffer[0] = Buffer[bufferLen]; // left
Buffer[1] = Buffer[bufferLen+1];
Buffer[bufferLen+4] = Buffer[4]; // right
Buffer[bufferLen+3] = Buffer[3];
Buffer[bufferLen+2] = Buffer[2];
d = dBuffer+1;
p = Buffer+3;
// 计算d
for( l=0; l>4 );
d++;
p += 2;
}
dBuffer[0] = dBuffer[iLen]; // 周期延拓
s = sBuffer;
d = dBuffer+1;
p = Buffer+2;
// 计算s
for( l=0; l>2 );
s++;
d++;
p += 2;
}
// 记录结果
memcpy( buffer, sBuffer, sizeof(int)*iLen ); // 低半带
memcpy( buffer+iLen, dBuffer+1, sizeof(int)*iLen ); // 高半带
delete []Buffer;
delete []sBuffer;
delete []dBuffer;
}
//
// 9/7-M Inverse
//
void CIntWT::IntWT_97MI_1D(int buffer[], int bufferLen)
{
int iLen = bufferLen>>1, l,
*dBuffer, *sBuffer, *d, *s;
dBuffer = new int [iLen+1];
sBuffer = new int [iLen+3];
memcpy( sBuffer+1, buffer, sizeof(int)*iLen );
memcpy( dBuffer+1, buffer+iLen, sizeof(int)*iLen );
dBuffer[0] = dBuffer[iLen]; // 周期延拓
d = dBuffer+1;
s = sBuffer+1;
// 计算 s[2*l]
for( l=0; l>2 );
buffer[2*l] = *s;
s++;
d++;
}
sBuffer[0] = sBuffer[iLen]; // 周期延拓
sBuffer[iLen+1] = sBuffer[1];
sBuffer[iLen+2] = sBuffer[2];
d = dBuffer+1;
s = sBuffer+1;
// 计算 s[2*l+1]
for( l=0; l>4 );
d++;
s++;
}
delete []sBuffer;
delete []dBuffer;
}
//
// 二维整数小波变换, 直接对数组pBuffer操作,即函数结束后,pBuffer的值已变
// 做Form型变换,分解Level次
//
BOOL CIntWT::IntWT_2D( int *pBuffer, int Form, int Level )
{
if( pBuffer == NULL )
return( FALSE );
int i, j, k = 0, Size = 512, p[512];
while( k>1;
}
return( TRUE );
}
//
// 二维整数小波逆变换, 直接对数组pBuffer操作,即函数结束后,pBuffer的值已变
// 做Form型变换,分解Level次
//
BOOL CIntWT::IntWT_2D_I( int *pBuffer, int Form, int Level )
{
if( pBuffer == NULL )
return( FALSE );
int i, j, k = Level, Size, p[512];
Size = 512>>(Level-1);
while( k>0 )
{
// 处理各列
for( j=0; j255)
resultData[j*width+i]=255;
else if(result[(height-j-1)*width+i]<0)
resultData[j*width+i]=0;
else
resultData[j*width+i]=(BYTE)(floor(result[(height-j-1)*width+i]+0.5));
}
}
width=512;
height=512;
delete []result;
}