?? show.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,"目標函數(shù)效果圖");
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誤差響應");
//調用曲線顯示函數(shù)
drawquxian();
}
//圖像輸出,即Error圖形,有三種情況,無控,F(xiàn)IR控制,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性能目標函數(shù),
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);
}
}
}
//控制通道賦值,有介數(shù)
for (m=0;m<M;m++)
for (n=0;n<N;n++)
for (p=0;p<P;p++)
H[m][n][p]=1.0;
//外擾響應向量賦值,并計算無控時的性能目標函數(shù)
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,目標函數(shù)
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,目標函數(shù)
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 + -