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

📄 mex_main.c

📁 一个UWB仿真程序包
💻 C
字号:
#include <gsl/gsl_rng.h>#include <gsl/gsl_randist.h>#include "mex.h"#include "ieee802154a.h"voidclean_up(gsl_rng * r, ieee802154a_channel_cluster* channel_cluster,	 ieee802154a_channel_cont* channel_cont,	 ieee802154a_channel_discr* channel_discr);voidcopy_channel(ieee802154a_channel_cont* channel_cont,	     ieee802154a_channel_discr* channel_discr,	     double* out1,double* out2);void mexFunction(int nlhs, mxArray *plhs[], int nrhs,                 const mxArray *prhs[]){  ieee802154a_parameters param;  ieee802154a_channel_cluster channel_cluster;  ieee802154a_channel_cont channel_cont;  ieee802154a_channel_discr channel_discr;  int channel_model, seed;  const gsl_rng_type * T;  gsl_rng * r;    /* Check for proper number of arguments */  if (nrhs < 4 || nrhs > 4)	  mexErrMsgTxt("Usage:\nmex_channel(channel model,sampling frequ.,threshold,RNG seed)");  if (nlhs > 2)	  mexErrMsgTxt("Too many output arguments");    /* The inputs must be a noncomplex scalar double */  if (!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) ||      !(mxGetM(prhs[0]) == 1 && mxGetN(prhs[0]) == 1))	  mexErrMsgTxt("Input 1 must be a noncomplex scalar double");  if (!mxIsDouble(prhs[1]) || mxIsComplex(prhs[1]) ||      !(mxGetM(prhs[1]) == 1 && mxGetN(prhs[1]) == 1))	  mexErrMsgTxt("Input 2 must be a noncomplex scalar double");  if (!mxIsDouble(prhs[2]) || mxIsComplex(prhs[2]) ||      !(mxGetM(prhs[2]) == 1 && mxGetN(prhs[2]) == 1))	  mexErrMsgTxt("Input 3 must be a noncomplex scalar double");  if (!mxIsDouble(prhs[3]) || mxIsComplex(prhs[3]) ||      !(mxGetM(prhs[3]) == 1 && mxGetN(prhs[3]) == 1))	  mexErrMsgTxt("Input 4 must be a noncomplex scalar double");  /* Assign (default) values to input */  channel_model = (int)mxGetScalar(prhs[0]);  channel_discr.fs = mxGetScalar(prhs[1]);; /* Set sampling frequency in GHz */  channel_cluster.thld_db = mxGetScalar(prhs[2]);;  seed = (int)mxGetScalar(prhs[3]);  /* create a generator chosen by the      environment variable GSL_RNG_TYPE */  gsl_rng_env_setup();       T = gsl_rng_default;  r = gsl_rng_alloc(T);  gsl_rng_default_seed = seed;  gsl_rng_set (r, gsl_rng_default_seed);#ifdef MATLABDEBUG  mexPrintf("UWB channel generator\n");  mexPrintf("channel model %d, fs = %.2f GHz, threshold = %.2f dB\n",	  channel_model,channel_discr.fs,channel_cluster.thld_db);  mexPrintf("GSL random number generator seed = %lu\n",	  gsl_rng_default_seed);#endif  param = load_ieee802154a_parameters(channel_model);  get_L(&channel_cluster,param.barL,r);  get_T_l(&channel_cluster, &param, r);  get_tau_kl(&channel_cluster, &channel_cont, &param, r);    convert_discrete(&channel_cont, &channel_discr, channel_discr.fs);  /* Create matrices for the return argument */  plhs[0] = mxCreateDoubleMatrix(channel_cont.length,3,mxREAL);  plhs[1] = mxCreateDoubleMatrix(channel_discr.length,4,mxREAL);  copy_channel(&channel_cont,&channel_discr,mxGetPr(plhs[0]),mxGetPr(plhs[1]));  /* Clean up everything */  clean_up(r, &channel_cluster, &channel_cont, &channel_discr);}voidcopy_channel(ieee802154a_channel_cont* channel_cont,	     ieee802154a_channel_discr* channel_discr,	     double* out1,double* out2){  int i,offset;  offset = channel_cont->length;  for (i=0; i<channel_cont->length; i++) {    out1[i] = channel_cont->tau[i];    out1[i+offset] = channel_cont->alpha[i];    out1[i+2*offset] = channel_cont->phi[i];  }  offset = channel_discr->length;  for (i=0; i<channel_discr->length; i++) {    out2[i] = channel_discr->tau[i];    out2[i+offset] = channel_discr->alpha[i];    out2[i+2*offset] = channel_discr->phi[i];    out2[i+3*offset] = channel_discr->real_h[i];  }}voidclean_up(gsl_rng * r, ieee802154a_channel_cluster* channel_cluster,	 ieee802154a_channel_cont* channel_cont,	 ieee802154a_channel_discr* channel_discr){  gsl_rng_free(r);  free_channel_cluster(channel_cluster);  free_channel_cont(channel_cont);  free_channel_discr(channel_discr);}

⌨️ 快捷键说明

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