2009-10-27 2 views
-1

이 Viterbi 디코더 기능 코드는 상당히 길며 도움이 될만한 설명 라벨이 없으므로 이해하려고 노력하겠습니다.누군가 viterbi 디코더의 단계별 알고리즘을 통해 단계를 얻을 수 있습니까?

그래서 누구나 쉽게 알고리즘을 이해할 수 있습니까?

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; 

} 
+0

Yikes! 노 코멘트꾼의 복수! – DVK

답변

0

팁 : 숙고 된 그래프의 최단 경로를 찾는 것은 거의 'Dijkstra 알고리즘'입니다.

물론 Dijkstra 알고리즘을 모른다면 Wikipedia를 사용해보십시오.

관련 문제