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

📄 waveletdlg.cpp

📁 这是一个有关一维信号小波分解与重构的VC++源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		
		str.Format("%d",10*i);
		pDC->TextOut(2, 180-i*jiangeY, str);
	}
	
	
	jiangeX=int(540/DataLength);
	for (i = 1; i <DataLength; i ++)
	{	
		// 10的倍数
		pDC->MoveTo(20+540*i/DataLength, 90-80*cxianshi[i-1]/lMaxCount);
		pDC->LineTo(20+540*(i+1)/DataLength, 90-80*cxianshi[i]/lMaxCount);
		
	}  
	
}

void CWaveletDlg::OnDWT() 
{
	
	if(INPUTDATA==false)
	{
		AfxMessageBox("请先输入数据!");
		return;
    }

	UpdateData(true);
	DataLength=m_DataLength;
	J=m_J;
	
	int i,j,wlen,sca[20],flag[20];
	int m;//分解的层数

	char d_name[16]="temp\\d0.txt",c_name[16]="temp\\c0.txt";

	m=J;
	j=DataLength;
	flag[0]=0;
	for(i=0;i<=m;i++)
	{
		flag[i+1]=flag[i]+j;
		sca[i]=j;
		j=j/2;
	}
	
	CString strPgmName;
	strPgmName = m_combo;
	strPgmName.MakeUpper();    //将文件名转成大写


	if (strPgmName == "DAUBECHIES小波")
	{
      wlen=6;//小波长度
      DWT(g,h,wlen,c,d,m,sca);
	}
	
	if (strPgmName == "HAAR小波")
	{
		DWT1(c,d,m,sca);
	}
		 
	if (strPgmName == "MORLET小波")
	{
		DWT3(c,d,m,sca);
	}

	ofstream ostrm,ostrmc,ostrmd;
    ostrm.open( c_name);
	
    for(i=0;i<DataLength;i++)
	{
        ostrm<<c[i]<<endl;
	}
	ostrm.close();

	for(i=1;i<=J;i++)
	{
		c_name[6]++;
		d_name[6]++;
        
		ostrmc.open( c_name);
		ostrmd.open( d_name);
		for(j=0;j<sca[i];j++)
		{
           ostrmc<<c[flag[i]+j]<<endl;
		   ostrmd<<d[flag[i]+j]<<endl;
		}
		ostrmc.close();
		ostrmd.close();
	}
	
  
	AFTERDWT=true; 	

}

void CWaveletDlg::OnPaintAfterDWT() 
{
	if(INPUTDATA==false)
	{
		AfxMessageBox("请先输入数据!");
		return;
    }

	int i,temp;
	temp=2*DataLength-DataLength/(1<<J);
	
	for (i=DataLength; i<temp; i++)
	{
		// 判断是否大于当前最大值
		if (c[i] > lMaxCount2)
		{
			// 更新最大值
			lMaxCount2 = c[i];
		}
	}
	
	PAINTAFTERDWT=true;
	PAINTCHONGGOU=false;
	
	OnPaint();
	
}

void CWaveletDlg::PaintAfterDWT(CDC *pDC2, CDC *pDC3)
{
	UpdateData(true);
	Jtmp=m_Jtmp;
	
	int i,j,k;
	int lengthX,lengthY;
	int jiangeX,jiangeY;
	CString str;
	int tmp,tmpDataLength;
	int DataLengthtmp;
	
	tmp=1<<Jtmp;
    //绘制x轴刻度
	if(DataLength<100)
	{
		DataLengthtmp=DataLength-DataLength%10;
		lengthX=int( (DataLengthtmp)/10 );
		jiangeX=int(540/lengthX);
		
        for (i = 0; i <= lengthX; i ++)
		{
			pDC2->MoveTo(20+i*jiangeX, 180);
			pDC2->LineTo(20+i*jiangeX, 186);
			str.Format("%d",10*i);
			pDC2->TextOut(20+i*jiangeX, 183, str);
			
			pDC3->MoveTo(20+i*jiangeX, 180);
			pDC3->LineTo(20+i*jiangeX, 186);
			str.Format("%d",10*i);
			pDC3->TextOut(20+i*jiangeX, 183, str);
		}
	}
	else
	{
		DataLengthtmp=DataLength-DataLength%10;
		lengthX=int( (DataLengthtmp)/10 );
		jiangeX=int(540/lengthX);
		
        for (i = 0; i <= lengthX; i+=5)
		{
			pDC2->MoveTo(20+i*jiangeX, 180);
			pDC2->LineTo(20+i*jiangeX, 186);
			str.Format("%d",10*i);
			pDC2->TextOut(20+i*jiangeX, 183, str);
			
			pDC3->MoveTo(20+i*jiangeX, 180);
			pDC3->LineTo(20+i*jiangeX, 186);
			str.Format("%d",10*i);
			pDC3->TextOut(20+i*jiangeX, 183, str);
		}
	}
	
	//绘制y轴刻度
	lengthY=lMaxCount2-(int)lMaxCount2%10;
	lengthY=int(lMaxCount2+10)/10;
	jiangeY=(int)(180/lengthY);
	for (i = 1; i < lengthY; i+=1)
	{
		pDC2->MoveTo(20, 180-i*jiangeY);
		pDC2->LineTo(16, 180-i*jiangeY);
		str.Format("%d",10*i);
		pDC2->TextOut(2, 180-i*jiangeY, str);

		pDC3->MoveTo(20, 180-i*jiangeY);
		pDC3->LineTo(16, 180-i*jiangeY);
		str.Format("%d",10*i);
		pDC3->TextOut(2, 180-i*jiangeY, str);
	}
	
	
	jiangeX=int(540/DataLength);
	
	tmpDataLength=0;
	for(i=1;i<=Jtmp;i++)
	{
		tmp=1<<i;
		tmpDataLength+=DataLength*2/tmp;
	}
	for (i = 1; i <DataLength/tmp; i ++)
	{	
		// 10的倍数
		pDC2->MoveTo(20+540*i/DataLength, 90-80*c[i+tmpDataLength-1]/lMaxCount2);
		pDC2->LineTo(20+540*(i+1)/DataLength, 90-80*c[i+tmpDataLength]/lMaxCount2);
		
		pDC3->MoveTo(20+540*i/DataLength, 90-80*d[i+tmpDataLength-1]/lMaxCount2);
		pDC3->LineTo(20+540*(i+1)/DataLength, 90-80*d[i+tmpDataLength]/lMaxCount2);
		
	}  
	
}

void CWaveletDlg::OnOK() 
{
	CDialog::OnOK();
}

void CWaveletDlg::OnIDWT() 
{
    if(AFTERDWT==false)
	{
		AfxMessageBox("请先进行小波正变换!");
		return;
    }
	
	UpdateData(true);
	Jtmp=m_Jtmp;
	
	int i,j,wlen,sca[20],flag[20];
	int m;//分解的层数
	int tmpDataLength;
	int tmp;

	m=J;
	j=DataLength;
	flag[0]=0;
	for(i=0;i<=m;i++)
	{
		flag[i+1]=flag[i]+j;
		sca[i]=j;
		j=j/2;
	}
 
    
 
 	for(i=0;i<sca[m];i++)
 	{
 		c[flag[m]+i]=c[flag[m]+i];
 	}
 	
 	// 创建对话框
 	CDlgIDWT dlgPara;
 
 	// 初始化变量值
 	memcpy(dlgPara.c,c,sizeof(double)*SHUZU);
 	memcpy(dlgPara.d,d,sizeof(double)*SHUZU);
 	dlgPara.J=J;
 	dlgPara.DataLength=DataLength;
 	
 	// 显示对话框,提示用户设定平移量
 	if (dlgPara.DoModal() != IDOK)
 	{
 		// 返回
 		return;
 	}
 	
 	// 获取用户的设定
 	memcpy(c,dlgPara.c,sizeof(double)*SHUZU);
 	memcpy(d,dlgPara.d,sizeof(double)*SHUZU);
 	
 	// 删除对话框!!!
 	delete dlgPara;	
 	
    CString strPgmName;
	strPgmName = m_combo;
	strPgmName.MakeUpper();    //将文件名转成大写
	
	if (strPgmName == "DAUBECHIES小波")
	{
		//小波长度
	wlen=6;
       //小波重构
       IDWT(g,h,wlen,c,d,m,sca);
	
	}
	
	if (strPgmName == "HAAR小波")
	{
		IDWT1(c,d,m,sca);
	}
	
	if (strPgmName == "MORLET小波")
	{
		IDWT3(c,d,m,sca);
	}
	PAINTCHONGGOU=true;
	PAINTAFTERDWT=false;

	OnPaint(); 	
}

void CWaveletDlg::PaintChonggou(CDC *pDC)
{
	int i,j,k;
	int lengthX,lengthY;
	int jiangeX,jiangeY;
	CString str;
	int DataLengthtmp;
	
    //绘制x轴刻度
	if(DataLength<100)
	{
		DataLengthtmp=DataLength-DataLength%10;
		lengthX=int( (DataLengthtmp)/10 );
		jiangeX=int(540/lengthX);
		
        for (i = 0; i <= lengthX; i ++)
		{
			pDC->MoveTo(20+i*jiangeX, 180);
			pDC->LineTo(20+i*jiangeX, 186);
			
			str.Format("%d",10*i);
			pDC->TextOut(20+i*jiangeX, 183, str);
		}
	}
	else
	{
		DataLengthtmp=DataLength-DataLength%10;
		lengthX=int( (DataLengthtmp)/10 );
		jiangeX=int(540/lengthX);
		
        for (i = 0; i <= lengthX; i+=5)
		{
			pDC->MoveTo(20+i*jiangeX, 180);
			pDC->LineTo(20+i*jiangeX, 186);
			
			str.Format("%d",10*i);
			pDC->TextOut(20+i*jiangeX, 183, str);
		}
	}
	//绘制y轴刻度
	lengthY=lMaxCount-(int)lMaxCount%10;
	lengthY=int(lMaxCount+10)/10;
	jiangeY=(int)(180/lengthY);
	for (i = 1; i < lengthY; i++)
	{
		pDC->MoveTo(20, 180-i*jiangeY);
		pDC->LineTo(16, 180-i*jiangeY);
		
		str.Format("%d",10*i);
		pDC->TextOut(2, 180-i*jiangeY, str);
	}
	
	
	jiangeX=int(540/DataLength);
	for (i = 1; i <DataLength; i ++)
	{	
		// 10的倍数
		pDC->MoveTo(20+540*i/DataLength, 90-80*c[i-1]/lMaxCount);
		pDC->LineTo(20+540*(i+1)/DataLength, 90-80*c[i]/lMaxCount);
		
	}  
	
	
}
///////////////////////
double CWaveletDlg::uniform(double a, double b, long *seed)
{

	double t;
	*seed=2045*(*seed)-1;
	*seed=*seed-(*seed/1048576)*1048576;
	t=(*seed)/1048576.0;
	t=a+(b-a)*t;
	return(t);

}

double CWaveletDlg::gauss(double mean, double sigma, long *seed)
{
	int i;
	double x,y;
	
	for(x=0,i=0;i<12;i++)
	{
		x+=uniform(0.0,1.0,seed);
	}
	x=x-6.0;y=mean+x*sigma;
	
	return(y);

}

///////////////////////////////////////
void CWaveletDlg::OnInputNoise() 
{
	if(INPUTDATA==false)
	{
		AfxMessageBox("请先输入数据!");
		return;
    }
	
	UpdateData(true);
	mean=m_mean;
	sigma=m_sigma;
	
	int i;
	double random[SHUZU];
	
	sigma=sqrt(sigma);
	Radom05(DataLength,random, mean, sigma); 
	for(i=0;i<DataLength;i++)
	{
		c[i]=c[i]+random[i];
		cxianshi[i]=cxianshi[i]+random[i];
	}
	
	OnPaint();
	
}


BOOL CWaveletDlg::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	
	SetTimer(1, 3000, NULL);
	
	return CDialog::Create(IDD, pParentWnd);
}






















⌨️ 快捷键说明

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