📄 els_ro_aicdlg.cpp
字号:
// ELS_RO_AICDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ELS_RO_AIC.h"
#include "ELS_RO_AICDlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define A 179
#define PAI 3.1415926
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CELS_RO_AICDlg dialog
CELS_RO_AICDlg::CELS_RO_AICDlg(CWnd* pParent /*=NULL*/)
: CDialog(CELS_RO_AICDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CELS_RO_AICDlg)
m_dwnVAR = 0.1;
m_dwnMEAN = 0.0;
m_nwnLEN = 600;
m_nmVALn = 10;
m_nmLOC = 103;
m_nmLEN = 1023;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CELS_RO_AICDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CELS_RO_AICDlg)
DDX_Control(pDX, IDC_EDIT_mLOC, m_CEdit_MLOC);
DDX_Control(pDX, IDC_SPIN_MLOC, m_ctrMLOC);
DDX_Text(pDX, IDC_EDIT_wnVAR, m_dwnVAR);
DDX_Text(pDX, IDC_EDIT_wnMEAN, m_dwnMEAN);
DDX_Text(pDX, IDC_EDIT_wnLEN, m_nwnLEN);
DDX_Text(pDX, IDC_EDIT_mVALn, m_nmVALn);
DDX_Text(pDX, IDC_EDIT_mLOC, m_nmLOC);
DDX_Text(pDX, IDC_EDIT_mLEN, m_nmLEN);
DDX_Control(pDX, IDC_STATIC_IDRefTEXT, m_ctrStaticIDRefText);
DDX_Control(pDX, IDC_STATIC_ErrTEXT, m_ctrStaticErrText);
DDX_Control(pDX, IDC_STATIC_GRAPH, m_ctrStaticGraph);
DDX_Control(pDX, IDC_STATIC_RefTEXT, m_ctrStaticRefText);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CELS_RO_AICDlg, CDialog)
//{{AFX_MSG_MAP(CELS_RO_AICDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_whitenoiseMAKE, OnBUTTONwhitenoiseMAKE)
ON_BN_CLICKED(IDC_BUTTON_mSerialMAKE, OnBUTTONmSerialMAKE)
ON_BN_CLICKED(IDC_BUTTON_ELS_RO_AIC, OnButtonElsRoAic)
ON_EN_CHANGE(IDC_EDIT_mVALn, OnChangeEDITmVALn)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_RADIO_MODEL1, OnRadioModel1)
ON_BN_CLICKED(IDC_RADIO_MODEL2, OnRadioModel2)
ON_WM_LBUTTONDBLCLK()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CELS_RO_AICDlg message handlers
BOOL CELS_RO_AICDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_ctrMLOC.SetBuddy(&m_CEdit_MLOC);
m_ctrMLOC.SetRange(0,m_nmLEN-m_nwnLEN);
m_tempInt=NULL;
CButton * pButton = (CButton *) this->GetDlgItem(IDC_RADIO_MODEL1);
pButton->SetCheck(1);
model=TRUE;
ZZZ=NULL;
return TRUE; // return TRUE unless you set the focus to a control
}
void CELS_RO_AICDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CELS_RO_AICDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CELS_RO_AICDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CELS_RO_AICDlg::OnBUTTONwhitenoiseMAKE()
{
// TODO: Add your control notification handler code here
//FILE *fp1;
FILE *fp2;
int N=m_nwnLEN+1;
int i;
double *inta1,*inta2;
double *x1,*x2,*y1,*y2;
inta1=(double*)malloc(N*sizeof(double));
inta2=(double*)malloc(N*sizeof(double));
x1=(double*)malloc((N+1)*sizeof(double));
x2=(double*)malloc((N+1)*sizeof(double));
y1=(double*)malloc(N*sizeof(double));
y2=(double*)malloc(N*sizeof(double));
x1[0]=11.0;
x2[0]=13.0;
junyun(N-1,x2,y2);
junyun(N-1,x1,y1);
if((fp2=fopen("WhiteNoise2.txt","w"))==NULL)
{
MessageBox("cannot open the file :WhiteNoise2.txt\n");
return;
}
for (i=0;i<N-1;i++)
{
inta1[i]=sqrt(-2*log(y1[i]))*cos(2*PAI*y2[i])*sqrt(m_dwnVAR)+m_dwnMEAN;
inta2[i]=sqrt(-2*log(y1[i]))*sin(2*PAI*y2[i])*sqrt(m_dwnVAR)+m_dwnMEAN;
if(inta2[i]>0) fprintf(fp2," %3.12f ",inta2[i]);
else fprintf(fp2,"%3.12f ",inta2[i]);
if (((i+1)%10)==0) fprintf(fp2,"\n");
}
fclose(fp2);
free(inta1);
free(inta2);
free(x1);
free(x2);
free(y1);
free(y2);
return;
}
void CELS_RO_AICDlg::junyun(int n, double x[], double y[])
{
int i,b;
unsigned long c;
c=4294967;
for (i=1;i<=n+1;i++)
{
b=(int)(A*x[i-1])/c;
x[i]=(A*x[i-1])-b*c;
y[i-1]=x[i-1]/c;
}
return;
}
void CELS_RO_AICDlg::OnBUTTONmSerialMAKE()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
FILE *fp;
int i,j;
int m_nAmpMserial=1;
m_nmLEN=(int)pow(2,m_nmVALn)-1;
UpdateData(FALSE);
int *yita,*u;
u=(int *)malloc(m_nmLEN*sizeof(int));
yita=(int *)malloc(m_nmLEN*sizeof(int));
if((fp=fopen("MSerials.txt","w"))==NULL)
{
MessageBox("cannot open the file :MSerials.txt\n");
return;
}
j=0;
for(i=0;i<m_nmVALn;i++)
{
yita[i]=1;
u[i]=yita[i]*m_nAmpMserial;
fprintf(fp,"%3d ",u[i]);
j++;
}
for(i=m_nmVALn;i<m_nmLEN;i++)
{
switch( m_nmVALn )
{
case 2:
yita[i]=yita[i-m_nmVALn]^yita[i-1];
break;
case 3 :
yita[i]=yita[i-m_nmVALn]^yita[i-2];
break;
case 4 :
yita[i]=yita[i-m_nmVALn]^yita[i-3];
break;
case 5:
yita[i]=yita[i-m_nmVALn]^yita[i-3];
break;
case 6 :
yita[i]=yita[i-m_nmVALn]^yita[i-5];
break;
case 7 :
yita[i]=yita[i-m_nmVALn]^yita[i-4];
break;
case 8:
yita[i]=yita[i-m_nmVALn]^yita[i-7]^yita[i-6]^yita[i-1];
break;
case 9 :
yita[i]=yita[i-m_nmVALn]^yita[i-5];
break;
case 10 :
yita[i]=yita[i-m_nmVALn]^yita[i-7];
break;
case 11:
yita[i]=yita[i-m_nmVALn]^yita[i-9];
break;
case 12 :
yita[i]=yita[i-m_nmVALn]^yita[i-8]^yita[i-5]^yita[i-1];
break;
case 13 :
yita[i]=yita[i-m_nmVALn]^yita[i-8]^yita[i-6]^yita[i-1];
break;
}
u[i]=(2*yita[i]-1)*m_nAmpMserial;
fprintf(fp,"%3d ",u[i]);
j++;
if(j==20)
{
fprintf(fp,"\n");
j=0;
}
}
fclose(fp);
free(yita);
free(u);
}
void CELS_RO_AICDlg::brinv(double *a, int n)
{
int *is,*js,i,j,k,l,u,v;
double d,p;
is=(int *)malloc(n*sizeof(int));
js=(int *)malloc(n*sizeof(int));
for (k=0; k<=n-1; k++)
{ d=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{ l=i*n+j; p=fabs(a[l]);
if (p>d) { d=p; is[k]=i; js[k]=j;}
}
if (d+1.0==1.0)
{ free(is); free(js);
return;
}
if (is[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=is[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (js[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+js[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
l=k*n+k;
a[l]=1.0/a[l];
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=k*n+j; a[u]=a[u]*a[l];}
for (i=0; i<=n-1; i++)
if (i!=k)
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=i*n+j;
a[u]=a[u]-a[i*n+k]*a[k*n+j];
}
for (i=0; i<=n-1; i++)
if (i!=k)
{ u=i*n+k; a[u]=-a[u]*a[l];}
}
for (k=n-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=js[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (is[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+is[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
}
free(is);
free(js);
return;
}
void CELS_RO_AICDlg::brmul(double *a, double *b, int m, int n, int k, double *c)
{
int i,j,l,u;
for (i=0; i<=m-1; i++)
for (j=0; j<=k-1; j++)
{
u=i*k+j; c[u]=0.0;
for (l=0; l<=n-1; l++)
c[u]=c[u]+a[i*n+l]*b[l*k+j];
}
return;
}
void CELS_RO_AICDlg::WriteMatrix2File(char *filename, double *a, int Length, int column)
{
FILE *fp;
int i,j;
char fileName[30];
strcpy(fileName,filename);
strcat(fileName,".txt");
if((fp=fopen(fileName,"w"))==NULL) return;
for(i=0;i<Length;i++)
{
for(j=0;j<column;j++)
{
if(a[i*column+j]>=0) fprintf(fp," %6.12f ",a[i*column+j]);
else fprintf(fp,"%6.12f ",a[i*column+j]);
}
fprintf(fp,"\n");
}
fclose(fp);
}
void CELS_RO_AICDlg::OnButtonElsRoAic()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_nIndex=3;
if(m_nmLEN-m_nmLOC<m_nwnLEN)
{
MessageBox("所取M序列长度小于白噪声长度,请重新输入!");
return;
}
ZZZ=(int*)calloc(m_nwnLEN*3,sizeof(int));//保存三组输出数据:模型、CAR、CARMA
zzz=(double*)calloc(m_nwnLEN*3,sizeof(double));//保存三组输出数据:模型、CAR、CARMA
z=(double*)calloc(m_nwnLEN,sizeof(double));
u=(double*)calloc(m_nwnLEN+m_nmLOC,sizeof(double));
e=(double*)calloc(m_nwnLEN,sizeof(double));
//读入输入u[]和白噪声e[]
FILE *fp1,*fp2;
if((fp1=fopen("MSerials.txt","r"))==NULL)return;
if((fp2=fopen("WhiteNoise2.txt","r"))==NULL)return;
for(int i=0;i<m_nwnLEN+m_nmLOC;i++)
{
fscanf(fp1,"%lf ",&u[i]);
}
for(i=0;i<m_nwnLEN;i++)
{
u[i]=u[i+m_nmLOC];//根据初始位置重新调整
}
for(i=0;i<m_nwnLEN;i++)
{
fscanf(fp2,"%lf ",&e[i]);//此时的e 为程序生成的高斯白噪声
}
fclose(fp1);
fclose(fp2);
//用下式计算理论输出z[]
if(model)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -