-1

我有这个 Viterbi Decoder 函数代码,比较冗长,没有注释标注帮助,我想试着理解一下。

所以任何人都可以向我指出一个易于理解的算法吗?

无论如何,这是代码:

int viterbiDecode( int nBit, float *p_pm, int *p_sp, int *p_bStore, float *p_hd, int TB, int fc, int lc, int startTB) //initiate Viterbi Decoder function
{

int ipLut[4][4]; // intialization

ipLut[0][0] = 0; ipLut[0][1] = 0; ipLut[0][2] = 0; ipLut[0][3] = 0;

ipLut[1][0] = 0; ipLut[1][1] = 0; ipLut[1][2] = 0; ipLut[1][3] = 0;

ipLut[2][0] = 1; ipLut[2][1] = 1; ipLut[2][2] = 0; ipLut[2][3] = 0;

ipLut[3][0] = 0; ipLut[3][1] = 0; ipLut[3][2] = 1; ipLut[3][3] = 1;

int cs, ps,loopII;

float bm[2], pm_n[4];

int err, nErr;

int bHat;

int tt1, tt2;

int tbStCnt;

int decodeStCnt;

nErr = 0;

   if (fc==1)

    {
      bm[0] = *p_pm+*p_hd;
      *(p_sp+nBit*4+0) = 0;
      pm_n[0] = bm[0];

      bm[0] = *(p_pm+2)+*(p_hd+2);
      *(p_sp+nBit*4+1) = 2;
      pm_n[1] = bm[0];

      bm[0] = *p_pm + *(p_hd+3);
      *(p_sp+nBit*4+2) = 0;
      pm_n[2] = bm[0];

      bm[0] = *(p_pm+2)+ *(p_hd+1);
      *(p_sp+nBit*4+3) = 2;
      pm_n[3] = bm[0];

    } else {

      bm[0] = *p_pm + *p_hd;
      bm[1] = *(p_pm+1) + *(p_hd+3);
      *(p_sp+nBit*4+0) = (bm[0] < bm[1])? 0:1;
      pm_n[0] = bm[(*(p_sp+nBit*4+0))];

      bm[0] = *(p_pm+2) + *(p_hd+2);
      bm[1] = *(p_pm+3) + *(p_hd+1);
      *(p_sp+nBit*4+1) = (bm[0]<bm[1])? 2:3;
      pm_n[1] = bm[(*(p_sp+nBit*4+1))-2];

      bm[0] = *p_pm + *(p_hd+3);
      bm[1] = *(p_pm+1) + *p_hd;
      *(p_sp+nBit*4+2) = (bm[0]<bm[1])? 0:1;
      pm_n[2] = bm[(*(p_sp+nBit*4+2))];

      bm[0] = *(p_pm+2) + *(p_hd+1);
      bm[1] = *(p_pm+3) + *(p_hd+2);
      *(p_sp+nBit*4+3) = (bm[0]<bm[1])? 2:3;
      pm_n[3] = bm[(*(p_sp+nBit*4+3))-2];

     }
    *p_pm = pm_n[0];
    *(p_pm+1) = pm_n[1];
    *(p_pm+2) = pm_n[2];
    *(p_pm+3) = pm_n[3];

    // trace back

    if ( (startTB==1) || (lc ==1)  )
       {
          tt1 = (pm_n[0] < pm_n[1])? 0: 1;
          tt2 = (pm_n[2] < pm_n[3])? 2: 3;
          if (pm_n[tt1] < pm_n[tt2]) {
                 cs = tt1;
          }
          else{
               cs = tt2;
          }

          tbStCnt     = nBit;
          decodeStCnt = tbStCnt-TB;
          if (lc ==1)
             {
             cs = 0;
             decodeStCnt = tbStCnt-2;
             }


          for (loopII=tbStCnt;loopII>=0;loopII--)
          {
             ps = *(p_sp + 4*loopII + cs);

             /* counting the errors */
             if (loopII<decodeStCnt)
             {
                bHat = ipLut[cs][ps];
                err =  (bHat == *(p_bStore+loopII))? 0:1;
                nErr = nErr+ err;
             }
             cs = ps;

           }

        }

return nErr;

}
4

2 回答 2

3

谷歌 ?维特比算法

于 2009-10-27T17:27:16.863 回答
0

提示:找到进入思考图的最短路径几乎完全是“Dijkstra 算法”。

当然,如果您不了解 Dijkstra 算法,您也可以尝试 Wikipedia。

于 2009-10-27T17:34:09.363 回答