⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldpcpl1dec.c

📁 LDPC码的译码
💻 C
字号:
#include <mex.h>
#include <matrix.h>         //for Matlab mx and mex fuctions
#include <math.h>

void decode( double *vhat, double *iter,
             double *pl1, double *h1i, double *h1j,
             double rows, double cols, double max_iter, double h1num )
{
    double *qmn1;
    double *dqmn;
    double *rmn0;
    double *rmn1;
    double *qn1;

    int i, j, k;
    int iteration;

    double prod_dqmn;
    double prod_rmn0;
    double prod_rmn1;
    double const1;
    double const2;
    double const3;
    double const4;

    int done;
    int temp;

//    mexPrintf("\npl1:\n");
//    for (j=0; j<cols; j++)
//    {
//        mexPrintf("%f\t", pl1[j]);
//    }
//
//    mexPrintf("\nh1i:\n");
//    for (k=0; k<h1num; k++)
//    {
//        mexPrintf("%d\t", (int)h1i[k]);
//    }
//
//    mexPrintf("\nh1j:\n");
//    for (k=0; k<h1num; k++)
//    {
//        mexPrintf("%d\t", (int)h1j[k]);
//    }
//
//    mexPrintf("\nrows=%d\tcols=%d\tmax_iter=%d\th1num=%d\n",(int)rows,(int)cols,(int)max_iter,(int)h1num);

    qmn1    = (double *)mxMalloc((size_t) (h1num*sizeof(double)));
    dqmn    = (double *)mxMalloc((size_t) (h1num*sizeof(double)));
    rmn0    = (double *)mxMalloc((size_t) (h1num*sizeof(double)));
    rmn1    = (double *)mxMalloc((size_t) (h1num*sizeof(double)));
    qn1     = (double *)mxMalloc((size_t) (h1num*sizeof(double)));

    //初始化:对特定的信道预设信息比特的先验概率。
    for (k=0; k<h1num; k++)
    {
        qmn1[k] = pl1[(int)h1j[k]];
    }

    for (iteration=1; iteration<=(int)max_iter; iteration++)
    {   //main iteration loop
        //横向步骤:由信息节点的先验概率按置信传播算法得出各校验节点的后验概率。
        for (k=0; k<h1num; k++)
        {
            //计算概率差
            dqmn[k]=1-qmn1[k]-qmn1[k];
        }
        for (i=0; i<rows; i++)
        {
            prod_dqmn = 1;
            for (k=0; k<h1num; k++)
            {
                if (h1i[k]==i)
                {
                    prod_dqmn *= dqmn[k];
                }
            }
            for (k=0; k<h1num; k++)
            {
                if (h1i[k]==i)
                {
                    rmn0[k] = (1 + prod_dqmn/dqmn[k])/2;
                    rmn1[k] = 1 - rmn0[k];
                }
            }
        }

        //纵向步骤:由校验节点的后验概率推算出信息节点的后验概率。
        for (j=0; j<cols; j++)
        {
            prod_rmn0 = 1;
            prod_rmn1 = 1;
            for (k=0; k<h1num; k++)
            {
                if (h1j[k]==j)
                {
                    prod_rmn0 *= rmn0[k];
                    prod_rmn1 *= rmn1[k];
                }
            }
            for (k=0; k<h1num; k++)
            {
                if (h1j[k]==j)
                {
                    const3 = (1-pl1[j])*prod_rmn0;
                    const4 = pl1[j]*prod_rmn1;
                    qn1[k] = const4/(const3+const4);
                    const1 = const3/rmn0[k];
                    const2 = const4/rmn1[k];
                    qmn1[k] = const2/(const1+const2);
                    if (qn1[k]>0.5)
                    {
                        vhat[j]=1;
                    }
                    else
                    {
                        vhat[j]=0;
                    }
                }//if (h1j[k]==j)
            }//for (k=0; k<h1num; k++)
        }//for (j=0; j<cols; j++)

        //如果判决条件满足,译码结束,否则继续迭代
        done = 1;
        for (i=0; i<rows; i++)
        {
            temp = 0;
            for (k=0; k<h1num; k++)
            {
                if (h1i[k]==i)
                {
                    temp += (int)vhat[(int)h1j[k]];
                }
            }
            temp = temp%2;
            if (temp!=0)
            {
                done = 0;
                break;
            }
        }

        *iter = iteration;
        if (done)
        {
//            mexPrintf("\niter=%d\n",(int)*iter);
//            mexPrintf("vhat:\n");
//            for (j=0; j<cols; j++)
//            {
//                mexPrintf("%d\t", (int)vhat[j]);
//            }

            return;
        }

//        mexPrintf("\niter=%d\n",(int)*iter);
//        mexPrintf("vhat:\n");
//        for (j=0; j<cols; j++)
//        {
//            mexPrintf("%d\t", (int)vhat[j]);
//        }

    }//main iteration loop end
}


//  0     1            0   1   2   3    4      5
//[vhat,iter]=ldpcdec(pl1,h1i,h1j,rows,cols,max_iter)
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray*prhs[] )
{
    double *pl1;    //pointer variable for input matrix pl1
    double *h1i;    //pointer variable for input matrix h1i
    double *h1j;    //pointer variable for input matrix h1j
    double rows;    //H matrix rows
    double cols;    //H matrix cols
    double max_iter;//maxim iteration

    double *vhat;   //pointer variable for output matrix vhat
    double *iter;   //iteration output

    double h1num;   //H matrix 1's number

    pl1 = mxGetPr(prhs[0]);     //pointer to pl1
    h1i = mxGetPr(prhs[1]);     //pointer to pl1
    h1j = mxGetPr(prhs[2]);     //pointer to pl1
    rows = mxGetScalar(prhs[3]);//value of rows
    cols = mxGetScalar(prhs[4]);//value of cols
    max_iter = mxGetScalar(prhs[5]);//value of max_iter

    plhs[0] = mxCreateDoubleMatrix(1, cols, mxREAL); //matrix for output
    vhat = mxGetPr(plhs[0]);    //pointer to vhat
    plhs[1] = mxCreateDoubleScalar(0);
    iter = mxGetPr(plhs[1]);

    h1num = mxGetN(prhs[1]);    //number of cols of h1i

    decode(vhat, iter, pl1, h1i, h1j, rows, cols, max_iter, h1num);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -