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文章
2981瀏覽量
231090 -
C程序
+關注
關注
4文章
255瀏覽量
36156
發布評論請先 登錄
相關推薦
怎樣設計基于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)
評論