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

📄 zhangjg_dspview.cpp

📁 这是我学习数字信号处理时编写的程序!功能就是显示一些常用的函数的图形!并可以做FFT计算!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	// TODO: Add your command handler code here
		m_Test=TRUE;
	CZhangjg_dspDoc *pDoc=GetDocument();//获取活动文档的指针;
	CExpression expression;
	CTriangle Dlg;
	Dlg.m_n=8;
		if (Dlg.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	   	pDoc->m_N=Dlg.m_n;
		pDoc->m_n=Dlg.m_n;
		pDoc->X=new double[pDoc->m_N];                 //开辟内存,存储初值数组长度;
		for(int i=0;i<=pDoc->m_N-1;i++)
		{
			pDoc->X[i]=0;
		}                                      //置零;
		X=new double[pDoc->m_N];                 //开辟内存,存储初值数组长度;
		for(i=0;i<=pDoc->m_N-1;i++)
		{
			X[i]=0;
		}                                      //置零;
		expression.Triangle(pDoc->m_n,pDoc->X);
		memcpy(X, pDoc->X, sizeof(double) * pDoc->m_n); //copy pDoc->X to X,use X for show;
        flag=1;                  //show modle;
		stepx=(int)900/pDoc->m_n;
        stepy=50;
	    pointx=50;
	    pointy=500;              //coordinate following;
		pDoc->UpdateAllViews(NULL);//更新视图
}

void CZhangjg_dspView::OnAttenuationsin() 
{
	CZhangjg_dspDoc *pDoc=GetDocument();//获取活动文档的指针;
	CExpression expression;
	CAttenuation_Sin Dlg;
	Dlg.m_a=0.1;   //初始化;
	Dlg.m_f=0.0625;
//	Dlg.m_N=32;
	Dlg.m_n=16;
		if (Dlg.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	switch (Dlg.flag)
	{
	case 1:
		m_a=0.1;
		m_f=0.0625;
		pDoc->m_N=Dlg.m_n;
		pDoc->m_n=Dlg.m_n;
		break;
	case 2:
		m_a=0.1;
		m_f=0.4375;
		pDoc->m_N=Dlg.m_n;
		pDoc->m_n=Dlg.m_n;
		break;
	case 3:
		m_a=0.1;
		m_f=0.5625;
		pDoc->m_N=Dlg.m_n;
		pDoc->m_n=Dlg.m_n;
		break;
	default :
		m_a=Dlg.m_a;
		m_f=Dlg.m_f;
		pDoc->m_N=Dlg.m_n;
		pDoc->m_n=Dlg.m_n;
		break;
	}
		pDoc->X=new double[pDoc->m_N];                 //开辟内存,存储初值数组长度;
		for(int i=0;i<=pDoc->m_N-1;i++)
		{
			pDoc->X[i]=0;
		}                                      //置零;
		X=new double[pDoc->m_N];                 //开辟内存,存储初值数组长度;
		for(i=0;i<=pDoc->m_N-1;i++)
		{
			X[i]=0;
		}                                      //置零;
		expression.AttenuationSin(pDoc->m_n,m_a,m_f,pDoc->X);
		memcpy(X, pDoc->X,sizeof(double)*pDoc->m_N);                //copy pDoc->X to X,use X for show;
	    stepx=(int)900/pDoc->m_N;
        stepy=50;
	    pointx=50;
	    pointy=500;              //coordinate following;
		flag=1;                //show modle;
        pDoc->UpdateAllViews(NULL);//更新视图
	//	delete X;                    //在消息响应函数里面注销内存;    why can not delete X;
		m_Test=TRUE;
}


void CZhangjg_dspView::OnFft() 
{
	 	if(m_Test!=TRUE)
	{
		AfxMessageBox("请先选择序历!!!");
		return;
	}
	CZhangjg_dspDoc *pDoc=GetDocument();//获取活动文档的指针;
	CExpression expression;
	CTransformRegion Dlg;
	Dlg.m_N=16;
		if (Dlg.DoModal() != IDOK)
	{
		// 返回
		return;
	}
		pDoc->m_N=Dlg.m_N;
	if(pDoc->X!=NULL)
	{
		long Test=1;
		M=0;
		while(Test<pDoc->m_N)                    //补零;
		{
			M++;
			Test=Test*2;
		}
			long NewN;
			NewN=1<<M;    //new length;
		pDoc->FD = new complex<double>[NewN];    //初始数据;
		for(int i=0;i<=NewN-1;i++)
		{
		if(i<=pDoc->m_n-1)
		pDoc->FD[i]=complex<double>(pDoc->X[i],0);           //赋值;
	    else 
			pDoc->FD[i]=complex<double>(0,0);     //补零;
		}	
		AF=new double[pDoc->m_N];
		//开辟内存,存储初值数组长度;and to store the worked data,use for showing;
		for(i=0;i<=pDoc->m_N-1;i++)
		{
			AF[i]=0;
		}                                      //置零;
		if(m_Fourierflag==2)
		expression.Dft(pDoc->FD,M);
		else
		expression.Fft(pDoc->FD,M);
		for(i=0;i<=pDoc->m_N-1;i++)
		{
			AF[i]=sqrt(pDoc->FD[i].real() * pDoc->FD[i].real() 
				+ pDoc->FD[i].imag() * pDoc->FD[i].imag());
		}
		//memcpy(X, pDoc->X,sizeof(double)*pDoc->m_N);
		flag=3;                         //show modle;
		stepx=(int)1000/pDoc->m_N;
        stepy=50;
	    pointx=50;
	    pointy=500;              //coordinate following;
		pDoc->UpdateAllViews(NULL);//更新视图
	}
		 m_Test=FALSE;
		m_Fourierflag=0;
}

void CZhangjg_dspView::OnDft() 
{
	// TODO: Add your command handler code here
    m_Fourierflag=2;
	CZhangjg_dspView::OnFft();
}

void CZhangjg_dspView::OnRectangle() 
{
	CZhangjg_dspDoc *pDoc=GetDocument();//获取活动文档的指针;
	CRectangle Dlg;
	CExpression expression;
//	Dlg.m_N=32;
	Dlg.m_n=4;
		if (Dlg.DoModal() != IDOK)
	{
		// 返回
		return;
	}
		pDoc->m_N=Dlg.m_n;
		pDoc->m_n=Dlg.m_n;
				pDoc->X=new double[pDoc->m_N];                 //开辟内存,存储初值数组长度;
		for(int i=0;i<=pDoc->m_N-1;i++)
		{
			pDoc->X[i]=0;
		}                                      //置零;
		X=new double[pDoc->m_N];                 //开辟内存,存储初值数组长度;
		for(i=0;i<=pDoc->m_N-1;i++)
		{
		X[i]=0;
		}                                      //置零;
		expression.Rectangle(pDoc->m_N,pDoc->X);
		memcpy(X, pDoc->X,sizeof(double)*pDoc->m_N); //copy pDoc->X to X,use X for show;
		flag=1;                     //show modle;
		stepx=(int)900/pDoc->m_N;
        stepy=50;
	    pointx=50;
	    pointy=500;              //coordinate following;
		pDoc->UpdateAllViews(NULL);//更新视图
		//delete X;                    //在消息响应函数里面注销内存;  why can not do it ;;
		m_Test=TRUE;
}

void CZhangjg_dspView::OnFourier() 
{
	 	if(m_Test!=TRUE)
	{
		AfxMessageBox("请先选择序历!!!");
		return;
	}
	CZhangjg_dspDoc *pDoc=GetDocument();//获取活动文档的指针;
	complex<double> Fourier,Temple;
	stepx=(int)900/7;
	FourierLength=2*PI*stepx;
	X=new double[FourierLength];
	for(int w=0;w<=FourierLength-1;w++)     //进行付立叶计算;
	{    
		Fourier=complex<double>(0,0);
        for(int n=0;n<=pDoc->m_N-1;n++)
		{
			double Angle;
			Angle=(double)n*(w+1)/stepx;
           Temple=complex<double>(pDoc->X[n]*exp(complex<double>(0,-Angle)));
		   Fourier=Fourier+Temple;
		}
		X[w]=sqrt(Fourier.real()*Fourier.real()+ Fourier.imag()*Fourier.imag());
	}
    	flag=2;                 //show modle;
		stepx=(int)900/7;
        stepy=50;
	    pointx=50;
	    pointy=500;              //coordinate following;
		pDoc->UpdateAllViews(NULL);//更新视图
	//   delete X;                    //在消息响应函数里面注销内存;why can not do it;
}

void CZhangjg_dspView::OnMouseMove(UINT nFlags, CPoint point) 
{
	m_CurPos=point;	
	CScrollView::OnMouseMove(nFlags, point);
}
void CZhangjg_dspView::OnUpdateCoorX(CCmdUI *pCmdUI)
{	
	CString s;
	s.Format("X:%f",(float)(m_CurPos.x-pointx)/stepx);
	pCmdUI->SetText(s);

}

void CZhangjg_dspView::OnUpdateCoorY(CCmdUI *pCmdUI)
{
	CString s;
	s.Format("Y:%f",(float)(pointy-m_CurPos.y)/stepy);
	pCmdUI->SetText(s);

}

void CZhangjg_dspView::OnRetriangle() 
{
	// TODO: Add your command handler code here
		m_Test=TRUE;
	CZhangjg_dspDoc *pDoc=GetDocument();//获取活动文档的指针;
	CExpression expression;
	CTriangle Dlg;
	Dlg.m_n=8;
		if (Dlg.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	   	pDoc->m_N=Dlg.m_n;
		pDoc->m_n=Dlg.m_n;
		pDoc->X=new double[pDoc->m_N];                 //开辟内存,存储初值数组长度;
		for(int i=0;i<=pDoc->m_N-1;i++)
		{
			pDoc->X[i]=0;
		}                                      //置零;
		X=new double[pDoc->m_N];                 //开辟内存,存储初值数组长度;
		for(i=0;i<=pDoc->m_N-1;i++)
		{
			X[i]=0;
		}                                      //置零;
		expression.ReTriangle(pDoc->m_n,pDoc->X);
		memcpy(X, pDoc->X, sizeof(double) * pDoc->m_n); //copy pDoc->X to X,use X for show;
        flag=1;                  //show modle;
		stepx=(int)900/pDoc->m_n;
        stepy=50;
	    pointx=50;
	    pointy=500;              //coordinate following;
		pDoc->UpdateAllViews(NULL);//更新视图
}

void CZhangjg_dspView::OnRectanglesy2() 
{
	// TODO: Add your command handler code here
	
}

⌨️ 快捷键说明

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