MATLAB是一个很好用的工具。利用MATLAB脚本进行科学计算也特别方便快捷。但是代码存在较多循环时,MATLAB运行速度极慢。如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行,可以考虑将循环较多的功能采用C编写,MATLAB调用。本文将概述这一过程。虽然本文以LDPC译码算法为例,但不懂该算法不影响本文阅读。
1. 起因
最开始用MATLAB写的LDPC译码算法中,其中一个版本是这里,里面有三重循环,运行速度极慢。后来考虑了MATLAB的向量化操作,通过算法的合理划分以及内置函数调用,成功将三重循环修改为1层,具体这一版本的代码可见这里。通过这一手段,函数的运行速度提高了几倍乃至几十倍。虽然这一方法下运行速度依旧比不过MATLAB工具箱中的comm.LDPCDecoder,远比不上利用GPU的comm.gpu.LDPCDecoder,但胜在可明确算法并具有一定扩展性。
起初也注意到可以通过MATLAB调用C程序来加速程序运行,但向量化后的代码凑活能用,加上有时也可调用更为强大的内置函数,这一想法一直没有付诸实践。这几天想好好整理一下代码,遂萌发了写一个C版本译码算法的想法。代码现在的状态是“能用”,这里把相关经验总结分析在此。
2. MATLAB调用C程序
这一部分的内容在刘晓辉的matlab调用C程序中已经有较为详细的介绍了,想要正确调用C程序,关键概括为2点。
机器上装有MATLAB编译器,可通过在MATLAB命令行窗口输入mex -setup进行具体设置。
有一个正确的接口子程序mexFunction完成MATLAB和C程序之间的数据转换和程序调用
这里给出我写得mexFunction(注意这个代码写得不好,没有任何判断,没有健壮性……)
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *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,colnum, 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] = mxCreateDoubleMatrix(1, state[1], mxREAL) 则定义了一大小为1 × state[1]的矩阵,做为函数的返回值。最后调用的ldpcDec是一个C程序,运行C程序后plhs[0]指向的内存空间存储的就是满足要求的计算结果。ldpcDec代码如下
#include
#include
void ldpcDec(double*r,double* llr, int* rownum, int* colnum, int* trans, double* state){
//列有序,trans为映射关系
//rownum[i]-rownum[i-1],第i+1行的行重
//colnum[i]-colnum[i-1],第i+1列的列重
//state[0]:maxiter state[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
int ii = 0;
for (int i = 0; i
-
matlab
+关注
关注
186文章
2983浏览量
231237 -
C程序
+关注
关注
4文章
255浏览量
36173
发布评论请先 登录
相关推荐
怎样设计基于CMMB系统的LDPC译码器?
大围数QC_LDPC码的译码器该怎么设计?
LDPC码与RS码的联合迭代译码
IEEE 802.16e中LDPC译码器的实现
基于LDPC译码软信息的迭代载波恢复
LDPC编译码
![<b class='flag-5'>LDPC</b>编<b class='flag-5'>译码</b>](https://file1.elecfans.com//web2/M00/A4/9B/wKgZomUMNPOAJ6EBAAE1HL6Lcrs412.jpg)
基于最小和高效LDPC译码算法
![基于最小和高效<b class='flag-5'>LDPC</b><b class='flag-5'>译码</b>算法](https://file.elecfans.com/web2/M00/48/F0/pYYBAGKhtC6ACgCFAAAMZCryUVY815.jpg)
高速通用LDPC码译码技术
LDPC码的译码停止准则
![<b class='flag-5'>LDPC</b>码的<b class='flag-5'>译码</b>停止准则](https://file.elecfans.com/web2/M00/49/B0/pYYBAGKhvE-AA834AAAz1u24guE486.png)
基于FPGA 的LDPC 码编译码器联合设计
![基于FPGA 的<b class='flag-5'>LDPC</b> 码编<b class='flag-5'>译码</b>器联合设计](https://file1.elecfans.com//web2/M00/A6/EE/wKgZomUMQVaAGcQKAAAK29Uov1I300.jpg)
评论