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

📄 sinadlg.cpp

📁 通过参数设置
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -