www.pudn.com > 213test.rar > 213test.cpp


#include  
#include "Conio.h" 
#define N 7 
#include "math.h" 
#include   
#include 
#define randomize() srand((unsigned)time(NULL)) 
 
 
encode( 
unsigned int *symbols,    /*编码输出*/ 
unsigned int *data,       /*编码输入*/ 
unsigned int nbytes,      /*nbytes=n/16,n为实际输入码字的数目*/ 
unsigned int startstate   /*定义初始化状态*/ 
) 
{ 
  int j; 
  unsigned int input,a1=0,a2=0; 
 
  for(j=0;j>1)&1)^(state2&1)^(state1&1); 
 sym2=((state2>>1)&1)^(state1&1); 
  
 sym=(sym1<<1) | sym2; 
 
if ( ((state1&2)>>1)==(state2&1)) 
 c=((m&1)^(sym&1))+(((m>> 1)&1)^((sym >> 1)&1)); 
else 
 c=10000;  
return(c); 
}      
 
 
int traninput(int a,int b)         /*状态从a到b时输入卷积码的符号*/ 
{int c; 
 c=((b&2)>>1); 
 return(c); 
}                            
 
 int tranoutput(int a,int b)         /*状态从a到b时卷积码输出的符号*/ 
{int c,s1,s2; 
 s1=(a&1)^((a&2)>>1)^((b&2)>>1); 
 s2=(a&1)^((b&2)>>1); 
 c=(s1<<1)|s2; 
 return(c); 
}   
 
void viterbi(int initialstate,      /*定义解码器初始状态*/ 
        int *viterbiinput,     /*解码器输入码字序列*/ 
        int *viterbioutput     /*解码器输出码字序列*/ 
       ) 
{struct sta                    /*定义网格图中每一点为一个结构体,其元素包括*/            
  {int met;                    /*转移到此状态累计的度量值*/ 
   int value;                  /*输入符号 */ 
   struct sta *last;           /*及指向前一个状态的指针*/ 
  }; 
 struct  sta state[4][N]; 
 struct  sta *g,*head; 
 int i,j,p,q,t,r,u,l; 
 
 for(i=0;i<4;i++)                /* 初始化每个状态的度量值*/ 
   
   for(j=0;j0;u--)                       /*向前递归的找出最大似然路径 */ 
    {*(viterbioutput+(u-1))=g->value; 
     g=g->last; 
    }                                           
 
    /* for(u=0;u<8;u++) 
      *(viterbioutput+u)=state[u][2].met; */    /*此行程序可用于检测第n列的度量值*/                     
} 
 
void decode(unsigned int *input, int *output,int n) 
{ 
  int viterbiinput[100]; 
  int j; 
  for(j=0;j