void CWaveletTransform::DB4DWT(double Data[], int n) // DB4小波变换
{
if ( n>=4 )
{
int i=0, j=0;
int half = n >> 1;
double *tmp = new double[n];
for (j=0; j<half; j++)
{
tmp[j] = Data[(2*j)%n]*h0+
Data[(2*j+1)%n]*h1+
Data[(2*j+2)%n]*h2+
Data[(2*j+3)%n]*h3;
tmp[j+half] = Data[(2*j)%n]*g0+
Data[(2*j+1)%n]*g1+
Data[(2*j+2)%n]*g2+
Data[(2*j+3)%n]*g3;
}
for (i=0; i<n; i++)
{
Data[i] = tmp[i];
}
delete []tmp;
}
}
void CWaveletTransform::DB4LiftDWT(double Data[], int n)
{
int half = n>>1;
double *pS = new double[half]; //临时变量存放平滑系数
double *pD = new double[half]; //临时变量存放细节系数
for (int i=0; i<half; i++)
{
pS[i] = Data[2*i]; //even
pD[i] = Data[2*i+1]; //odd
}
for (int i=0; i<half; i++) //DB4变换Update1
{
pS[i] = pS[i] + pD[i] * sqrt(3.0);
}
for (int i=0; i<half; i++) //DB4的predict
{
pD[i] = pD[i] - sqrt(3.0)*pS[i]/4
- (sqrt(3.0)-2)*pS[(i-1)>0 ? (i-1) : (half+i-1)]/4; //边界采用周期延拓
}
for (int i = 0; i<half; i++) //DB4的updata2
{
pS[i] = pS[i] - pD[(i+1)%half]; //边界采用周期延拓
}
for (int i = 0; i<half; i++)
{
pS[i] = (sqrt(3.0)-1)*pS[i]/sqrt(2.0); //比例系数
pS[i] = (sqrt(3.0)+1)*pD[i]/sqrt(2.0);
}
for (int i=0; i<half; i++)
{
Data[i] = pS[i]; //将平滑系数放回原数组
}
for (int i=half; i<n; i++)
{
Data[i] = pD[i-half]; //将细节系数放回原数组
}
delete []pD;
delete []pS;
}