📄 sinadlg.cpp
字号:
SelectObject(*pControlDC,hP3);
pControlDC->MoveTo(0,0);
pControlDC->LineTo(300,0);
//定义红色画笔绘制正弦
hP2=CreatePen(PS_SOLID,1,RGB(255,0,0));
SelectObject(*pControlDC,hP2);
pControlDC->MoveTo(0,0);
int sin1[256]; //存放正弦序列的数组
t1=fudu1(m_amp); //根据输入的两种幅度值确定纵坐标单位
t2=fudu1(m_yibianamp);
if (t1>t2)
{
temp=t1;
}
else
{
temp=t2;
}
for (i=0;i<m_yibianstart;i+=1)
{
pControlDC->TextOut(10,145,"y/");
//temp=fudu1(m_amp);
str.Format("%.0f",pow(10,temp+2));
pControlDC->TextOut(23,145,str);
pControlDC->TextOut(350,5,"x/t");
sin1[i]=(int)(m_amp*sin(2*pi*i*m_fre/m_dianshu)/(pow(10,temp)) + (rand() % (int)m_amp) );
pControlDC->LineTo(i,sin1[i]);
}
for (i=m_yibianstart;i<=m_yibianstart+m_yibianlen;i+=1)
{
//temp=fudu1(m_yibianamp);
sin1[i]=(int)(m_yibianamp*sin(2*pi*i*m_yibianfre/m_dianshu)/(pow(10,temp))+ (rand() % (int)m_yibianamp) );
pControlDC->LineTo(i,sin1[i]);
}
for (i=m_yibianstart+m_yibianlen;i<m_dianshu;i+=1)
{
//temp=fudu1(m_amp);
sin1[i]=(int)(m_amp*sin(2*pi*i*m_fre/m_dianshu)/(pow(10,temp))+ (rand() % (int)m_amp) );
pControlDC->LineTo(i,sin1[i]);
}
pWnd->ReleaseDC(pControlDC);
//以下代码求突变点位置
//选择第二个静态文本框
pWnd=GetDlgItem(IDC_STATIC_YIBIANDIAN);
pControlDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
//再次设定逻辑坐标和物理坐标的比例
ASSERT_VALID(pControlDC);
pControlDC->SetMapMode(MM_ANISOTROPIC);
pControlDC->SetViewportOrg(50,250);
pControlDC->SetWindowExt(50,-150);
pControlDC->SetViewportExt(50,150);
//绘制坐标轴
pControlDC->MoveTo(0,0);
pControlDC->LineTo(350,0);
pControlDC->MoveTo(0,0);
pControlDC->LineTo(0,250);
//绘制坐标轴上的箭头
pControlDC->MoveTo(340,5);
pControlDC->LineTo(350,0);
pControlDC->LineTo(340,-5);
pControlDC->MoveTo(-5,245);
pControlDC->LineTo(0,250);
pControlDC->LineTo(5,245);
//定义画笔
HPEN hP4,hP5,hP6;
hP4=CreatePen(PS_DOT,1,RGB(0,0,0));
SelectObject(*pControlDC,hP4);
//标注纵轴刻度
for (i=0;i<11;i++)
{
pControlDC->MoveTo(0,200-20*i);
pControlDC->LineTo(300,200-20*i);
str.Format("%.2f",1-0.1*i);
if(i!=10) pControlDC->TextOut(-40,210-20*i,str);
else pControlDC->TextOut(-40,210-20*i,"0");
}
//标注横坐标轴刻度线
for (i=1;i<7;i++)
{
pControlDC->MoveTo(50*i,0);
pControlDC->LineTo(50*i,200);
if ((i%2)==0)
{
str.Format("%d",50*i);
pControlDC->TextOut(50*i-10,-3,str);
}
}
//用实线重绘被虚线化了的横轴
hP5=CreatePen(PS_SOLID,1,RGB(0,0,0));
SelectObject(*pControlDC,hP5);
pControlDC->MoveTo(0,0);
pControlDC->LineTo(350,0);
for (i=0;i<m_yibianstart;i+=1) //获取正弦序列
{
sin1[i]=(int)(m_amp*sin(2*pi*i*m_fre/m_dianshu)/(pow(10,temp)));
}
for (i=m_yibianstart;i<=m_yibianstart+m_yibianlen;i+=1) //获取正弦序列
{
sin1[i]=(int)(m_yibianamp*sin(2*pi*i*m_yibianfre/m_dianshu)/(pow(10,temp)));
}
for (i=m_yibianstart+m_yibianlen;i<m_dianshu;i+=1) //获取正弦序列
{
sin1[i]=(int)(m_amp*sin(2*pi*i*m_fre/m_dianshu)/(pow(10,temp)));
}
int index_x,nn=16,l1;
float x,sum=0,sum1=0,sum2=0,g[16],conv[300],temp1[256];
float A=-1/sqrt(2*pi),delta=0.25;
float phi_x[16],max1,max2;
for (index_x=1;index_x<=nn;index_x++) //高斯小波
{
x=index_x-(nn+1)/2;
phi_x[index_x]=A*(x/(delta*delta))*exp(-(x*x)/(2*(delta*delta)));
sum=sum+phi_x[index_x]*phi_x[index_x];
}
sum=sqrt(sum);
for (i=0,index_x=1;i<nn,index_x<=nn;i++,index_x++) //高斯小波
{
g[i]=phi_x[index_x];
g[i]=g[i]/sum;
}
for (i=0;i<300;i++) //清零
{
conv[i]=0;
}
for (i=0;i<nn;i++) //求卷积
{
for (j=i;j>=0;j--)
{
conv[i]+=sin1[j]*g[i-j];
}
}
for (i=nn;i<256;i++) //求卷积
{
for (j=nn-1;j>=0;j--)
{
conv[i]+=sin1[i-j]*g[j];
}
}
for (i=256;i<256+nn-1;i++) //求卷积
{
for (j=nn-1;j>=i-255;j--)
{
conv[i]+=sin1[i-j]*g[j];
}
}
for (i=0;i<256+nn-1;i++) //系数取绝对值
{
conv[i]=abs(conv[i]);
}
for (i=0,j=nn/2-1;i<256,i<256+nn/2-1;i++,j++)//保持信号长度
{
temp1[i]=conv[j];
}
max1=temp1[0];
max2=0;
for(j=1;j<256;j++) //找最大点位置
{
if (max1<temp1[j])
{
max1=temp1[j];
max2=j;
}
else
{
;
}
}
hP6=CreatePen(PS_SOLID,1,RGB(255,0,0));
SelectObject(*pControlDC,hP6);
pControlDC->MoveTo(0,temp1[0]); //连接卷积系数
for (i=1;i<256;i++)
{
pControlDC->LineTo(i,temp1[i]);
}
pControlDC->MoveTo(max2,0);
pControlDC->LineTo(max2,200);
pControlDC->TextOut(max2-3,215,"*");
str.Format("%.0f",max2);
l1=strlen(str);
pControlDC->TextOut(max2+5,215,str);
pControlDC->TextOut(max2+l1+25,215,",");
str.Format("%.0f",max1);
pControlDC->TextOut(max2+l1+30,215,str);
pWnd->ReleaseDC(pControlDC);
// 以下绘制正弦曲线的FFT变换
//对第三个静态文本框操作
pWnd=GetDlgItem(IDC_STATIC_FFT);
pControlDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
//再次设定逻辑坐标和物理坐标的比例
ASSERT_VALID(pControlDC);
pControlDC->SetMapMode(MM_ANISOTROPIC);
pControlDC->SetViewportOrg(50,250);
pControlDC->SetWindowExt(50,-150);
pControlDC->SetViewportExt(50,150);
//绘制坐标轴
pControlDC->MoveTo(0,0);
pControlDC->LineTo(350,0);
pControlDC->MoveTo(0,0);
pControlDC->LineTo(0,250);
//绘制坐标轴上的箭头
pControlDC->MoveTo(340,5);
pControlDC->LineTo(350,0);
pControlDC->LineTo(340,-5);
pControlDC->MoveTo(-5,245);
pControlDC->LineTo(0,250);
pControlDC->LineTo(5,245);
//定义画笔
HPEN hP7,hP8,hP9;
hP7=CreatePen(PS_DOT,1,RGB(0,0,0));
SelectObject(*pControlDC,hP7);
//标注纵轴刻度
for (i=0;i<11;i++)
{
pControlDC->MoveTo(0,200-20*i);
pControlDC->LineTo(300,200-20*i);
str.Format("%.2f",1-0.1*i);
if(i!=10) pControlDC->TextOut(-40,210-20*i,str);
else pControlDC->TextOut(-40,210-20*i,"0");
}
//标注横坐标轴刻度线
for (i=1;i<7;i++)
{
pControlDC->MoveTo(50*i,0);
pControlDC->LineTo(50*i,200);
if ((i%2)==0)
{
str.Format("%d",50*i);
pControlDC->TextOut(50*i-10,-3,str);
}
}
//用实线重绘被虚线化了的横轴
hP8=CreatePen(PS_SOLID,1,RGB(0,0,0));
SelectObject(*pControlDC,hP5);
pControlDC->MoveTo(0,0);
pControlDC->LineTo(350,0);
complex<double> t[512],f[512];
double data[512];
for (i=0;i<512;i++) //预置2048个点的初始化实部
{
t[i]=0;
}
for (i=0;i<512;i++) //预置2048个点的初始化虚部部
{
f[i]=0;
}
for ( j=0;j<m_yibianstart;j+=1)
{
t[j]=m_amp*sin(2*pi*j*m_fre/m_dianshu); //待变换的m_dianshu个点(含实部和虚部)
}
for (j=m_yibianstart;j<m_yibianstart+m_yibianlen;j+=1)
{
t[j]=m_yibianamp*sin(2*pi*j*m_yibianfre/m_dianshu);
}
for (j=m_yibianstart+m_yibianlen;j<m_dianshu;j+=1)
{
t[j]=m_amp*sin(2*pi*j*m_fre/m_dianshu);
}
FFT(t,f,(log(m_dianshu))/log(2)); //调用FFT变换函数
for (j=0;j<m_dianshu;j+=1) //求变换后的m_dianshu点幅值
{
data[j]=abs(f[j]);
}
hP9=CreatePen(PS_SOLID,1,RGB(255,0,0));
SelectObject(*pControlDC,hP9);
//绘制FFT变换后的曲线
t1=fudu2(m_amp,m_yibianstart);
t2=fudu2(m_yibianamp,m_yibianlen);
t3=fudu2(m_amp,512-m_yibianstart-m_yibianlen);
t4=max(t1,t2);
t5=max(t2,t3);
temp=max(t4,t5);
//temp=fudu2(m_amp,m_dianshu);
pControlDC->MoveTo(0,(int)((data[0])/pow(10,temp)));
for ( i=1;i<m_dianshu;i+=1)
{
pControlDC->TextOut(10,245,"y/");
//temp=fudu2(m_amp,m_dianshu);
str.Format("%.0f",pow(10,temp));
pControlDC->TextOut(20,245,str);
pControlDC->TextOut(350,5,"x/f");
pControlDC->LineTo(i,(int)((data[i])/pow(10,temp-2)));
}
pWnd->ReleaseDC(pControlDC);
}
void CSinaDlg::OnExit()
{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}
/**************改变static text的前景和背景颜色***********************
************以下函数是响应sinaDlg的“WM_CTRLCOLOR”得来的***********/
HBRUSH CSinaDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if ((pWnd->GetDlgCtrlID() == IDC_STATIC_SINA) && (nCtlColor == CTLCOLOR_STATIC))
{
COLORREF clr = RGB(255,0,0);
pDC->SetTextColor(clr);//设置红色的文本
pDC->SetBkMode(TRANSPARENT);
clr = RGB(200,200,200);
pDC->SetBkColor(clr); //设置灰色的背景
m_brMine =CreateSolidBrush(clr);
return m_brMine; //作为约定,返回背景色对应的刷子句柄
}
if ((pWnd->GetDlgCtrlID() == IDC_STATIC_YIBIANDIAN) && (nCtlColor == CTLCOLOR_STATIC))
{
COLORREF clr = RGB(0,0,255);
pDC->SetTextColor(clr);//设置蓝色的文本
pDC->SetBkMode(TRANSPARENT);
clr = RGB(175, 238, 238);
pDC->SetBkColor(clr); //设置浅绿色的背景
m_brMine =CreateSolidBrush(clr);
return m_brMine; //作为约定,返回背景色对应的刷子句柄
}
if ((pWnd->GetDlgCtrlID() == IDC_STATIC_FFT) && (nCtlColor == CTLCOLOR_STATIC))
{
COLORREF clr = RGB(0,0,255);
pDC->SetTextColor(clr);//设置蓝色的文本
pDC->SetBkMode(TRANSPARENT);
clr = RGB(100,255,100);
pDC->SetBkColor(clr); //设置浅绿色的背景
m_brMine =CreateSolidBrush(clr);
return m_brMine; //作为约定,返回背景色对应的刷子句柄
}
else
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -