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

📄 9-1.c

📁 TI公司c6000系列 dsp 的案例源代码
💻 C
字号:
#include "main.h" 
// 微分真值表,第4和第5位用于发送,第0和第0位用于接收
char Diff[] =   
      { 0x00, 0x11, 0x23, 0x32, 0x11, 0x00, 0x32, 0x23, 0x22, 0x33, 0x10, 0x01, 0x33, 0x22, 0x01, 0x10 }; 
// 延迟状态发送矩阵,用于回溯当前状态
char TMBackward[8][4] = { 
      0, 3, 1, 2, 14
      4, 7, 6, 5, 15
      1, 2, 0, 3, 16
      5, 6, 7, 4, 17
      2, 1, 3, 0, 18
      7, 4, 5, 6, 19
      3, 0, 2, 1, 20
      6, 5, 4, 7 21
      }; 

char Tdr, DelayState[16][8], PathState[16][2], DStCurr; 
int AccDist[8]; 
// 初始化函数
void Init () 
{ 
      short i, j; 
      DStCurr = 0; 
      Tdr = 0; 
      AccDist[0] = 0; 
      for (i = 1; i < 8; i++) 
            AccDist[i] = (1 << 10) / 2; 
      for (j = 0; j < 16; j++) 
            for (i = 0; i < 8; i++) 
                  DelayState[j][i] = 0; 
      for (j = 0; j < 16; j++) 
            for (i = 0; i < 2; i++) 
                  PathState[j][i] = 0; 
} 
// 译码
int Viterbi (int Xi, int Yi, int modd) 
{ 
      short State[8], Xb, Yb, Nx, Ny, Qx, Qy, Ix, Iy, Id; 
      short c, i, j, tmp1, tmp2, tmp3, tmp4, tt, ss, pp; 
      int Distance[8], dist1, dist0, DataOut, Sht; 
      Mod *Mcurr; 

      Mcurr = (Mod*) modd; 
      Sht = Mcurr->TSht; 
// Xi和Yi是输入,首先得到最低距离
      for (c = 0; c < 8; c++)
{
     Xb = (Mcurr->TXs[c]) << 10;        Yb = (Mcurr->TYs[c]) << 10;
     Nx = Mcurr->TNx[c];               Ny = Mcurr->TNy[c];
     Qx = (Mcurr->TQx) << 10;          Qy = (Mcurr->TQy) << 10;
     Iy = Ny;
     for (i = 0; i < Ny; i++)
          {
               if (Yi < Yb) { Iy = i; break; }
               Yb += Qy;
          }
     Ix = Nx;
     for (i = 0; i < Nx; i++)
          {
               if (Xi < Xb) { Ix = i; break; }
               Xb += Qx;
          }
     Id = Iy * (Nx + 1) + Ix;
     State[c] = *(Mcurr->St[c] + Id);
     tmp1 = *(Mcurr->Xc[c] + Id);
     tmp2 = *(Mcurr->Yc[c] + Id);
     if (State[c] != SS)
     {
          tmp3 = Xi - (tmp1 << 10);
          tmp4 = Yi - (tmp2 << 10);
          Distance[c] = (int)tmp3 * (int)tmp3 + (int)tmp4 * (int)tmp4;
     }
     else
     {
          tmp3 = Xi - (*(Mcurr->Xc[c] + tmp1) << 10);
          tmp4 = Yi - (*(Mcurr->Yc[c] + tmp1) << 10);
          dist1 = (int)tmp3 * (int)tmp3 + (int)tmp4 * (int)tmp4;
          tmp3 = Xi - (*(Mcurr->Xc[c] + tmp2) << 10);
          tmp4 = Yi - (*(Mcurr->Yc[c] + tmp2) << 10);
          Distance[c] = (int)tmp3 * (int)tmp3 + (int)tmp4 * (int)tmp4;
          State[c] = *(Mcurr->St[c] + tmp2);
          if (dist1 < Distance[c])
          {
               Distance[c] = dist1;
               State[c] = *(Mcurr->St[c] + tmp1);
          }
     }
}
// 在路径状态0~7中寻找最短距离
dist0 = 0x7FFFFFFF;
for (c = 0; c < 4; c++)
{
     if (Distance[c] < dist0)
     {
          dist0 = Distance[c];
          Id = c;
     }
 }
DelayState[DStCurr][0] = TMBackward[0][Id];
DelayState[DStCurr][2] = TMBackward[2][Id];
DelayState[DStCurr][4] = TMBackward[4][Id];
DelayState[DStCurr][6] = TMBackward[6][Id];
PathState[DStCurr][0] = State[Id];

dist1 = 0x7FFFFFFF;
for (c = 4; c < 8; c++)
     {
          if (Distance[c] < dist1)
          {
               dist1 = Distance[c];
               Id = c;
          }
      }
DelayState[DStCurr][1] = TMBackward[1][Id-4];
DelayState[DStCurr][3] = TMBackward[3][Id-4];
DelayState[DStCurr][5] = TMBackward[5][Id-4];
DelayState[DStCurr][7] = TMBackward[7][Id-4];
PathState[DStCurr][1] = State[Id];
// 更新距离累加值
for (i = 0; i < 8; i++)
      Distance[i] = AccDist[i];
for (i = 0; i < 8; i++)
{
      Id = DelayState[DStCurr][i];
      AccDist[i] = Distance[Id] / 8 * 7;
}
for (i = 0; i < 8; i+=2)
      AccDist[i] += dist0 / 8;
for (i = 1; i < 8; i+=2)
      AccDist[i] += dist1 / 8;

dist0 = 0x7FFFFFFF;
for (i = 0; i < 8; i++)
{
      if (AccDist[i] < dist0)
      {
            dist0 = AccDist[i];
            Id = i;
      } 
}
j = DStCurr;
for (i = 0; i < 15; i++)
{
     Id = DelayState[j][Id];
     j--; if (j < 0) j = 15;
}
tt = PathState[j][Id % 2];
DStCurr++;
if (DStCurr >= 16) DStCurr = 0;
     ss = tt & ((1 << Sht) - 1);
     tt = (tt >> Sht) & 0x03;
     pp = (tt << 2) | Tdr;
     Tdr = tt;
     DataOut = ((Diff[pp] & 0x03) << Sht) | ss;
     return (DataOut);
}

⌨️ 快捷键说明

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