维特比译码程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(n,k,N)卷积码的维特比译码算法实现#include
#define t_src 0
#define t_des 1
#define t_len 2
#define t_flag 3
#define t_in 4
using namespace std;
int myn=0;
int stalen=0;
int myg1[10]={0};
int myg2[10]={0};
int stan0[256][2]={0};//输入0时个状态的输出
int stan1[256][2]={0};//输入1时各状态的输出
int stachn[256][2]={0};//状态装换表
int path[256][100]={0};//存储路径
int calpath[256]={0};//存储路径长度
int myin[24];//一次处理12次
int myout[200]; //
int myoutsym=0;
int pthsym;
int outfull=0; //决定是否输出
int table1[8]={1,2,4,8,16,32,64,128};
void chartobits(char ch,int *bits);
char bitstochar(int *bits);
int calluj(int a1,int a2,int b1,int b2);
void initpath(void);
void selpath(int a1,int a2);
void wridata(void);
void viterbit(void);
void writdataedn(void);
void creatsta(void);
void myinput(void);
int main(){
myinput();
creatsta();
viterbit();
}
void myinput(void){
int i,j;
cout<<"输入编码的约束长度N:(3 cin>>myn; stalen=int(pow(2.0,myn-1)); cout<<"选择默认的编码矢量则输入1,输入2则可输入其他的编码矢量"< cin>>i; if(i==1){ switch(myn){ case 3:myg1[0]=1,myg1[1]=1,myg1[2]=1; myg2[0]=1,myg2[1]=0,myg2[2]=1; break; case 4:myg1[0]=1,myg1[1]=1,myg1[2]=1,myg1[3]=1; myg2[0]=1,myg2[1]=0,myg2[2]=1,myg2[3]=1; break; case 5:myg1[0]=1,myg1[1]=0,myg1[2]=1,myg1[3]=1,myg1[4]=1; myg2[0]=1,myg2[1]=1,myg2[2]=0,myg2[3]=1,myg2[4]=1; break; case 6:myg1[0]=1,myg1[1]=0,myg1[2]=1,myg1[3]=1,myg1[4]=1,myg1[5]=1; myg2[0]=1,myg2[1]=1,myg2[2]=0,myg2[3]=1,myg2[4]=0,myg2[5]=1; break; case 7: myg1[0]=1,myg1[1]=0,myg1[2]=0,myg1[3]=1,myg1[4]=1,myg1[5]=1,myg1[6]=1; myg2[0]=1,myg2[1]=1,myg2[2]=0,myg2[3]=1,myg2[4]=1,myg2[5]=0,myg2[6]=1; break; case 8: myg1[0]=1,myg1[1]=0,myg1[2]=0,myg1[3]=1,myg1[4]=1,myg1[5]=1,myg1[6]=1,myg1[7]=1; myg2[0]=1,myg2[1]=1,myg2[2]=1,myg2[3]=0,myg2[4]=0,myg2[5]=1,myg2[6]=0,myg2[7]=1; break; case 9: myg1[0]=1,myg1[1]=1,myg1[2]=0,myg1[3]=1,myg1[4]=0,myg1[5]=1,myg1[6]=1,myg1[7]=1,m yg1[8]=1; myg2[0]=1,myg2[1]=0,myg2[2]=0,myg2[3]=0,myg2[4]=1,myg2[5]=1,myg2[6]=1,myg2[7]=0,m yg2[8]=1; break; } } else{ cout<<"输入g1"< for(j=0;j cin>>myg1[j]; cout<<"输入g2"< for(j=0;j cin>>myg2[j]; } cout<<"连接矢量1为"< for(j=0;j cout< cout< cout<<"连接矢量2为"< for(j=0;j cout< cout< cout<<"stalen: "< cout< } void creatsta(void){ int i,j,k,myi; int tembits[10]; for(i=0;i stan1[i][0]=0; stan1[i][1]=0; stan0[i][0]=0; stan0[i][1]=0; stachn[i][0]=i/2; myi=i; for(j=0;j if(myi>=pow(2.0,myn-1-j)){ tembits[j]=1; myi=myi-pow(2.0,myn-1-j); } else{ tembits[j]=0; } } for(k=0;k stan0[i][0]+=myg1[k]*tembits[k]; stan0[i][1]+=myg2[k]*tembits[k]; } stan0[i][0]=stan0[i][0]%2; stan0[i][1]=stan0[i][1]%2; myi=i+int(pow(2.0,myn-1)); stachn[i][1]=myi/2; for(j=0;j if(myi>=pow(2.0,myn-1-j)){ tembits[j]=1;