MATLAB调用C程序、调试和LDPC译码过程详解.doc

MATLAB调用C程序、调试和LDPC译码过程详解.doc

ID:27509613

大小:41.00 KB

页数:5页

时间:2018-12-04

MATLAB调用C程序、调试和LDPC译码过程详解.doc_第1页
MATLAB调用C程序、调试和LDPC译码过程详解.doc_第2页
MATLAB调用C程序、调试和LDPC译码过程详解.doc_第3页
MATLAB调用C程序、调试和LDPC译码过程详解.doc_第4页
MATLAB调用C程序、调试和LDPC译码过程详解.doc_第5页
资源描述:

《MATLAB调用C程序、调试和LDPC译码过程详解.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、MATLAB调用C程序、调试和LDPC译码过程详解  MATLAB是一个很好用的工具。利用MATLAB脚本进行科学计算也特别方便快捷。但是代码存在较多循环时,MATLAB运行速度极慢。如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行,可以考虑将循环较多的功能采用C编写,MATLAB调用。本文将概述这一过程。虽然本文以LDPC译码算法为例,但不懂该算法不影响本文阅读。  1.起因  最开始用MATLAB写的LDPC译码算法中,其中一个版本是这里,里面有三重循环,运行速度极慢。后来考虑了MATLAB的向量化操作,通过算法的合理划分以及

2、内置函数调用,成功将三重循环修改为1层,具体这一版本的代码可见这里。通过这一手段,函数的运行速度提高了几倍乃至几十倍。虽然这一方法下运行速度依旧比不过MATLAB工具箱中的comm.LDPCDecoder,远比不上利用GPU的comm.gpu.LDPCDecoder,但胜在可明确算法并具有一定扩展性。  起初也注意到可以通过MATLAB调用C程序来加速程序运行,但向量化后的代码凑活能用,加上有时也可调用更为强大的内置函数,这一想法一直没有付诸实践。这几天想好好整理一下代码,遂萌发了写一个C版本译码算法的想法。代码现在的状态是“能用”,这里把相关经验总结

3、分析在此。    2.MATLAB调用C程序  这一部分的内容在刘晓辉的matlab调用C程序中已经有较为详细的介绍了,想要正确调用C程序,关键概括为2点。  机器上装有MATLAB编译器,可通过在MATLAB命令行窗口输入mex-setup进行具体设置。  有一个正确的接口子程序mexFunction完成MATLAB和C程序之间的数据转换和程序调用  这里给出我写得mexFunction(注意这个代码写得不好,没有任何判断,没有健壮性……)  voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmx

4、Array*prhs[]){  double*llr=(double*)mxGetPr(prhs[0]);  int*rownum=mxGetPr(prhs[1]);  int*colnum=mxGetPr(prhs[2]);  int*trans=mxGetPr(prhs[3]);  double*state=mxGetPr(prhs[4]);  plhs[0]=mxCreateDoubleMatrix(1,state[1],mxREAL);  double*r=mxGetPr(plhs[0]);  ldpcDec(r,llr,rownum,coln

5、um,trans,state);  }  mexFunction的规范在刘晓辉的matlab调用C程序一文中已有提及,即  nlhs:输出参数数目  plhs:指向输出参数的指针  nrhs:输入参数数目  prhs:指向输入参数的指针  例如,在matlab命令行中使用  [a,b]=test(c,d,e)  调用mex函数test时,传给test的这四个参数分别是  2,plhs,3,prhs  其中:  prhs[0]=c  prhs[1]=d  prhs[2]=e  由此可以解释上述mexFunction,而命令plhs[0]=mxCreate

6、DoubleMatrix(1,state[1],mxREAL)则定义了一大小为1×state[1]的矩阵,做为函数的返回值。最后调用的ldpcDec是一个C程序,运行C程序后plhs[0]指向的内存空间存储的就是满足要求的计算结果。ldpcDec代码如下  #include  #include  voidldpcDec(double*r,double*llr,int*rownum,int*colnum,int*trans,double*state){  //列有序,trans为映射关系  //rownum[i]-rownum[i-1],第i+1行的行重

7、  //colnum[i]-colnum[i-1],第i+1列的列重  //state[0]:maxiterstate[1]:llr&colnum长度state[2]rownum长度,  //state[3]:H中非零元素个数state[4]:alpha  double*temp;  double*decodedtemp;  temp=(double*)malloc(sizeof(double)*state[3]);  decodedtemp=(double*)malloc(sizeof(double)*state[3]);  //init  inti

8、i=0;  for(inti=0;i

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。