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

📄 show.cpp

📁 多通道IIR自适应算法仿真效果图
💻 CPP
字号:
// show.cpp : implementation file
//

#include "stdafx.h"
#include "lms.h"
#include "show.h"
#include "lmsView.h"
#include "math.h"
#include "MainFrm.h"
#include "lmsDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// show

IMPLEMENT_DYNCREATE(show, CView)

show::show()
{
}

show::~show()
{
}


BEGIN_MESSAGE_MAP(show, CView)
	//{{AFX_MSG_MAP(show)
	ON_WM_PAINT()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// show drawing

void show::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// show diagnostics

#ifdef _DEBUG
void show::AssertValid() const
{
	CView::AssertValid();
}

void show::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// show message handlers

void show::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	CClientDC ddd(this);
	CPen pen1(0,2,RGB(0,0,0));
	CPen pen2(0,2,RGB(0,0,255));
	CPen pen3(0,2,RGB(255,0,0));
	CPen pen4(0,2,RGB(255,255,0));
	CPen pen5(0,2,RGB(199,7,201));
	CPen pen6(0,2,RGB(200,246,17));
	CPen pen7(0,2,RGB(246,103,17));

	//第一个坐标系:E平方和
	CPen* pOldPen=ddd.SelectObject(&pen1);
	ddd.SetROP2(R2_COPYPEN);
	CFont font;
	font.CreateFont(35,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Aerial");
	ddd.SelectObject(&font);

	//画坐标系
    ddd.MoveTo(50,200);
	ddd.LineTo(350,200);
	ddd.MoveTo(50,50);
	ddd.LineTo(50,300);
	//画坐标符号
	ddd.MoveTo(50,50);
	ddd.LineTo(45,55);
	ddd.MoveTo(50,50);
	ddd.LineTo(55,55);
	ddd.SetBkMode(TRANSPARENT);
    ddd.TextOut(4,60,"y轴");
	ddd.MoveTo(350,200);
	ddd.LineTo(345,195);
	ddd.MoveTo(350,200);
	ddd.LineTo(345,205);
    ddd.TextOut(335,210,"x轴");
	ddd.TextOut(100,40,"目标函数效果图");
	ddd.TextOut(250,10,"多通道IIR自适应算法仿真效果图");

	//第二个坐标系:权值
//	ddd.SelectObject(&pen2);
//	ddd.SetROP2(R2_COPYPEN);
	//画坐标系
    ddd.MoveTo(450,200);
	ddd.LineTo(800,200);
	ddd.MoveTo(450,50);
	ddd.LineTo(450,300);
	//画坐标符号
	ddd.MoveTo(450,50);
	ddd.LineTo(445,55);
	ddd.MoveTo(450,50);
	ddd.LineTo(455,55);
	ddd.SetBkMode(TRANSPARENT);
    ddd.TextOut(400,60,"y轴");
	ddd.MoveTo(800,200);
	ddd.LineTo(795,195);
	ddd.MoveTo(800,200);
	ddd.LineTo(795,205);
    ddd.TextOut(790,210,"x轴");
	ddd.TextOut(600,40,"权值变化曲线");
	//第三个坐标系:输出y
//	ddd.SelectObject(&pen3);
//	ddd.SetROP2(R2_COPYPEN);
	//画坐标系
	ddd.MoveTo(50,500);
	ddd.LineTo(350,500);
	ddd.MoveTo(50,350);
	ddd.LineTo(50,600);
	//画坐标符号
	ddd.MoveTo(50,350);
	ddd.LineTo(45,355);
	ddd.MoveTo(50,350);
	ddd.LineTo(55,355);
	ddd.SetBkMode(TRANSPARENT);
    ddd.TextOut(4,370,"y轴");
	ddd.MoveTo(350,500);
	ddd.LineTo(345,495);
	ddd.MoveTo(350,500);
	ddd.LineTo(345,505);
    ddd.TextOut(340,520,"x轴");
	ddd.TextOut(150,340,"通道0控制输出");
	//第四个坐标系:0通道误差e(0)
//	ddd.SelectObject(&pen4);
//	ddd.SetROP2(R2_COPYPEN);
	//画坐标系
    ddd.MoveTo(450,500);
	ddd.LineTo(800,500);
	ddd.MoveTo(450,350);
	ddd.LineTo(450,600);
	//画坐标符号
	ddd.MoveTo(450,350);
	ddd.LineTo(445,355);
	ddd.MoveTo(450,350);
	ddd.LineTo(455,355);
	ddd.SetBkMode(TRANSPARENT);
    ddd.TextOut(400,370,"y轴");
	ddd.MoveTo(800,500);
	ddd.LineTo(795,495);
	ddd.MoveTo(800,500);
	ddd.LineTo(795,505);
    ddd.TextOut(780,520,"x轴");
	ddd.TextOut(600,340,"通道0误差响应");
	//调用曲线显示函数
	drawquxian();
	
}


//图像输出,即Error图形,有三种情况,无控,FIR控制,IIR控制
bool show::drawquxian()
{
	CLmsApp *pApp = (CLmsApp *)AfxGetApp();
	CMainFrame *pFrame = (CMainFrame *)pApp->m_pMainWnd;
	CLmsView *pView = (CLmsView *)pFrame->diviedview.GetPane(0,0);
//	pView->m_squareinput=false;
//	pView->m_sininput=true;
//	pView->m_triangleinput=false;
	stepsizeX=pView->m_Uvalue;
	stepsizeY=pView->m_aaValue;

	float REtemp,errortemp,Outputtemp;
	float relatXTemp;
	float relatYTemp;

	int tvalue,kvalue;
	if(stepsizeX>=0)
	{
		for(k=0;k<K;k++)
		{
			error00[k]=0.0;
			errorfir[k]=0.0;
			erroriir[k]=0.0;
			Input[k]=0.0;
			for(l=0;l<L;l++)
				Output[k][l]=0.1;
		}
//		AfxMessageBox("ok");

		//error00[K]表示k时刻E性能目标函数,
		if(pView->m_sininput==true)
		{	for(k=0;k<K;k++)
			{	Input[k]=sin(float(k));///5+Pie
				for(l=0;l<L;l++)
					B[k][l]=float(sin(float(k)+Pie/6));
			}
		}
		else if(pView->m_squareinput==true)
		{
			for(k=0;k<K;k++)
				if(sin(float(k)/10)!=0)
				{
					Input[k]=fabs(sin(float(k)/10))/sin(float(k)/10);
					for(l=0;l<L;l++)
					B[k][l]=fabs(sin(float(k)/10))/sin(float(k)/10);
				}
				else 
				{
					Input[k]=fabs(sin(float(k)/10+Pie/4))/sin(float(k)/10+Pie/4);
					for(l=0;l<L;l++)
					B[k][l]=fabs(sin(float(k)/10+Pie/4))/sin(float(k)/10+Pie/4);
				}
			CString string2;
			string2.Format("%f",Input[0]);
//			MessageBox(string2);

		}

		else if(pView->m_triangleinput==true)
			{
				for(k=0;k<K;k++)
				{
					tvalue=k/16;
					kvalue=k%16;
					if(kvalue<=4)
					{	
						Input[k]=0.7*(k-tvalue*16);
						for(l=0;l<L;l++)
							B[k][l]=0.7*(k-tvalue*16);
					}
					else if((kvalue>=4)&&(kvalue<=12))
					{
						Input[k]=-0.7*(k-tvalue*16-8);
						for(l=0;l<L;l++)
							B[k][l]=-0.7*(k-tvalue*16-8);
					}
					else
					{
						Input[k]=0.7*(k-tvalue*16-16);
						for(l=0;l<L;l++)
							B[k][l]=0.7*(k-tvalue*16-16);
					}

				}

			}

	//控制通道赋值,有介数
		for (m=0;m<M;m++)
			for (n=0;n<N;n++)
				for (p=0;p<P;p++)
					H[m][n][p]=1.0;
	//外扰响应向量赋值,并计算无控时的性能目标函数
		for (k=0;k<K;k++)
		{
			for (l=0;l<L;l++)
			{
				errornolms[k][l]=B[k][l];
				errorlms[k][l]=B[k][l];
				error00[k]=B[k][l]*B[k][l]+error00[k];
			}
		}

	//控制权矩阵赋初值
		for (k=0;k<K;k++)
			for (m=0;m<M;m++)
			{
				for (n=0;n<N;n++)
					W[k][m][n]=float(sin((float)(k+m+n)*Pie/10.0));
				for (q=0;q<Q;q++)
					D[k][m][q]=float(sin((float)(k+m+q)*Pie/10.0));
			}

	//初值relatX[k][m][l],relatY[k][m][l]
		for (k=0;k<K;k++)
			for (m=0;m<M;m++)
				for (l=0;l<L;l++)
				{
					relatX[k][m][l]=0.0;
					relatY[k][m][l]=0.0;
				}


	//计算R和G的值,即relatX[k][m][l],relatY[k][m][l]
		for (k=0;k<K;k++)
			for (l=0;l<L;l++)
				for (m=0;m<M;m++)
					for (p=0;p<P;p++)
					{ 
						relatXTemp=0.0;
						if((k-p)>=0)
							relatXTemp=H[m][l][p]*Input[k-p];
						else
							relatXTemp=0;
						relatX[k][m][l]=relatX[k][m][l]+relatXTemp;
					
						relatYTemp=0.0;
						if((k-p-1)>=0)
							relatYTemp=H[m][l][p]*Output[k-p-1][m];
						else
							relatYTemp=0;
						relatY[k][m][l]=relatY[k][m][l]+relatYTemp;

					}

		if(pView->m_firlms)
	//按照FIR-LMS算法调整W
		for (k=0;k<K;k++)
		{	
		//首先计算error,目标函数
			for (l=0;l<L;l++)
			{
				errortemp=0; 
				for (m=0;m<M;m++)
				{
					for (n=0;n<N;n++)
						if((k-n)>=0)
							errortemp=W[k][m][n]*relatX[k-n][m][l]+errortemp;
				}
				errorlms[k][l]=errortemp+B[k][l];
				errorfir[k]=errorfir[k]+errorlms[k][l]*errorlms[k][l];
			}

		//计算W,迭代
			for (m=0;m<M;m++)
			{
				for (n=0;n<N;n++)
				{
					REtemp=0.0;
					for (l=0;l<L;l++)
						if(k-n>=0)
							REtemp=errorlms[k][l]*relatX[k-n][m][l]+REtemp;
					W[k+1][m][n]=W[k][m][n]-REtemp*stepsizeX;
				}
			}
		//计算Y
			for (m=0;m<M;m++)
			{
				Outputtemp=0;
				for (n=0;n<N;n++)
					if((k-n)>=0)
						Outputtemp=W[k][m][n]*Input[k-n]+Outputtemp;
				Output[k][m]=Outputtemp;
			}
		}
		//按照IIR-LMS调整权值
	else if(pView->m_iirlms)
		for (k=0;k<K;k++)
		{	
		//首先计算error,目标函数
			for (l=0;l<L;l++)
			{
				errortemp=0; 
				for (m=0;m<M;m++)
				{
					for (n=0;n<N;n++)
						if((k-n)>=0)
							errortemp=W[k][m][n]*relatX[k-n][m][l]+errortemp;
					for (q=0;q<Q;q++)
						if((k-q)>=0)
							errortemp=errortemp-D[k][m][q]*relatY[k-q][m][l];
				}
				errorlms[k][l]=errortemp+B[k][l];
				erroriir[k]=erroriir[k]+errorlms[k][l]*errorlms[k][l];
			}
		//计算Y
			for (m=0;m<M;m++)
			{
				Outputtemp=0;
				for (n=0;n<N;n++)
					if((k-n)>=0)
						Outputtemp=W[k][m][n]*Input[k-n]+Outputtemp;
				Output[k][m]=Outputtemp;
				Outputtemp=0;
				for(q=0;q<Q;q++)
					if((k-q-1)>=0)
						Outputtemp=Outputtemp+D[k][m][q]*Output[k-q-1][m];
				Output[k][m]=Output[k][m]-Outputtemp;
			}

		//计算W,即前向滤波器权值,
			for (m=0;m<M;m++)
			{
				for (n=0;n<N;n++)
				{
					REtemp=0.0;
					for (l=0;l<L;l++)
						if(k-n>=0)
							REtemp=errorlms[k][l]*relatX[k-n][m][l]+REtemp;
					W[k+1][m][n]=W[k][m][n]-REtemp*stepsizeX;
				}
			}
		//计算D,即后向滤波器权值,
			for (m=0;m<M;m++)
			{
				for (q=0;q<Q;q++)
				{
					REtemp=0.0;
					for (l=0;l<L;l++)
						if((k-q-1)>=0)
							REtemp=errorlms[k][l]*relatY[k-q-1][m][l]+REtemp;
					D[k+1][m][q]=D[k][m][q]-REtemp*stepsizeY;
				}
			}
			//迭代计算relatY[k][m][l],即G
			for (l=0;l<L;l++)
				for (m=0;m<M;m++)
				{	
					for (p=0;p<P;p++)
					{ 
						relatYTemp=0.0;
						if((k-p-1)>=0)
							relatYTemp=H[m][l][p]*Output[k-p-1][m];
						relatY[k][m][l]=relatY[k][m][l]+relatYTemp;

					}
				}

		}

	index=1;
	SetTimer(1,10,NULL);
	}
	return true;

}
	

void show::OnTimer(UINT nIDEvent) 
{
	if(nIDEvent==1)
    {
	 
		CClientDC ddd(this);
		CPen pen1(0,2,RGB(0,255,0));					//RGB 红绿蓝
		CPen pen2(0,2,RGB(0,0,255));
		CPen pen3(0,2,RGB(255,0,0));
		CPen pen4(0,2,RGB(255,255,0));
		CPen pen5(0,2,RGB(199,7,201));
		CPen pen6(0,2,RGB(200,246,17));
		CPen pen7(0,2,RGB(246,103,17));

		CLmsApp *pApp = (CLmsApp *)AfxGetApp();
		CMainFrame *pFrame = (CMainFrame *)pApp->m_pMainWnd;
		CLmsView *pView = (CLmsView *)pFrame->diviedview.GetPane(0,0);
		ddd.SetROP2(R2_COPYPEN);

		//显示原始图像输出,即Error
		if(pView->m_nolms==1)
		{
			ddd.SelectObject(&pen2);	
			ddd.MoveTo(index+50,-30*error00[index-1]+200);
			ddd.LineTo(index+50,-30*error00[index]+200);
			//在坐标系四中画出0测量通道误差,即E[k][0]
			ddd.SelectObject(&pen2);	
			ddd.MoveTo(index+450, -20*errornolms[index-1][1]+500);
			ddd.LineTo(index+450,-20*errornolms[index][1]+500);
		}

		 if(pView->m_firlms==1)
		{
			ddd.SelectObject(&pen3);	
			ddd.MoveTo(index+50,-30*errorfir[index-1]+200);
			ddd.LineTo(index+50,-30*errorfir[index]+200);
			//在坐标系二中画出0通道0阶权值,即W[k][0][0]
			ddd.SelectObject(&pen5);	
			ddd.MoveTo(index+450, -60*W[index-1][0][0]+200);
			ddd.LineTo(index+450,-60*W[index][0][0]+200);
			//在坐标系三中画出输出0通道控制输出,即Y[k][0]
			ddd.SelectObject(&pen6);	
			ddd.MoveTo(index+50, -100*Output[index-1][0]+500);
			ddd.LineTo(index+50,-100*Output[index][0]+500);
			//在坐标系四中画出0测量通道误差,即E[k][0]
			ddd.SelectObject(&pen7);	
			ddd.MoveTo(index+450, -20*errorlms[index-1][1]+500);
			ddd.LineTo(index+450,-20*errorlms[index][1]+500);
		}

		if(pView->m_iirlms==1)
		{
			ddd.SelectObject(&pen5);	
			ddd.MoveTo(index+50, -30*erroriir[index-1]+200);
			ddd.LineTo(index+50,-30*erroriir[index]+200);
			//在坐标系二中画出0通道0阶权值,即W[k][0][0]
			ddd.SelectObject(&pen5);	
			ddd.MoveTo(index+450, -60*D[index-1][0][0]+200);
			ddd.LineTo(index+450,-60*D[index][0][0]+200);
			//在坐标系三中画出输出0通道控制输出,即Y[k][0]
			ddd.SelectObject(&pen6);	
			ddd.MoveTo(index+50, -100*Output[index-1][0]+500);
			ddd.LineTo(index+50,-100*Output[index][0]+500);
			//在坐标系四中画出0测量通道误差,即E[k][0]
			ddd.SelectObject(&pen7);	
			ddd.MoveTo(index+450, -20*errorlms[index-1][1]+500);
			ddd.LineTo(index+450,-20*errorlms[index][1]+500);
/**/		}


		index++;
		if(index>(K-3)) 
		{   
			index=1;
			KillTimer(1);
		}
	 } 
}

⌨️ 快捷键说明

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