0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Hx 作者:工程师陈翠 2018-07-12 01:49 次阅读

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
    +关注

    关注

    175

    文章

    2908

    浏览量

    228324
  • C程序
    +关注

    关注

    4

    文章

    253

    浏览量

    35732
收藏 人收藏

    评论

    相关推荐

    一种通用的低成本QC-LDPC译码结构

    【作者】:申睿;邓运松;向波;陈赟;曾晓洋;【来源】:《小型微型计算机系统》2010年03期【摘要】:提出一种通用的QC-LDPC译码器架构.该架构采用一种特殊的绑定结构和一个可配置的循环移位网
    发表于 04-24 09:26

    matlab来仿真turbo编译码程序

    matlab来仿真turbo编译码程序,有没有完整的程序及仿真过程
    发表于 04-23 10:22

    怎样设计基于CMMB系统的LDPC译码器?

    低密度奇偶校验(LowDensityParityCheck,LDPC)码是由Gallager博士在1962年首次提出来的,由于LDPC码的误码性能能够逼近香农限,因而在无线通信、卫星通信等领域都得
    发表于 08-23 07:22

    大围数QC_LDPC码的译码器该怎么设计?

    LDPC码是近年来发展较快且日趋成熟的一种信道编码方案,因其具有的优越性能和实用价值而被人们认知,但由于随机结构的LDPC码编译码器硬件实现较为复杂,具有的准循环特性QC_LDPC码已
    发表于 09-30 07:19

    LDPC码与RS码的联合迭代译码

    针对LDPC码与RS码的串行级联结构,提出了一种基于Chase的联合迭代译码方法。软入软出的RS译码器与LDPC译码器之间经过多次信息传递,
    发表于 05-12 21:47 22次下载

    IEEE 802.16e中LDPC译码器的实现

    面向IEEE 802.16e 中 LDPC 码,分析了各种译码算法的译码性能,归一化最小(NMS)算法具备较高译码性能和实现复杂度低的特点。提出一种基于部分并行方式的
    发表于 08-05 08:46 24次下载

    基于LDPC译码软信息的迭代载波恢复

    基于LDPC译码软信息的迭代载波恢复:针对较低信噪比(≤2 dB)下载波恢复难题,该文提出了基于LDPC 软信息的迭代载波恢复算法。该算法以最大化LDPC 软信息绝对值的和为准则,对载
    发表于 10-29 13:03 18次下载

    高码率LDPC译码器的优化设计与实现

    本文以CCSDS 推荐的7/8 码率LDPC 码为例,提出了一种适于高码率LDPC译码器的硬件结构优化方法。高码率的LDPC 码通常也伴随着行重与列重的比例较高的问题。本方法是在拆
    发表于 11-25 15:21 26次下载

    LDPC译码

    LDPC译码LDPC码是一种线性分组奇偶校验码,它采用基于因子图的置信传播(Belief Propagation,BP)迭代译码算法进行译码
    发表于 03-01 17:36 1804次阅读
    <b class='flag-5'>LDPC</b>编<b class='flag-5'>译码</b>

    基于最小和高效LDPC译码算法

    针对低密度奇偶校验(LDPC)译码算法性能低的问题,提出一种基于最小和的高效译码算法。该算法从概率的角度分析消息的传递过程中校验节点的更新过程
    发表于 05-18 18:54 0次下载
    基于最小和高效<b class='flag-5'>LDPC</b><b class='flag-5'>译码</b>算法

    高速通用LDPC译码技术

    香农的学生Gallager首次提出了LDPC码的概念和完整的译码方法,目前LDPC码正向着高速高增益的方向发展。文中针对目前对高速LDPC译码
    发表于 07-26 11:17 0次下载

    LDPC码的译码停止准则

    提出了一种实用的LDPC译码停止准则,利用信息节点的对数概率似然比来控制迭代次数,避开了设置停止准则门限,可以很快判断出译码情况,较其他方法省去了大量繁杂的计算。
    发表于 09-07 19:38 10次下载
    <b class='flag-5'>LDPC</b>码的<b class='flag-5'>译码</b>停止准则

    基于FPGA 的LDPC 码编译码器联合设计

    该文通过对低密度校验(LDPC)码的编译码过程进行分析,提出了一种基于FPGA 的LDPC 码编译码器联合设计方法,该方法使编码器和
    发表于 11-22 07:34 3949次阅读
    基于FPGA 的<b class='flag-5'>LDPC</b> 码编<b class='flag-5'>译码</b>器联合设计

    MATLAB程序调试的方法及工具介绍

    MATLAB程序设计之MATLAB程序调试的方法及工具介绍。
    的头像 发表于 07-13 17:50 6125次阅读
    <b class='flag-5'>MATLAB</b><b class='flag-5'>程序</b><b class='flag-5'>调试</b>的方法及工具介绍

    基于FPGA的800Mbps准循环LDPC译码

    基于FPGA的800Mbps准循环LDPC译码
    发表于 06-08 10:31 26次下载