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;j 0;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