DB4小波及其提升算法

原创
2010/04/23 10:23
阅读数 3.4K

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;
}

展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
打赏
1 评论
1 收藏
0
分享
返回顶部
顶部