📄 basepage.cpp
字号:
// BasePage.cpp : implementation file
#include "stdafx.h"
#include "resource.h"
#include "BasePage.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CMyPropertyPage5, CPropertyPage)
IMPLEMENT_DYNCREATE(BasePage, CPropertyPage)
IMPLEMENT_DYNCREATE(CRosinePage, CPropertyPage)
IMPLEMENT_DYNCREATE(CMetekaloPage, CPropertyPage)
IMPLEMENT_DYNCREATE(CBufenPage, CPropertyPage)
Engine *ep;
////////////////////////////////////////////////////////////////////////////
// 基带传输系统
BasePage::BasePage() : CPropertyPage(BasePage::IDD)
{
//{{AFX_DATA_INIT(BasePage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
if (!(ep=engOpen(NULL))) //开引擎
{
MessageBox((LPSTR)"Can't start MATLAB engine",(LPCTSTR) NULL,MB_OK);
exit(1);
}
}
BasePage::~BasePage()
{
engClose(ep); //关引擎
}
void BasePage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(BasePage)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(BasePage, CPropertyPage)
//{{AFX_MSG_MAP(BasePage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
////////////////////////////////////////////////////////////////////////////
// 升余弦滤波器
CRosinePage::CRosinePage() : CPropertyPage(CRosinePage::IDD)
{
//{{AFX_DATA_INIT(CRosinePage)
m_dataL =20;
m_delta =0.0;
m_Fd =1;
m_inputnum =4;
m_noise =0;
m_R =1;
m_rate =1;
m_sgma =1;
m_snr =30;
//}}AFX_DATA_INIT
}
CRosinePage::~CRosinePage()
{
}
void CRosinePage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRosinePage)
DDX_Text(pDX, IDC_EDIT_DATAL, m_dataL);
DDX_Text(pDX, IDC_EDIT_DELTA, m_delta);
DDX_Text(pDX, IDC_EDIT_Fd, m_Fd);
DDX_Text(pDX, IDC_EDIT_INPUTNUM, m_inputnum);
DDV_MinMaxInt(pDX, m_inputnum, 3, 10);
DDX_Text(pDX, IDC_EDIT_NOISE, m_noise);
DDV_MinMaxInt(pDX, m_noise, 0, 1);
DDX_Text(pDX, IDC_EDIT_R, m_R);
DDV_MinMaxDouble(pDX, m_R, 0., 1.);
DDX_Text(pDX, IDC_EDIT_RATE, m_rate);
DDX_Text(pDX, IDC_EDIT_SGMA, m_sgma);
DDX_Text(pDX, IDC_EDIT_SNR, m_snr);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRosinePage, CPropertyPage)
//{{AFX_MSG_MAP(CRosinePage)
ON_BN_CLICKED(IDC_BUTTON_IOCOMPARE, OnButtonIocompare)
ON_BN_CLICKED(IDC_BUTTON_OUTFREQ, OnButtonOutfreq)
ON_BN_CLICKED(IDC_BUTTON_RCOSIN, OnButtonRcosin)
ON_BN_CLICKED(IDC_BUTTON_RCOSINFREQ, OnButtonRcosinfreq)
ON_BN_CLICKED(IDC_BUTTON_EYE, OnButtonEye)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CRosinePage::OnButtonIocompare() //输入输出信号的比较
{
UpdateData(TRUE);
int jixing;
mxArray *T=NULL; //定义一个mxArray类型的结构体
//定义一个指向组合框的指针(以确定码型的极性)
CComboBox * pComboBox=(CComboBox *)GetDlgItem(IDC_COMBO_CHOOSE);
int nIndex=pComboBox->GetCurSel();
char tbuf[80];
int ret=pComboBox->GetLBText(nIndex,tbuf);
ASSERT(ret!=CB_ERR);
switch(tbuf[0])
{
case 's': //'s'表示单极性
{
jixing=0;
break;
}
case 'd': //'d'表示双极性
{
jixing=1;
break;
}
case 'm': //'m'表示多电平
{
jixing=2;
break;
}
default:
break;
}
//将从编辑框的的数据组成一个数组,用以传递给matlab
double D[10]={m_Fd,m_R,m_rate,m_dataL,m_delta,m_sgma,m_snr,m_noise,jixing,m_inputnum};
T=mxCreateDoubleMatrix(1,10,mxREAL); //matlab中所需矩阵的构造
mxSetName(T,"T");
//利用C语言的内存拷贝命令对所构造的结构体进行赋值
memcpy((char *) mxGetPr (T),(char *) D,10*sizeof(double));
engPutArray (ep,T);
engEvalString(ep,"wavecompare_Rcos(T)");
mxDestroyArray(T); //对前面所定义的结构体变量进行析构,释放内存
}
void CRosinePage::OnButtonOutfreq() //输出信号的频谱
{
UpdateData(TRUE);
int jixing;
mxArray *T=NULL; //定义一个mxArray类型的结构体
//定义一个指向组合框的指针(以确定码型的极性)
CComboBox * pComboBox=(CComboBox *)GetDlgItem(IDC_COMBO_CHOOSE);
int nIndex=pComboBox->GetCurSel();
char tbuf[80];
int ret=pComboBox->GetLBText(nIndex,tbuf);
ASSERT(ret!=CB_ERR);
switch(tbuf[0])
{
case 's': //'s'表示单极性
{
jixing=0;
break;
}
case 'd': //'d'表示双极性
{
jixing=1;
break;
}
case 'm': //'m'表示多电平
{
jixing=2;
break;
}
default:
break;
}
double D[10]={m_Fd,m_R,m_rate,m_dataL,m_delta,m_sgma,
m_snr,m_noise,jixing,m_inputnum};
T=mxCreateDoubleMatrix(1,10,mxREAL); //matlab中所需矩阵的构造
mxSetName(T,"T");
memcpy((char *) mxGetPr (T),(char *) D,10*sizeof(double));
engPutArray (ep,T);
engEvalString(ep,"freqOut_Rcos(T)");
mxDestroyArray(T);
}
void CRosinePage::OnButtonRcosin() //升余弦滤波器的波形
{
UpdateData(TRUE);
int jixing;
mxArray *T=NULL; //定义一个mxArray类型的结构体
//定义一个指向组合框的指针(以确定码型的极性)
CComboBox * pComboBox=(CComboBox *)GetDlgItem(IDC_COMBO_CHOOSE); int nIndex=pComboBox->GetCurSel();
char tbuf[80];
int ret=pComboBox->GetLBText(nIndex,tbuf);
ASSERT(ret!=CB_ERR);
switch(tbuf[0])
{
case 's': //'s'表示单极性
{
jixing=0;
break;
}
case 'd': //'d'表示双极性
{
jixing=1;
break;
}
case 'm': //'m'表示多电平
{
jixing=2;
break;
}
default:
break;
}
//将从编辑框的的数据组成一个数组,用以传递给matlab
double D[10]={m_Fd,m_R,m_rate,m_dataL,m_delta,m_sgma,
m_snr,m_noise,jixing,m_inputnum};
T=mxCreateDoubleMatrix(1,10,mxREAL); //matlab中所需矩阵的构造
mxSetName(T,"T");
memcpy((char *) mxGetPr (T),(char *) D,10*sizeof(double));
engPutArray (ep,T);
engEvalString(ep,"wave_Rcos(T)");
mxDestroyArray(T);
}
void CRosinePage::OnButtonRcosinfreq() //升余弦滤波器的频谱
{
UpdateData(TRUE);
int jixing;
mxArray *T=NULL; //定义一个mxArray类型的结构体
//定义一个指向组合框的指针(以确定码型的极性)
CComboBox * pComboBox=(CComboBox *)GetDlgItem(IDC_COMBO_CHOOSE);
int nIndex=pComboBox->GetCurSel();
char tbuf[80];
int ret=pComboBox->GetLBText(nIndex,tbuf);
ASSERT(ret!=CB_ERR);
switch(tbuf[0])
{
case 's': //'s'表示单极性
{
jixing=0;
break;
}
case 'd': //'d'表示双极性
{
jixing=1;
break;
}
case 'm': //'m'表示多电平
{
jixing=2;
break;
}
default:
break;
}
//将从编辑框的的数据组成一个数组,用以传递给matlab
double D[10]={m_Fd,m_R,m_rate,m_dataL,m_delta,m_sgma,
m_snr,m_noise,jixing,m_inputnum};
T=mxCreateDoubleMatrix(1,10,mxREAL); //matlab中所需矩阵的构造
mxSetName(T,"T");
memcpy((char *) mxGetPr (T),(char *) D,10*sizeof(double));
engPutArray (ep,T);
engEvalString(ep,"freq_Rcos(T)");
mxDestroyArray(T);
}
void CRosinePage::OnButtonEye() // 眼图显示
{
UpdateData(TRUE);
int jixing;
mxArray *T=NULL; //定义一个mxArray类型的结构体
//定义一个指向组合框的指针(以确定码型的极性)
CComboBox * pComboBox=(CComboBox *)GetDlgItem(IDC_COMBO_CHOOSE);
int nIndex=pComboBox->GetCurSel();
char tbuf[80];
int ret=pComboBox->GetLBText(nIndex,tbuf);
ASSERT(ret!=CB_ERR);
switch(tbuf[0])
{
case 's': //'s'表示单极性
{
jixing=0;
break;
}
case 'd': //'d'表示双极性
{
jixing=1;
break;
}
case 'm': //'m'表示多电平
{jixing=2;
break;
}
default:
break;
}
//将从编辑框的的数据组成一个数组,用以传递给matlab
double D[10]={m_Fd,m_R,m_rate,m_dataL,m_delta,m_sgma,
m_snr,m_noise,jixing,m_inputnum};
T=mxCreateDoubleMatrix(1,10,mxREAL); //matlab中所需矩阵的构造
mxSetName(T,"T");
memcpy((char *) mxGetPr (T),(char *) D,10*sizeof(double));
engPutArray (ep,T);
engEvalString(ep,"eye_Rcos(T)");
mxDestroyArray(T);
}
////////////////////////////////////////////////////////////////////////////// 蒙特卡罗仿真
CMetekaloPage::CMetekaloPage() : CPropertyPage(CMetekaloPage::IDD)
{
//{{AFX_DATA_INIT(CMetekaloPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CMetekaloPage::~CMetekaloPage()
{
}
void CMetekaloPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMetekaloPage)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMetekaloPage, CPropertyPage)
//{{AFX_MSG_MAP(CMetekaloPage)
ON_BN_CLICKED(IDC_BUTTON_FANGZHEN, OnButtonFangzhen)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMetekaloPage::OnButtonFangzhen()
{
CComboBox * pComboBox=(CComboBox *)GetDlgItem(IDC_COMBO_DS);
int nIndex=pComboBox->GetCurSel();
char tbuf[80];
int ret=pComboBox->GetLBText(nIndex,tbuf);
ASSERT(ret!=CB_ERR);
switch(tbuf[0])
{
case 'S': //'S'表示单极性
{
engEvalString(ep,"main_s;");
break;
}
case 'D': //'D'表示单极性
{
engEvalString(ep,"main_d;");
break;
}
default:
break;
}
}
////////////////////////////////////////////////////////////////////////////
// 部分响应
CBufenPage::CBufenPage() : CPropertyPage(CBufenPage::IDD)
{
//{{AFX_DATA_INIT(CBufenPage)
m_type = 0;
//}}AFX_DATA_INIT
}
CBufenPage::~CBufenPage()
{
}
void CBufenPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBufenPage)
DDX_Text(pDX, IDC_EDIT2, m_type);
DDV_MinMaxInt(pDX, m_type, 0, 5);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBufenPage, CPropertyPage)
//{{AFX_MSG_MAP(CBufenPage)
ON_BN_CLICKED(IDC_BUTTON_BUFENWAVE, OnButtonBufenwave)
ON_BN_CLICKED(IDC_BUTTON_BUFENFREQ, OnButtonBufenfreq)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CBufenPage::OnButtonBufenwave()
{
UpdateData(TRUE);
mxArray *T=NULL;
//将从编辑框的的数据组成一个数组,用以传递给matlab
double D[1]={m_type}; T=mxCreateDoubleMatrix(1,1,mxREAL); //matlab中所需矩阵的构造
mxSetName(T,"T");
memcpy((char *) mxGetPr (T),(char *) D,1*sizeof(double));
engPutArray (ep,T);
engEvalString(ep,"partial(T);");
mxDestroyArray(T);
}
void CBufenPage::OnButtonBufenfreq()
{
UpdateData(TRUE);
mxArray *T=NULL;
double D[1]={m_type}; T=mxCreateDoubleMatrix(1,1,mxREAL); //matlab中所需矩阵的构造
mxSetName(T,"T");
memcpy((char *) mxGetPr (T),(char *) D,1*sizeof(double));
engPutArray (ep,T);
engEvalString(ep,"partial_freq(T);");
mxDestroyArray(T);
}
////////////////////////////////////////////////////////////////////////////
// 码型选择
CMyPropertyPage5::CMyPropertyPage5() : CPropertyPage(CMyPropertyPage5::IDD)
{
//{{AFX_DATA_INIT(CMyPropertyPage5)
m_occupation = 0.5;
m_period = 0.5;
m_probability = 0.5;
//}}AFX_DATA_INIT
}
CMyPropertyPage5::~CMyPropertyPage5()
{
}
void CMyPropertyPage5::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyPropertyPage5)
DDX_Text(pDX, IDC_EDIT_OCCUPATION, m_occupation);
DDV_MinMaxDouble(pDX, m_occupation, 0., 1.);
DDX_Text(pDX, IDC_EDIT_PEROID, m_period);
DDX_Text(pDX, IDC_EDIT_PROBABILITY, m_probability);
DDV_MinMaxDouble(pDX, m_probability, 0., 1.);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyPropertyPage5, CPropertyPage)
//{{AFX_MSG_MAP(CMyPropertyPage5)
ON_BN_CLICKED(IDC_BUTTON_CONTINUE, OnButtonContinue)
ON_BN_CLICKED(IDC_BUTTON_DISPERSE, OnButtonDisperse)
ON_BN_CLICKED(IDC_BUTTON_WAVE, OnButtonWave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMyPropertyPage5::OnButtonContinue() //连续功率谱的显示
{
UpdateData(TRUE);
mxArray *T=NULL; //定义一个mxArray类型的结构体
double D[3]={m_period,m_occupation,m_probability}; T=mxCreateDoubleMatrix(1,3,mxREAL); //matlab中所需矩阵的构造
mxSetName(T,"T");
memcpy((char *) mxGetPr (T),(char *) D,3*sizeof(double));
engPutArray (ep,T);
//定义一个指向组合框的指针(以确定码型的极性)
CComboBox * pComboBox=(CComboBox *)GetDlgItem(IDC_COMBO_JIXING);
int nIndex=pComboBox->GetCurSel();
char tbuf[80];
int ret=pComboBox->GetLBText(nIndex,tbuf);
ASSERT(ret!=CB_ERR);
switch(tbuf[0])
{
case 'S': //'S'表示单极性
{
engEvalString(ep,"continue_s(T);");
break;
}
case 'D': //'D'表示双极性
{
//调用用matlab编写的continue_d(T),以实现双极性时连续功率谱的绘制
engEvalString(ep,"continue_d(T)");
break;
}
default:
break;
}
mxDestroyArray(T); //对前面所定义的结构体变量进行析构,释放内存
}
void CMyPropertyPage5::OnButtonDisperse() //离散功率谱的显示
{
UpdateData(TRUE);
mxArray *T=NULL;
double D[3]={m_period,m_occupation,m_probability};
T=mxCreateDoubleMatrix(1,3,mxREAL);
mxSetName(T,"T");
memcpy((char *) mxGetPr (T),(char *) D,3*sizeof(double));
engPutArray (ep,T);
CComboBox * pComboBox=(CComboBox *)GetDlgItem(IDC_COMBO_JIXING);
int nIndex=pComboBox->GetCurSel();
char tbuf[80];
int ret=pComboBox->GetLBText(nIndex,tbuf);
ASSERT(ret!=CB_ERR);
switch(tbuf[0])
{
case 'S':
{
engEvalString(ep,"disperse_s(T);");
break;
}
case 'D':
{
engEvalString(ep,"disperse_d(T)");
break;
}
default:
break;
}
mxDestroyArray(T);
}
void CMyPropertyPage5::OnButtonWave() //时域波形的显示
{
UpdateData(TRUE);
mxArray *T=NULL;
double D[3]={m_period,m_occupation,m_probability};
T=mxCreateDoubleMatrix(1,3,mxREAL);
mxSetName(T,"T");
memcpy((char *) mxGetPr (T),(char *) D,3*sizeof(double));
engPutArray (ep,T);
CComboBox * pComboBox=(CComboBox *)GetDlgItem(IDC_COMBO_JIXING);
int nIndex=pComboBox->GetCurSel();
char tbuf[80];
int ret=pComboBox->GetLBText(nIndex,tbuf);
ASSERT(ret!=CB_ERR);
switch(tbuf[0])
{
case 'S':
{
engEvalString(ep,"wave_s(T);");
break;
}
case 'D':
{
engEvalString(ep,"wave_d(T)");
break;
}
default:
break;
}
mxDestroyArray(T);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -