0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MATLAB調(diào)用C程序、調(diào)試和LDPC譯碼過程詳解

Hx ? 作者:工程師陳翠 ? 2018-07-12 01:49 ? 次閱讀

MATLAB是一個(gè)很好用的工具。利用MATLAB腳本進(jìn)行科學(xué)計(jì)算也特別方便快捷。但是代碼存在較多循環(huán)時(shí),MATLAB運(yùn)行速度極慢。如果不想放棄MATLAB中大量方便使用的庫(kù),又希望代碼能迅速快捷的運(yùn)行,可以考慮將循環(huán)較多的功能采用C編寫,MATLAB調(diào)用。本文將概述這一過程。雖然本文以LDPC譯碼算法為例,但不懂該算法不影響本文閱讀。

1. 起因

最開始用MATLAB寫的LDPC譯碼算法中,其中一個(gè)版本是這里,里面有三重循環(huán),運(yùn)行速度極慢。后來考慮了MATLAB的向量化操作,通過算法的合理劃分以及內(nèi)置函數(shù)調(diào)用,成功將三重循環(huán)修改為1層,具體這一版本的代碼可見這里。通過這一手段,函數(shù)的運(yùn)行速度提高了幾倍乃至幾十倍。雖然這一方法下運(yùn)行速度依舊比不過MATLAB工具箱中的comm.LDPCDecoder,遠(yuǎn)比不上利用GPU的comm.gpu.LDPCDecoder,但勝在可明確算法并具有一定擴(kuò)展性。

起初也注意到可以通過MATLAB調(diào)用C程序來加速程序運(yùn)行,但向量化后的代碼湊活能用,加上有時(shí)也可調(diào)用更為強(qiáng)大的內(nèi)置函數(shù),這一想法一直沒有付諸實(shí)踐。這幾天想好好整理一下代碼,遂萌發(fā)了寫一個(gè)C版本譯碼算法的想法。代碼現(xiàn)在的狀態(tài)是“能用”,這里把相關(guān)經(jīng)驗(yàn)總結(jié)分析在此。

2. MATLAB調(diào)用C程序

這一部分的內(nèi)容在劉曉輝的matlab調(diào)用C程序中已經(jīng)有較為詳細(xì)的介紹了,想要正確調(diào)用C程序,關(guān)鍵概括為2點(diǎn)。

機(jī)器上裝有MATLAB編譯器,可通過在MATLAB命令行窗口輸入mex -setup進(jìn)行具體設(shè)置。

有一個(gè)正確的接口子程序mexFunction完成MATLAB和C程序之間的數(shù)據(jù)轉(zhuǎn)換和程序調(diào)用

這里給出我寫得mexFunction(注意這個(gè)代碼寫得不好,沒有任何判斷,沒有健壯性……)

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的規(guī)范在劉曉輝的matlab調(diào)用C程序一文中已有提及,即

nlhs:輸出參數(shù)數(shù)目

plhs:指向輸出參數(shù)的指針

nrhs:輸入?yún)?shù)數(shù)目

prhs:指向輸入?yún)?shù)的指針

例如,在matlab命令行中使用

[a,b]=test(c,d,e)

調(diào)用mex函數(shù)test時(shí),傳給test的這四個(gè)參數(shù)分別是

2,plhs,3,prhs

其中:

prhs[0]=c

prhs[1]=d

prhs[2]=e

由此可以解釋上述mexFunction,而命令plhs[0] = mxCreateDoubleMatrix(1, state[1], mxREAL) 則定義了一大小為1 × state[1]的矩陣,做為函數(shù)的返回值。最后調(diào)用的ldpcDec是一個(gè)C程序,運(yùn)行C程序后plhs[0]指向的內(nèi)存空間存儲(chǔ)的就是滿足要求的計(jì)算結(jié)果。ldpcDec代碼如下

#include

#include

void ldpcDec(double*r,double* llr, int* rownum, int* colnum, int* trans, double* state){

//列有序,trans為映射關(guān)系

//rownum[i]-rownum[i-1],第i+1行的行重

//colnum[i]-colnum[i-1],第i+1列的列重

//state[0]:maxiter state[1]:llr & colnum 長(zhǎng)度 state[2] rownum 長(zhǎng)度,

//state[3]:H中非零元素個(gè)數(shù) 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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • matlab
    +關(guān)注

    關(guān)注

    185

    文章

    2976

    瀏覽量

    230466
  • C程序
    +關(guān)注

    關(guān)注

    4

    文章

    254

    瀏覽量

    36032
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    matlab來仿真turbo編譯碼程序

    matlab來仿真turbo編譯碼程序,有沒有完整的程序及仿真過程
    發(fā)表于 04-23 10:22

    怎樣設(shè)計(jì)基于CMMB系統(tǒng)的LDPC譯碼器?

    低密度奇偶校驗(yàn)(LowDensityParityCheck,LDPC)碼是由Gallager博士在1962年首次提出來的,由于LDPC碼的誤碼性能能夠逼近香農(nóng)限,因而在無線通信、衛(wèi)星通信等領(lǐng)域都得
    發(fā)表于 08-23 07:22

    大圍數(shù)QC_LDPC碼的譯碼器該怎么設(shè)計(jì)?

    LDPC碼是近年來發(fā)展較快且日趨成熟的一種信道編碼方案,因其具有的優(yōu)越性能和實(shí)用價(jià)值而被人們認(rèn)知,但由于隨機(jī)結(jié)構(gòu)的LDPC碼編譯碼器硬件實(shí)現(xiàn)較為復(fù)雜,具有的準(zhǔn)循環(huán)特性QC_LDPC碼已
    發(fā)表于 09-30 07:19

    LDPC碼與RS碼的聯(lián)合迭代譯碼

    針對(duì)LDPC碼與RS碼的串行級(jí)聯(lián)結(jié)構(gòu),提出了一種基于Chase的聯(lián)合迭代譯碼方法。軟入軟出的RS譯碼器與LDPC譯碼器之間經(jīng)過多次信息傳遞,
    發(fā)表于 05-12 21:47 ?22次下載

    IEEE 802.16e中LDPC譯碼器的實(shí)現(xiàn)

    面向IEEE 802.16e 中 LDPC 碼,分析了各種譯碼算法的譯碼性能,歸一化最?。∟MS)算法具備較高譯碼性能和實(shí)現(xiàn)復(fù)雜度低的特點(diǎn)。提出一種基于部分并行方式的
    發(fā)表于 08-05 08:46 ?24次下載

    基于LDPC譯碼軟信息的迭代載波恢復(fù)

    基于LDPC譯碼軟信息的迭代載波恢復(fù):針對(duì)較低信噪比(≤2 dB)下載波恢復(fù)難題,該文提出了基于LDPC 軟信息的迭代載波恢復(fù)算法。該算法以最大化LDPC 軟信息絕對(duì)值的和為準(zhǔn)則,對(duì)載
    發(fā)表于 10-29 13:03 ?18次下載

    LDPC譯碼

    LDPC譯碼LDPC碼是一種線性分組奇偶校驗(yàn)碼,它采用基于因子圖的置信傳播(Belief Propagation,BP)迭代譯碼算法進(jìn)行譯碼
    發(fā)表于 03-01 17:36 ?2052次閱讀
    <b class='flag-5'>LDPC</b>編<b class='flag-5'>譯碼</b>

    基于最小和高效LDPC譯碼算法

    針對(duì)低密度奇偶校驗(yàn)(LDPC)譯碼算法性能低的問題,提出一種基于最小和的高效譯碼算法。該算法從概率的角度分析消息的傳遞過程中校驗(yàn)節(jié)點(diǎn)的更新過程
    發(fā)表于 05-18 18:54 ?0次下載
    基于最小和高效<b class='flag-5'>LDPC</b><b class='flag-5'>譯碼</b>算法

    高速通用LDPC譯碼技術(shù)

    香農(nóng)的學(xué)生Gallager首次提出了LDPC碼的概念和完整的譯碼方法,目前LDPC碼正向著高速高增益的方向發(fā)展。文中針對(duì)目前對(duì)高速LDPC譯碼
    發(fā)表于 07-26 11:17 ?0次下載

    LDPC C++11版本程序下載

    利用C++仿真了LDPC碼,譯碼采用了基于對(duì)數(shù)似然比的BP算法。編碼矩陣可以在根文件夾中選擇。
    發(fā)表于 03-29 09:22 ?0次下載

    LDPC碼的譯碼停止準(zhǔn)則

    提出了一種實(shí)用的LDPC譯碼停止準(zhǔn)則,利用信息節(jié)點(diǎn)的對(duì)數(shù)概率似然比來控制迭代次數(shù),避開了設(shè)置停止準(zhǔn)則門限,可以很快判斷出譯碼情況,較其他方法省去了大量繁雜的計(jì)算。
    發(fā)表于 09-07 19:38 ?10次下載
    <b class='flag-5'>LDPC</b>碼的<b class='flag-5'>譯碼</b>停止準(zhǔn)則

    基于FPGA 的LDPC 碼編譯碼器聯(lián)合設(shè)計(jì)

    該文通過對(duì)低密度校驗(yàn)(LDPC)碼的編譯碼過程進(jìn)行分析,提出了一種基于FPGA 的LDPC 碼編譯碼器聯(lián)合設(shè)計(jì)方法,該方法使編碼器和
    發(fā)表于 11-22 07:34 ?4435次閱讀
    基于FPGA 的<b class='flag-5'>LDPC</b> 碼編<b class='flag-5'>譯碼</b>器聯(lián)合設(shè)計(jì)

    c#調(diào)用matlab函數(shù)

    本文檔內(nèi)容介紹了基于c#調(diào)用matlab函數(shù),供參考
    發(fā)表于 04-19 10:53 ?24次下載

    MATLAB程序調(diào)試的方法及工具介紹

    MATLAB程序設(shè)計(jì)之MATLAB程序調(diào)試的方法及工具介紹。
    的頭像 發(fā)表于 07-13 17:50 ?6844次閱讀
    <b class='flag-5'>MATLAB</b><b class='flag-5'>程序</b><b class='flag-5'>調(diào)試</b>的方法及工具介紹

    C調(diào)用matlab方法

    C調(diào)用matlab方法介紹
    發(fā)表于 07-31 10:55 ?0次下載