MATLAB是一個很好用的工具。利用MATLAB腳本進行科學(xué)計算也特別方便快捷。但是代碼存在較多循環(huán)時,MATLAB運行速度極慢。如果不想放棄MATLAB中大量方便使用的庫,又希望代碼能迅速快捷的運行,可以考慮將循環(huán)較多的功能采用C編寫,MATLAB調(diào)用。本文將概述這一過程。雖然本文以LDPC譯碼算法為例,但不懂該算法不影響本文閱讀。
1. 起因
最開始用MATLAB寫的LDPC譯碼算法中,其中一個版本是這里,里面有三重循環(huán),運行速度極慢。后來考慮了MATLAB的向量化操作,通過算法的合理劃分以及內(nèi)置函數(shù)調(diào)用,成功將三重循環(huán)修改為1層,具體這一版本的代碼可見這里。通過這一手段,函數(shù)的運行速度提高了幾倍乃至幾十倍。雖然這一方法下運行速度依舊比不過MATLAB工具箱中的comm.LDPCDecoder,遠(yuǎn)比不上利用GPU的comm.gpu.LDPCDecoder,但勝在可明確算法并具有一定擴展性。
起初也注意到可以通過MATLAB調(diào)用C程序來加速程序運行,但向量化后的代碼湊活能用,加上有時也可調(diào)用更為強大的內(nèi)置函數(shù),這一想法一直沒有付諸實踐。這幾天想好好整理一下代碼,遂萌發(fā)了寫一個C版本譯碼算法的想法。代碼現(xiàn)在的狀態(tài)是“能用”,這里把相關(guān)經(jīng)驗總結(jié)分析在此。
2. MATLAB調(diào)用C程序
這一部分的內(nèi)容在劉曉輝的matlab調(diào)用C程序中已經(jīng)有較為詳細(xì)的介紹了,想要正確調(diào)用C程序,關(guān)鍵概括為2點。
機器上裝有MATLAB編譯器,可通過在MATLAB命令行窗口輸入mex -setup進行具體設(shè)置。
有一個正確的接口子程序mexFunction完成MATLAB和C程序之間的數(shù)據(jù)轉(zhuǎn)換和程序調(diào)用
這里給出我寫得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的規(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時,傳給test的這四個參數(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是一個C程序,運行C程序后plhs[0]指向的內(nèi)存空間存儲的就是滿足要求的計算結(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 長度 state[2] rownum 長度,
//state[3]:H中非零元素個數(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
-
matlab
+關(guān)注
關(guān)注
189文章
3001瀏覽量
234179 -
C程序
+關(guān)注
關(guān)注
4文章
255瀏覽量
36836
發(fā)布評論請先 登錄
怎樣設(shè)計基于CMMB系統(tǒng)的LDPC譯碼器?
大圍數(shù)QC_LDPC碼的譯碼器該怎么設(shè)計?
LDPC碼與RS碼的聯(lián)合迭代譯碼
IEEE 802.16e中LDPC譯碼器的實現(xiàn)
基于LDPC譯碼軟信息的迭代載波恢復(fù)
LDPC編譯碼

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

高速通用LDPC碼譯碼技術(shù)
LDPC碼的譯碼停止準(zhǔn)則

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

評論