📄 9-1.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 + -