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

📄 windowfilterview.cpp

📁 数字信号处理实验
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	CString str;
	pOldFont  = pLinwDC.SelectObject(&bigFont);
	str.Format("%d",10);
	pLinwDC.TextOut(0,-1*(rect.bottom/2-2),str);
	pLinwDC.SelectObject(&smallFont);
	int yymax =(int)log10(max);
	str.Format("%d",yymax);
	pLinwDC.TextOut(0+14,-1*(rect.bottom/2),str);	
	//绘制线段	
	pLinwDC.SelectObject(&pointPen);
	pLinwDC.SelectObject(pOldFont);
	int i,x,y;
	float y1;
	int j = 0;
	for (i=0; i<length; i++)
	{
		//标注x轴
		if (i % xbiaozhu == 0 && i !=0)
		{		
			j ++ ;
			str.Format("%.1f",(float )j / biaozhunum * xmax);
			pLinwDC.TextOut((int)(i * detaX - 4) , 3, str);
		}		
		x = (int)(i * detaX);
		y1 = num[i];
		y = (int)(y1 * detaY);
		//第一个点
		if (i == 0)
		{
			CPoint firstPt(x,-y);
// 			pLinwDC.SetPixel(firstPt,RGB(255,0,0));
			pLinwDC.MoveTo(x,-y);
			// 		pLinwDC.Ellipse(x-2,-2,x+2,2);
		} 
		else
		{
			// 			pLinwDC.MoveTo(x,0);
			pLinwDC.LineTo(x,-y);
			// 			pLinwDC.Ellipse(x-2,-y-2,x+2,-y+2);
		}
	}
	pLinwDC.SelectObject(pOldPen);
	//  pLinwDC.SelectObject(pOldFont);
	axisPen.DeleteObject();
	pointPen.DeleteObject();	
	bigFont.DeleteObject();
	smallFont.DeleteObject();
}
//专门在控件上画线的函数
//参数 n为索引,max为相应的y最大值,num为相应的y的数列
//length为数组的大小
void CWindowFilterView::Stem(int n, int length, float max,float *num)
{
	float detaX ,detaY;
	CRect rect;
	CStatic *pWndLine;
	//得到对应的画板
	switch (n)
	{
	case 1:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE1);				
		break;
// 	case 2:
// 		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE2);				
// 		break;
// 	case 3:
// 		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE3);
// 		break;
	}	
	
	pWndLine->GetClientRect(&rect);
	CClientDC pLinwDC(pWndLine);
	pLinwDC.SetBkMode(TRANSPARENT);                //设置文字背景颜色
	pLinwDC.SetMapMode(MM_TEXT);                   //Y轴向下,画图时候要加负号
	//设置原点
	pLinwDC.SetViewportOrg(int(rect.right/(length+2)),int(rect.bottom/2));
	detaX = (float)(rect.right/(length+2));               //x轴间距
	detaY = (float)(0.5 * (rect.Height()-30) / max);       //y轴间距,重新计算,以及y的大小
	CPen axisPen, pointPen;
	CPen *pOldPen;
	CFont bigFont, smallFont,smallestFont;
	CFont *pOldFont;	
	axisPen.CreatePen(PS_SOLID,2,RGB(0,0,0));     //黑线
	pointPen.CreatePen(PS_SOLID,1,RGB(255,0,0));  //红线
	bigFont.CreatePointFont(100,"Arial",NULL);
	smallFont.CreatePointFont(80,"Arial",NULL);   //小字体
	smallestFont.CreatePointFont(60,"Arial",NULL);
	pOldPen = pLinwDC.SelectObject(&axisPen);	
	//绘制x,y坐标轴
	pLinwDC.MoveTo(0,0);
	pLinwDC.LineTo((int)(detaX*length),0);
	pLinwDC.MoveTo((int)(detaX*length),0);
	pLinwDC.LineTo((int)(detaX*length-8),-4);
	pLinwDC.MoveTo((int)(detaX*length),0);
	pLinwDC.LineTo((int)(detaX*length-8),4);
	pLinwDC.MoveTo(0,rect.bottom/2-10);
	pLinwDC.LineTo(0,-1*(rect.bottom/2-10));
	//求最大值的次方数,用于标注10的几次方
	//之后要创建字体
	CString str;
	pOldFont  = pLinwDC.SelectObject(&bigFont);
	str.Format("%d",10);
	pLinwDC.TextOut(0,-1*(rect.bottom/2-2),str);
	pLinwDC.SelectObject(&smallFont);
	int ymax =(int)log10(max);
	str.Format("%d",ymax);
	pLinwDC.TextOut(0+14,-1*(rect.bottom/2),str);
	
	//绘制线段
	
	pLinwDC.SelectObject(&pointPen);
	//	pLinwDC.SelectObject(pOldFont);
	pLinwDC.SelectObject(&smallestFont);
	pLinwDC.SelectObject(&smallFont);
	int i,x,y;
	// 	int interBiaozhu = (int)(LineCount / 5);
	int interBiaozhu ;
	if (length < 10)
	{
		interBiaozhu = 5;
	} 
	else
	{
		interBiaozhu = log10(length);
		interBiaozhu = pow(10.0,interBiaozhu)/2;
	} 
	float y1;
	for (i=0; i<length; i++)
	{
		if (i % interBiaozhu == 0 && i !=0)
		{
			str.Format("%d",i);
			pLinwDC.TextOut((int)(i * detaX - 4) , 3, str);
		}
		
		x = (int)(i * detaX);
		y1 = num[i];
		y = (int)(y1 * detaY);
		if (y == 0)
		{
			pLinwDC.Ellipse(x-2,-2,x+2,2);
		} 
		else
		{
			pLinwDC.MoveTo(x,0);
			pLinwDC.LineTo(x,-y);
			pLinwDC.Ellipse(x-2,-y-2,x+2,-y+2);
		}
	}
	pLinwDC.SelectObject(pOldPen);
	//  pLinwDC.SelectObject(pOldFont);
	axisPen.DeleteObject();
	pointPen.DeleteObject();	
	bigFont.DeleteObject();
	smallFont.DeleteObject();
	smallestFont.DeleteObject();
}

//划线函数
//n为画板的索引
//未完成,半成品。
void CWindowFilterView::Plot(int n, int length, float max,float *num,float xmin, float xmax,
							 float ymin, float ymax)
{
	float detaX ,detaY;
	CRect rect;
	CStatic *pWndLine;
	//目前只标注5个点。
	int xbiaozhu = length ;
	//得到对应的画板
	switch (n)
	{
	case 1:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE1);				
		break;
	case 2:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE2);				
		break;
	case 3:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE3);
		break;
	}	
	//得到画板的大小
	pWndLine->GetClientRect(&rect);
	CClientDC pLinwDC(pWndLine);
	pLinwDC.SetBkMode(TRANSPARENT);                //设置文字背景颜色
	pLinwDC.SetMapMode(MM_TEXT);                   //Y轴向下,画图时候要加负号
	//设置原点
	pLinwDC.SetViewportOrg(int(rect.right/(length+2)),int(rect.bottom/2));
	detaX = (float)(rect.right/(length+2));               //x轴间距
	detaY = (float)(0.5 * (rect.Height()-30) / max);       //y轴间距,重新计算,以及y的大小
	CPen axisPen, pointPen;
	CPen *pOldPen;
	CFont bigFont, smallFont;
	CFont *pOldFont;	
	axisPen.CreatePen(PS_SOLID,2,RGB(0,0,0));     //黑线
	pointPen.CreatePen(PS_SOLID,1,RGB(255,0,0));  //红线
	bigFont.CreatePointFont(100,"Arial",NULL);
	smallFont.CreatePointFont(80,"Arial",NULL);
	pOldPen = pLinwDC.SelectObject(&axisPen);	
	//绘制x,y坐标轴
	pLinwDC.MoveTo(0,0);
	pLinwDC.LineTo((int)(detaX*length),0);
	pLinwDC.MoveTo((int)(detaX*length),0);
	pLinwDC.LineTo((int)(detaX*length-8),-4);
	pLinwDC.MoveTo((int)(detaX*length),0);
	pLinwDC.LineTo((int)(detaX*length-8),4);
	pLinwDC.MoveTo(0,rect.bottom/2-10);
	pLinwDC.LineTo(0,-1*(rect.bottom/2-10));
	//求最大值的次方数,用于标注10的几次方
	//之后要创建字体
	CString str;
	pOldFont  = pLinwDC.SelectObject(&bigFont);
	str.Format("%d",10);
	pLinwDC.TextOut(0,-1*(rect.bottom/2-2),str);
	pLinwDC.SelectObject(&smallFont);
	int yymax =(int)log10(max);
	str.Format("%d",yymax);
	pLinwDC.TextOut(0+14,-1*(rect.bottom/2),str);	
	//绘制线段	
	pLinwDC.SelectObject(&pointPen);
	pLinwDC.SelectObject(pOldFont);
	int i,x,y;
	float y1;

	for (i=1; i<length; i++)
	{
 		if (i % xbiaozhu == 0 && i !=0)
 		{
 			str.Format("%d",i);
			pLinwDC.TextOut((int)(i * detaX - 4) , 3, str);
		}		
		x = (int)(i * detaX);
		y1 = num[i];
		y = (int)(y1 * detaY);
		//第一个点
		if (i == 0)
 		{
			CPoint firstPt(x,-y);
			pLinwDC.SetPixel(firstPt,RGB(255,0,0));
 // 		pLinwDC.Ellipse(x-2,-2,x+2,2);
 		} 
 		else
		{
// 			pLinwDC.MoveTo(x,0);
			pLinwDC.LineTo(x,-y);
// 			pLinwDC.Ellipse(x-2,-y-2,x+2,-y+2);
		}
	}
	pLinwDC.SelectObject(pOldPen);
	//  pLinwDC.SelectObject(pOldFont);
	axisPen.DeleteObject();
	pointPen.DeleteObject();	
	bigFont.DeleteObject();
	smallFont.DeleteObject();
}
//函数重载
//最原始的画图函数
void CWindowFilterView::Plot(int n, int length, float max,float *num,  
							 float ymin, float ymax)
{
	float detaX ,detaY;
	CRect rect;
	CStatic *pWndLine;
	//目前只标注5个点。
	int biaozhunum = 5;
	int xbiaozhu = length / biaozhunum;
	//得到对应的画板
	switch (n)
	{
	case 1:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE1);				
		break;
	case 2:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE2);				
		break;
	case 3:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE3);
		break;
	}	
	//得到画板的大小
	pWndLine->GetClientRect(&rect);
	CClientDC pLinwDC(pWndLine);
	pLinwDC.SetBkMode(TRANSPARENT);                //设置文字背景颜色
	pLinwDC.SetMapMode(MM_TEXT);                   //Y轴向下,画图时候要加负号
	//设置原点
	pLinwDC.SetViewportOrg(int(rect.right/(length+2)),int(rect.bottom/2));
	detaX = (float)(rect.right/(length+2));               //x轴间距
	detaY = (float)(0.5 * (rect.Height()-30) / max);       //y轴间距,重新计算,以及y的大小
	CPen axisPen, pointPen;
	CPen *pOldPen;
	CFont bigFont, smallFont;
	CFont *pOldFont;	
	axisPen.CreatePen(PS_SOLID,2,RGB(0,0,0));     //黑线
	pointPen.CreatePen(PS_SOLID,1,RGB(255,0,0));  //红线
	bigFont.CreatePointFont(100,"Arial",NULL);
	smallFont.CreatePointFont(80,"Arial",NULL);
	pOldPen = pLinwDC.SelectObject(&axisPen);	
	//绘制x,y坐标轴
	pLinwDC.MoveTo(0,0);
	pLinwDC.LineTo((int)(detaX*length),0);
	pLinwDC.MoveTo((int)(detaX*length),0);
	pLinwDC.LineTo((int)(detaX*length-8),-4);
	pLinwDC.MoveTo((int)(detaX*length),0);
	pLinwDC.LineTo((int)(detaX*length-8),4);
	pLinwDC.MoveTo(0,rect.bottom/2-10);
	pLinwDC.LineTo(0,-1*(rect.bottom/2-10));
	//求最大值的次方数,用于标注10的几次方
	//之后要创建字体
	CString str;
	pOldFont  = pLinwDC.SelectObject(&bigFont);
	str.Format("%d",10);
	pLinwDC.TextOut(0,-1*(rect.bottom/2-2),str);
	pLinwDC.SelectObject(&smallFont);
	int yymax =(int)log10(max);
	str.Format("%d",yymax);
	pLinwDC.TextOut(0+14,-1*(rect.bottom/2),str);	
	//绘制线段	
	pLinwDC.SelectObject(&pointPen);
	pLinwDC.SelectObject(pOldFont);
	int i,x,y;
	float y1;
	for (i=1; i<length; i++)
	{
		if (i % xbiaozhu == 0 && i !=0)
		{
			str.Format("%d",i);
			pLinwDC.TextOut((int)(i * detaX - 4) , 3, str);
		}		
		x = (int)(i * detaX);
		y1 = num[i];
		y = (int)(y1 * detaY);
		//第一个点
		if (i == 0)
		{
			CPoint firstPt(x,-y);
			pLinwDC.SetPixel(firstPt,RGB(255,0,0));
			// 		pLinwDC.Ellipse(x-2,-2,x+2,2);
		} 
		else
		{
			// 			pLinwDC.MoveTo(x,0);
			pLinwDC.LineTo(x,-y);
			// 			pLinwDC.Ellipse(x-2,-y-2,x+2,-y+2);
		}
	}
	pLinwDC.SelectObject(pOldPen);
	//  pLinwDC.SelectObject(pOldFont);
	axisPen.DeleteObject();
	pointPen.DeleteObject();	
	bigFont.DeleteObject();
	smallFont.DeleteObject();
}


//绘图函数
void CWindowFilterView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	if (m_bFirst == FALSE)
	{
		m_bFirst = TRUE;
	}
	else
	{
		if ((m_iFilterType == 2 || m_iFilterType ==3)&& (m_WcHigh == m_WcLow))
		{
			MessageBox("两个截止频率不能相同!");		
		}
		else
		{
			CreateHFun(m_iFilterType, m_WindowLength);	
			m_FFTLength = CreateFFT(XReal, XImag, pReal, pImag, m_WindowLength);
		//	modify();
			CreateAbs(XAbs,XReal,XImag,m_FFTLength);
			CreateArg(XArg,XReal,XImag,m_FFTLength);
			MaxReal = mymax(pReal,m_WindowLength);
			MaxXAbs = mymax(XAbs, m_FFTLength);
			MaxXArg = mymax(XArg, m_FFTLength);		
			Stem(1,m_WindowLength,MaxReal,pReal);
			Plot(2,m_FFTLength/2,MaxXAbs,XAbs,1,-80,0);     //只需要画出一半即可,0-PI
			Plot(3,m_FFTLength/2,MaxXArg,XArg,1);
		}	
	}		
}
void CWindowFilterView::OnBtnDraw() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_bFirst = TRUE;
	Invalidate(); 
}
void CWindowFilterView::OnDraw(CDC* pDC) 
{
	// TODO: Add your specialized code here and/or call the base class
	if (m_bFirst == TRUE)
	{
		if ((m_iFilterType == 2 || m_iFilterType ==3)&& (m_WcHigh == m_WcLow))
		{
			MessageBox("两个截止频率不能相同!");		
		}
		else
		{
			CreateHFun(m_iFilterType, m_WindowLength);	
			m_FFTLength = CreateFFT(XReal, XImag, pReal, pImag, m_WindowLength);
		//	modify();
			CreateAbs(XAbs,XReal,XImag,m_FFTLength);
			CreateArg(XArg,XReal,XImag,m_FFTLength);
			MaxReal = mymax(pReal,m_WindowLength);
			MaxXAbs = mymax(XAbs, m_FFTLength);
			MaxXArg = mymax(XArg, m_FFTLength);		
			Stem(1,m_WindowLength,MaxReal,pReal);
			Plot(2,m_FFTLength/2,MaxXAbs,XAbs,1,-80,0);     //只需要画出一半即可,0-PI
			Plot(3,m_FFTLength/2,MaxXArg,XArg,1);
		}	
	}		
}

void CWindowFilterView::modify()
{
	int i;
	for (i=0; i<m_FFTLength; i++)
	{
		if (fabs(XReal[i]) < 1e-6)
		{
			XReal[i] = 0.0;
		}
		if (fabs(XImag[i]) < 1e-6)
		{
			XImag[i] = 0.0;
		}
	}
}

⌨️ 快捷键说明

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