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

📄 wt.cpp

📁 小波变换程序
💻 CPP
字号:
// WT.cpp: implementation of the CWT class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "wt1d.h"
#include "WT.h"
#include "fstream.h"
#include "math.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

float CWT::c1[8]={1.5f,1.12f,1.03f,1.01f,1.0f,1.0f,1.0f,1.0f};

float CWT::g[2]={-2.0f,2.0f};

float CWT::h[4]={0.125f,0.375f,0.375f,0.125f};

float CWT::k1[6]={0.0078125f,0.054685f,0.171875f,-0.171875f,-0.054685f,-0.0078125f};

CWT::CWT()
{
	m_data=m_result=NULL;
	m_pn=m_ln=0;
}

CWT::~CWT()
{
	ReleaseData();
}

bool CWT::ReadGrd(CString &infile)
{
	int i,j;
	char head[5]="";
	CString str;
	ReleaseData();
	ifstream ifp(infile);
	if(ifp.fail()){AfxMessageBox("无法打开文件!");return false;}
	ifp>>head;str=head;
	if(str!=_T("DSAA")){AfxMessageBox("文件不是标准的网格化数据文件!");ifp.close();return false;}
	ifp>>m_pn>>m_ln>>m_minx>>m_maxx>>m_miny>>m_maxy>>m_minz>>m_maxz;
	if(ifp.fail()){m_pn=m_ln=0;ifp.close();return false;}
	m_data=(float**)malloc(m_ln*sizeof(float*));
	if(m_data==NULL){m_pn=m_ln=0;ifp.close();return false;}
	m_result=(float**)malloc(m_ln*sizeof(float*));
	if(m_result==NULL){m_pn=m_ln=0;free(m_data);m_data=NULL;ifp.close();return false;}
	for(i=0;i<m_ln;i++){m_data[i]=m_result[i]=NULL;}
	for(i=0;i<m_ln;i++)
	{
		m_data[i]=new float[m_pn];
		m_result[i]=new float[m_pn];
		if(m_data[i]==NULL||m_result[i]==NULL||ifp.fail())
		{
			ReleaseData();
			ifp.close();
			return false;
		}
		for(j=0;j<m_pn;j++){ifp>>m_data[i][j];m_result[i][j]=m_data[i][j];}
	}
	if(ifp.fail())
	{
		ReleaseData();
		ifp.close();
		return false;
	}
	ifp.close();
	return true;
}

bool CWT::WriteGrd(CString &outfile)
{
	int i,j,k;
	ofstream ofp(outfile);
	if(ofp.fail()){AfxMessageBox("无法打开文件!");return false;}
	ofp<<"DSAA"<<endl;
	ofp<<m_pn<<" "<<m_ln<<endl;
	ofp<<m_minx<<" "<<m_maxx<<endl;
	ofp<<m_miny<<" "<<m_maxy<<endl;
	GetLimit(m_result);
	ofp<<m_minz<<" "<<m_maxz<<endl;
	for(i=0,k=1;i<m_ln;i++)
	{
		for(j=0;j<m_pn;j++,k=(k+1)%10){ofp<<m_result[i][j]<<" ";if(k==0)ofp<<endl;}
	}
	ofp.close();
	return true;
}

bool CWT::Read1D(CString &infile)
{
	int j;
	float f;
	FILE* fp=NULL;
	ReleaseData();
	fp=fopen(infile,"r");
	if(fp==NULL){AfxMessageBox("无法打开文件!");return false;}
	m_ln=1;
	while(!feof(fp)){fscanf(fp,"%f",&f);if(!ferror(fp))m_pn++;}
	m_pn-=1;
	fseek(fp,0L,SEEK_SET);
	m_data=(float**)malloc(m_ln*sizeof(float*));
	if(m_data==NULL){ReleaseData();;fclose(fp);return false;}
	m_data[0]=NULL;
	m_result=(float**)malloc(m_ln*sizeof(float*));
	if(m_result==NULL){ReleaseData();fclose(fp);return false;}
	m_result[0]=NULL;
	m_data[0]=new float[m_pn];
	m_result[0]=new float[m_pn];
	if(m_data[0]==NULL||m_result[0]==NULL)
	{
		ReleaseData();
		fclose(fp);
		return false;
	}
	for(j=0;j<m_pn;j++){fscanf(fp,"%f",&m_data[0][j]);m_result[0][j]=m_data[0][j];}
	fclose(fp);
	return true;
}

bool CWT::Write1D(CString &outfile)
{
	int j;
	ofstream ofp(outfile);
	if(ofp.fail()){AfxMessageBox("无法打开文件!");return false;}
	for(j=0;j<m_pn;j++)ofp<<m_result[0][j]<<endl;
	ofp.close();
	return true;
}

void CWT::ReleaseData()
{
	int i;
	if(m_data)
	{
		for(i=0;i<m_ln;i++)if(m_data[i])delete[] m_data[i];
		free(m_data);
		m_data=NULL;
	}
	if(m_result)
	{
		for(i=0;i<m_ln;i++)if(m_result[i])delete[] m_result[i];
		free(m_result);
		m_result=NULL;
	}
	m_pn=m_ln=0;
	m_minx=m_maxx=m_miny=m_maxy=m_minz=m_maxz=0.0f;
}

void CWT::GetLimit(float **data)
{
	int i,j;
	m_minz=m_maxz=0.0f;
	if(data==NULL)return;
	m_minz=m_maxz=data[0][0];
	for(i=0;i<m_ln;i++)
	{
		for(j=0;j<m_pn;j++)
		{
			if(m_minz>data[i][j])m_minz=data[i][j];
			if(m_maxz<data[i][j])m_maxz=data[i][j];
		}
	}
	return;
}

void CWT::DWT1(float *x, int len, int lev, float *a, float *d)
{
	float p,q,c2;
	int i,j,s,c;
	if(x==NULL||a==NULL||d==NULL||lev<1)return;

	c=(int)pow(2,lev-1);
	c2=1.0f/c1[lev-1];
	s=len+2*c+1;
	j=len-1;
	for(i=len;i<=s;i++,j--)x[i]=x[j];
	s=c+c;
	for(i=c/2;i<=s;i++)
	{
		p=q=0.0f;
		if(lev==1)
		{
			for(j=-1;j<=2;j++)p=p+h[j+1]*x[(int)(fabs(i-j+0.5)-0.5)];
			for(j=0;j<=1;j++)q=q+g[j]*x[(int)(fabs(i-j+0.5)-0.5)];
		}
		else
		{
			for(j=-1;j<=2;j++)p=p+h[j+1]*x[(int)(fabs(i-c*j))];
			for(j=0;j<=1;j++)q=q+g[j]*x[(int)(fabs(i-c*j))];
		}
		a[i-c/2]=p;
		d[i-c/2]=-c2*q;
	}
	s=len+c/2;
	for(i=2*c+1;i<=s;i++)
	{
		p=0.0f;
		q=0.0f;
		for(j=-1;j<=2;j++)p=p+h[j+1]*x[i-c*j];
		for(j=0;j<=1;j++)q=q+g[j]*x[i-c*j];
		a[i-c/2]=p;
		d[i-c/2]=-c2*q;
	}
}

void CWT::DWT1(int lev,int pc)
{
	float *x=NULL,*a=NULL,*d=NULL;
	int j,k,c,pl,ll;

	if(m_data==NULL)return;
	c=(int)pow(2,lev-1);
	c = c*3+1;
	if(c<11)c = 11;
	pl = m_pn+c;
	ll = m_ln+c;
	c=ll;if(ll<pl)c=pl;
	x = new float[c];
	a = new float[c];
	d = new float[c];
	if(x==NULL||a==NULL||d==NULL)
	{
		if(x)delete[] x;
		if(a)delete[] a;
		if(d)delete[] d;
		return;
	}
	for(j=0;j<c;j++)x[j]=a[j]=d[j]=0.0f;
	for(k=1;k<=lev;k++)
	{
		for(j=0;j<m_pn;j++)x[j]=m_data[0][j];
		DWT1(x,m_pn,k,a,d);
		for(j=0;j<m_pn;j++)m_data[0][j]=a[j];
	}
	if(pc==0)for(j=0;j<m_pn;j++)m_result[0][j]=a[j];
	else for(j=0;j<m_pn;j++)m_result[0][j]=d[j];
	return;
}

void CWT::DWT2(int lev,int pc)
{
	float *x=NULL,*a=NULL,*d=NULL;
	int i,j,k,c,pl,ll;

	if(m_data==NULL)return;
	c=(int)pow(2,lev-1);
	c = c*3+1;
	if(c<11)c = 11;
	pl = m_pn+c;
	ll = m_ln+c;
	c=ll;if(ll<pl)c=pl;
	x = new float[c];
	a = new float[c];
	d = new float[c];
	if(x==NULL||a==NULL||d==NULL)
	{
		if(x)delete[] x;
		if(a)delete[] a;
		if(d)delete[] d;
		return;
	}
	for(i=0;i<c;i++)x[i]=a[i]=d[i]=0.0f;
	for(k=1;k<lev;k++)
	{
		for(i=0;i<m_ln;i++)
		{
			for(j=0;j<m_pn;j++)x[j]=m_data[i][j];
			DWT1(x,m_pn,k,a,d);
			for(j=0;j<m_pn;j++)m_data[i][j]=a[j];
		}
		for(i=0;i<m_pn;i++)
		{
			for(j=0;j<m_ln;j++)x[j]=m_data[j][i];
			DWT1(x,m_ln,k,a,d);
			for(j=0;j<m_ln;j++)m_data[j][i]=a[j];
		}
	}

	for(i=0;i<m_ln;i++)
	{
		for(j=0;j<m_pn;j++)x[j]=m_data[i][j];
		DWT1(x,m_pn,k,a,d);
		for(j=0;j<m_pn;j++)m_data[i][j]=a[j];
		for(j=0;j<m_pn;j++)m_result[i][j]=d[j];
	}
	for(i=0;i<m_pn&&(pc==0||pc==1);i++)
	{
		for(j=0;j<m_ln;j++)x[j]=m_data[j][i];
		DWT1(x,m_ln,k,a,d);
		for(j=0;j<m_ln;j++)m_data[j][i]=a[j];
		if(pc==0)for(j=0;j<m_ln;j++)m_result[j][i]=a[j];
		if(pc==1)for(j=0;j<m_ln;j++)m_result[j][i]=d[j];
	}
	for(i=0;i<m_pn&&(pc==2||pc==3);i++)
	{
		for(j=0;j<m_ln;j++)x[j]=m_result[j][i];
		DWT1(x,m_ln,k,a,d);
		if(pc==2)for(j=0;j<m_ln;j++)m_result[j][i]=a[j];
		if(pc==3)for(j=0;j<m_ln;j++)m_result[j][i]=d[j];
	}
	return;
}

void CWT::WT2(CString& infile,CString &outfile,int lev,int pc,int rec)
{
	int i,j;
	if(!ReadGrd(infile))return;
	DWT2(lev,pc);
	if(rec)
	{
		for(i=0;i<m_ln;i++)for(j=0;j<m_pn;j++)m_data[i][j]=m_result[i][j];
		IDWT2(lev,pc);
	}
	if(!WriteGrd(outfile))return;
	return;
}

void CWT::IDWT1(float *a,float *d,int len,int lev,float *x)
{
	int i,j,s,c=(int)pow(2,lev-1);
	float p,q,c2;
	c2=c1[lev-1];
	s=len+c+c+c;
	for(i=len,j=len-1;i<=s;i++,j--)
	{
		d[i]=-d[j];
		a[i]=a[j];
	}
	s=s-len;
	for(i=-c/2;i<=s;i++)
	{
		p=q=0.0f;
		for(j=-1;j<=2;j++)p=p+h[j+1]*a[(int)(fabs(i+c*j))];
		for(j=-3;j<=2;j++)
			if((i-c*j)<0)q=q-k1[j+3]*d[(int)(fabs(i-c*j))];
			else q=q+k1[j+3]*d[i-c*j];
		x[i+c/2]=a[i+c/2]=p-c2*q;
	}
	s=len-c/2;
	for(i=3*c+1;i<=s;i++)
	{
		p=q=0.0f;
		for(j=-1;j<=2;j++)p=p+h[j+1]*a[i+c*j];
		for(j=-3;j<=2;j++)q=q+k1[j+3]*d[i-c*j];
		x[i+c/2]=a[i+c/2]=p-c2*q;
	}
}

void CWT::IDWT1(int lev,int pc)
{
	float *x=NULL,*a=NULL,*d=NULL;
	int j,k,c,pl,ll;

	if(m_data==NULL)return;
	c=(int)pow(2,lev-1);
	c = c*3+1;
	if(c<11)c = 11;
	pl = m_pn+c;
	ll = m_ln+c;
	c=ll;if(ll<pl)c=pl;
	x = new float[c];
	a = new float[c];
	d = new float[c];
	if(x==NULL||a==NULL||d==NULL)
	{
		if(x)delete[] x;
		if(a)delete[] a;
		if(d)delete[] d;
		return;
	}
	for(j=0;j<c;j++)x[j]=a[j]=d[j]=0.0f;
	for(j=0;j<m_pn;j++)
	{
		if(pc==0){a[j]=m_data[0][j];d[j]=0.0f;}
		else {a[j]=0.0f;d[j]=m_data[0][j];}
	}
	IDWT1(a,d,m_pn,lev,x);
	for(j=0;j<m_pn;j++)m_data[0][j]=x[j];

	for(k=lev-1;k>0;k--)
	{
		for(j=0;j<m_pn;j++){a[j]=m_data[0][j];d[j]=0.0f;}
		IDWT1(a,d,m_pn,k,x);
		for(j=0;j<m_pn;j++)m_data[0][j]=x[j];
	}
	for(j=0;j<m_pn;j++)m_result[0][j]=m_data[0][j];
	return;
}

void CWT::IDWT2(int lev,int pc)
{
	float *x=NULL,*a=NULL,*d=NULL;
	int i,j,k,c,pl,ll;

	if(m_data==NULL)return;
	c=(int)pow(2,lev-1);
	c = c*3+1;
	if(c<11)c = 11;
	pl = m_pn+c;
	ll = m_ln+c;
	c=ll;if(ll<pl)c=pl;
	x = new float[c];
	a = new float[c];
	d = new float[c];
	if(x==NULL||a==NULL||d==NULL)
	{
		if(x)delete[] x;
		if(a)delete[] a;
		if(d)delete[] d;
		return;
	}
	for(i=0;i<c;i++)x[i]=a[i]=d[i]=0.0f;
	for(i=0;i<m_pn;i++)
	{
		for(j=0;j<m_ln;j++)
		{
			if(pc==0){a[j]=m_data[j][i];d[j]=0.0f;}
			else {a[j]=0.0f;d[j]=m_data[j][i];}
		}
		IDWT1(a,d,m_ln,lev,x);
		for(j=0;j<m_ln;j++)m_data[j][i]=x[j];
	}
	for(i=0;i<m_ln;i++)
	{
		for(j=0;j<m_pn;j++)
		{
			if(pc==0){a[j]=m_data[i][j];d[j]=0.0f;}
			else {a[j]=0.0f;d[j]=m_data[i][j];}
		}
		IDWT1(a,d,m_pn,lev,x);
		for(j=0;j<m_pn;j++)m_data[i][j]=x[j];
	}

	for(k=lev-1;k>0;k--)
	{
		for(i=0;i<m_pn;i++)
		{
			for(j=0;j<m_ln;j++){a[j]=m_data[j][i];d[j]=0.0f;}
			IDWT1(a,d,m_ln,k,x);
			for(j=0;j<m_ln;j++)m_data[j][i]=x[j];
		}
		for(i=0;i<m_ln;i++)
		{
			for(j=0;j<m_pn;j++){a[j]=m_data[i][j];d[j]=0.0f;}
			IDWT1(a,d,m_pn,k,x);
			for(j=0;j<m_pn;j++)m_data[i][j]=x[j];
		}
	}
	for(i=0;i<m_ln;i++)for(j=0;j<m_pn;j++)m_result[i][j]=m_data[i][j];

	return;
}

void CWT::WT1(CString& infile,CString &outfile,int lev,int pc,int rec)
{
	int j;
	if(!Read1D(infile))return;
	DWT1(lev,pc);
	if(rec)
	{
		for(j=0;j<m_pn;j++)m_data[0][j]=m_result[0][j];
		IDWT1(lev,pc);
	}
	if(!Write1D(outfile))return;
	return;
}

⌨️ 快捷键说明

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