资源简介
这是我在大学期间做的一个有关编码译码过程在vc环境中的实现,该程序实现了2,1,2的维特比译码过程,希望能够帮助大家理解~
代码片段和文件信息
#include
#include
#include
#define DATA_MAX 100
#define NMAX 100
int r[DATA_MAX];
int DATA_INPUT;
void viterbi(int DATA_INPUT)
{
int b1b2b3b4;
int nijk;
int input[2]={0};
int p1[NMAX]p2[NMAX]p3[NMAX]p4[NMAX]pf1[NMAX]pf2[NMAX]pf3[NMAX]pf4[NMAX];
int d1d2d3d4tem1tem2tem3tem4st;
int a[4][4]={0};
int c[4][4]={0};
d1=0;d2=0;d3=0;d4=0;tem1=0;tem2=0;tem3=0;tem4=0;
j=0;n=0;i=0;b1=0;b2=0;b3=0;b4=0;
a[0][0]=100;a[0][1]=100;a[0][2]=101;
c[0][0]=100;c[0][1]=111;
a[1][0]=101;a[1][1]=110;a[1][2]=111;
c[1][0]=110;c[1][1]=101;
a[2][0]=110;a[2][1]=100;a[2][2]=101;
c[2][0]=111;c[2][1]=100;
a[3][0]=111;a[3][1]=110;a[3][2]=111;
c[3][0]=101;c[3][1]=110; //用a[0][0]-a[3][0]数组记录,状态转移的4种状态,并且用他的后面坐标为1.2的值表示他的下2个状态
//为了便于记录,数组存储的时候让他成为一个整数储存即都状态前面都加了个1变为三位数。
//用c[i][j]数组记录从i状态跳转到j状态的编码输出
n=0;
//根据译码输入长度,分成3种情况,只有2个译码输入字,只有4个和大于4个的情况
if(j==0 && DATA_INPUT>=2) //第一个状态默认从0状态起始
{
input[0]=r[n]; //通过input依次读入译码输入,每一次读取2位
input[1]=r[n+1];
n+=2;
if(input[1]!=(c[0][0]%100%10)) //对当前状态到后状态1
//取出编码输出的低位与输入译码的低位进行比较,若相同则路径量度d1加1
d1++;
if(input[0]!=(c[0][0]%100/10)) //取出编码输出的高位与输入译码的高位进行比较,若相同则路径量度d1加1
d1++;
p1[j]=0;p2[j]=0;
if(input[1]!=(c[0][1]%100%10)) //对当前状态到后状态2
d2++;
if(input[0]!=(c[0][1]%100/10))
d2++;
p3[j]=1;p4[j]=1;
j++;
if(DATA_INPUT==2) //若只有2位译码字,直接输出结果
{
printf(“(注意:100表示00状态,101表示01状态,110表示10状态,111表示11状态)“);
printf(“\n“);
printf(“最后的幸存路径为: 100“);
printf(“->d%“a[0][0]);
printf(“\n“);
printf(“译码输出为:%d“p1[0]);
printf(“\n“);
}
}
if(j==1 && DATA_INPUT>=4)
{
input[0]=r[n];
input[1]=r[n+1];
n+=2;
d3=d2; //当为第二个状态时,d3d4分别赋值为d2,即二状态时,3,4节点只能有2节点转变而来
//之后同理,进行编码字与译码输入的判断后更新各个路径量度值。
if(input[1]!=(c[1][0]%100%10))
d3++;
if(input[0]!=(c[1][0]%100/10))
d3++;
p3[j]=0;
d4=d2;
if(input[1]!=(c[1][1]%100%10))
d4++;
if(input[0]!=(c[1][1]%100)/10)
d4++;
p4[j]=1;
if(input[1]!=(c[0][0]%100%10))
d1++;
if(input[0]!=(c[0][0]%100)/10)
d1++;
p1[j]=0;
if(input[1]!=(c[0][1]%100%10))
d2++;
if(input[0]!=(c[0][1]%100)/10)
d2++;
p2[j]=1;
j++;
if(DATA_INPUT==4) //若只有4个译码输入,则完成路径选择后,输出幸存路径,并输出到达0状态译码p1。
{
printf(“(注意:100表示00状态,101表示01状态,110表示10状态,111表示11状态)“);
printf(“\n“);
printf(“最后的幸存路径为: 100“);
for(k=0;k {
if(p1[i]==0)
{
i=2*i%4;
printf(“->%d“a[(2*i)%4][0]);
}
if(p1[i]==1)
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 8913 2010-01-09 11:29 viterb212.c
----------- --------- ---------- ----- ----
8913 1
- 上一篇:C++test v6.0.0.5破解版3
- 下一篇:dijkstra算法C++实现
评论
共有 条评论