📄 waveletdlg.cpp
字号:
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 + -