• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-13
  • 语言: C/C++
  • 标签:

资源简介

这是我在大学期间做的一个有关编码译码过程在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


评论

共有 条评论