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

📄 basepage.cpp

📁 C++与MATLAB的数字基带传输系统仿真源代码的实现.
💻 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 + -