📄 decode_4_21.c
字号:
****************************************************************************************************************/
for(i=0;i<6;i++)//根据6个已知0序列,就可以将路径收敛至状态0
{
/*=====================================这个部分是将接收到的比特流分组=============================*/
weight1=a[1][(i+length-6)%period];//i%period体现了RCPC删除图形的周期性,记录第二个加法器的权重
weight2=a[2][(i+length-6)%period];//记录第三个加法器的权重
out0=*q;q++;//根据RCPC的删除图形,我们可以知道第一个加法器的输出是全部保留的。
if(weight1==1)//i%period体现了RCPC删除图形的周期性,判断编码时对第二个加法器的编码是否进行删除
{out1=*q;q++;}
if(weight2==1)//判断编码时对第三个加法器的编码是否进行删除
{out2=*q;q++;}
/*================================================================================================*/
for(j=0;j<(32>>i);j++)//由于已知序列均为0,所以根据蝶形运算法则,状态数将递减
{ k=j*(2<<i);
branch_metric[0]=mettab[code[k][0]][out0]+weight1*mettab[code[k][1]][out1]+weight2*mettab[code[k][2]][out2];
branch_metric[1]=mettab[code[k][0]][out0]^1+weight1*(mettab[code[k][1]][out1]^1)+weight2*(mettab[code[k][2]][out2]^1);
temp[k]=path_metric[k];
temp_path[k]=path[k];
if(branch_metric[0]<branch_metric[1])
{ k=j*(1<<i);
temp[k]=path_metric[k];
path_metric[j*(2<<i)]=branch_metric[0]+temp[k];
temp_path[k]=path[k];
path[j*(2<<i)]=temp_path[k];
}
else
{ k=j*(1<<i)+32;
temp[k]=path_metric[k];
path_metric[j*(2<<i)]=branch_metric[1]+temp[k];
temp_path[k]=path[k];
path[j*(2<<i)]=path[k];
}
}
}
/************************************************************************************************************
这部分为处理路径收敛至path[0]后,输出其中存储的最后32个译码码字
***********************************************************************************************************/
*p=(path[0]&0x80000000)>>31;//取出最高位(第32位,向左移动31位输出)
*(p+1)=(path[0]&0x40000000)>>30;
*(p+2)=(path[0]&0x20000000)>>29;
*(p+3)=(path[0]&0x10000000)>>28;
*(p+4)=(path[0]&0x08000000)>>27;
*(p+5)=(path[0]&0x04000000)>>26;
*(p+6)=(path[0]&0x02000000)>>25;
*(p+7)=(path[0]&0x01000000)>>24;
*(p+8)=(path[0]&0x00800000)>>23;
*(p+9)=(path[0]&0x00400000)>>22;
*(p+10)=(path[0]&0x00200000)>>21;
*(p+11)=(path[0]&0x00100000)>>20;
*(p+12)=(path[0]&0x00080000)>>19;
*(p+13)=(path[0]&0x00040000)>>18;
*(p+14)=(path[0]&0x00020000)>>17;
*(p+15)=(path[0]&0x00010000)>>16;
*(p+16)=(path[0]&0x00008000)>>15;
*(p+17)=(path[0]&0x00004000)>>14;
*(p+18)=(path[0]&0x00002000)>>13;
*(p+19)=(path[0]&0x00001000)>>12;
*(p+20)=(path[0]&0x00000800)>>11;
*(p+21)=(path[0]&0x00000400)>>10;
*(p+22)=(path[0]&0x00000200)>>9;
*(p+23)=(path[0]&0x00000100)>>8;
*(p+24)=(path[0]&0x00000080)>>7;
*(p+25)=(path[0]&0x00000040)>>6;
*(p+26)=(path[0]&0x00000020)>>5;
*(p+27)=(path[0]&0x00000010)>>4;
*(p+28)=(path[0]&0x00000008)>>3;
*(p+29)=(path[0]&0x00000004)>>2;
*(p+30)=(path[0]&0x0000002)>>1;
*(p+31)=path[0]&0x00000001;
/********************************这部分将最后得到的译码码字decode[]输出*****************************************/
for(p=decode;p<length+decode;p++)
{ printf("%d,",*p);}
}
/************************************************************************************
viterbi编码器的寄存器从全零状态开始,经过六级输入0或1比特后,历经64个状态的编码输出。
当前状态 输入 编码输出 下一状态
0 0 000 0
0 1 111 1
1 0 110 2
1 1 001 3
2 0 111 4
2 1 000 5
3 0 001 6
3 1 110 7
4 0 101 8
4 1 010 9
5 0 011 10
5 1 100 11
6 0 010 12
6 1 101 13
7 0 100 14
7 1 011 15
8 0 010 16
8 1 101 17
9 0 100 18
9 1 011 19
10 0 101 20
10 1 010 21
11 0 011 22
11 1 100 23
12 0 111 24
12 1 000 25
13 0 001 26
13 1 110 27
14 0 000 28
14 1 111 29
15 0 110 30
15 1 001 31
16 0 001 32
16 1 110 33
17 0 111 34
17 1 000 35
18 0 110 36
18 1 001 37
19 0 000 38
19 1 111 39
20 0 100 40
20 1 011 41
21 0 010 42
21 1 101 43
22 0 011 44
22 1 100 45
23 0 101 46
23 1 010 47
24 0 011 48
24 1 100 49
25 0 101 50
25 1 010 51
26 0 100 52
26 1 011 53
27 0 010 54
27 1 101 55
28 0 110 56
28 1 001 57
29 0 000 58
29 1 111 59
30 0 001 60
30 1 110 61
31 0 111 62
31 1 000 63
*************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -