matlab&c++混合编程

混合编程环境是matlabR2018b,VS2017,matalb的版本应该比c的版本要高,否则matalb无法识别c编译器,并且VS2010不支持某些函数(isinf)
最近一直在做HARQ系统的搭建和LDPC有关编码译码部分的实现,对于i5cpu的笔记本电脑,matlab在1500码长时,一次译码的时间大概在0.1-0.2s,随着码长的增长而类似指数上升,对于数据集的渐进生成和大容量的数据传输很不友好。应导师的要求,决定将matlab中ldpc的译码部分使用c语言来编写,并使用混合编程在mex中进行调用,此博客是对之前工作的一些总结,防止以后忘记
首先是关于基础部分,对于市面上的任何一本c语言参考书,需要看主要是函数,数组,指针三大块内容,对于没有接触过c语言的同学,大概1天能达到看明白该程序的水平,对于以前接触过c语言的同学,半天到两个小时就够了
然后搜索一些关于malloc函数的规范和申请内存空间的部分,这里就不再赘述,值得注意的是,在定义数组的时候,不能像matlab一样对使用变量进行定义如
void fun(int a)
{
int m[a];
}
这样的程序不被允许,只能在函数的开头
double M;
M=(double
)malloc(sizeof(double)n);
方式来申请内存空间,其中,前方要进行强制的类型转化(网上有的人说void
可以强制转化成任意的类型),sizeof(double)是为了得到一个double数据的字节数,n是数组中的元素的个数,M是该数组的首地址,因为c存储数据的特殊性,所以然后在之后的使用中可以写M[i]来表示其中的第i+1个元素
现在进入程序部分(对于二维数组(要时刻提醒自己a[2][3],a+1是第二行的首地址,c语言指针中不存在matalb的行列的概念),改动地方有以下几处:
1.在decode函数中将ycap[n]的声明方式改为了上述的声明方式,否则在matlab的mex编译时,会出现“不能以变量声明数组”
2.将decode函数中最后一个循环的范围由k改为了n,这是因为源程序的编码部分是直接将校验位放在信息位后的,而在自己的编码程序中,其中的元素经过了换位,要在之后使用ex_msg和reorder才能把信息位给复原出来
3.在生成plhs[0] = mxCreateDoubleMatrix的部分,同样将k改为了n,目的是使得程序输出n个比特的判决结果,而不是k个比特的信息位
首先谈论一下源程序,调制方式是bpsk,2r-1(1->1,0->-1),输入参数的LLR信息是2r/sigma,即ln(P(1)/P(0)),在函数内会有一个负号的转换,这里值得注意
[u_out, checkOK] = mexfastdecoder(k,n,nCW,sigmaw2,A,B,H,2r/sigmaw2,iterations);
其中k是信息位长度,n是总码长,A,B分别表示列行的1的数目和位置,H是校验矩阵,2
r/sigmaw2是似然度信息,iterations是最大迭代次数
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *A, *B, *H, *r, *u_out, checkOK;
double sigmaw2;
int k, n, nCW, i, iter;
const mxArray
temp_cell;

k = (int)mxGetScalar(prhs[0]);
n = (int)mxGetScalar(prhs[1]);
nCW = (int)mxGetScalar(prhs[2]);
sigmaw2 = (double)mxGetScalar(prhs[3]);
A = mxGetPr(prhs[4]);
B = mxGetPr(prhs[5]);
H = mxGetPr(prhs[6]);
r = mxGetPr(prhs[7]);
iter = (int)mxGetScalar(prhs[8]);

plhs[0] = mxCreateDoubleMatrix(1, nCW*n, mxREAL);
u_out = mxGetPr(plhs[0]);
plhs[1] = mxCreateDoubleScalar(0);
checkOK = mxGetPr(plhs[1]);

*checkOK = decoder(k, n, nCW, sigmaw2, A, B, H, r, iter, u_out);

}
prhs[]代指输入函数的指针
plhs[]代指输出函数的指针,并且可以用left,right来记忆
首先来讨论几个函数
mxGetScalar(prhs[0]):把通过prhs[0]传递进来的mxArray类型的指针指向的数据(标量)赋给C程序里的变量;
A = mxGetPr(prhs[4]): 是一个指针,指向输入矩阵的第一个元素
plhs[0] = mxCreateDoubleMatrix(1, nCW*n, mxREAL); 申请一段double矩阵的内存,并使用plhs[0]来存放
u_out = mxGetPr(plhs[0]); u_out是一个指针,指向plhs[0]内存空间的首位置,要注意这些文件中大部分使用的都是指针,以此来保证在子函数中对值的改变会改变传入参数的值
具体的请见cpp文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值