📄 mex_main.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, ¶m, r); get_tau_kl(&channel_cluster, &channel_cont, ¶m, 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 + -