维特比译码程序.docx
- 文档编号:3936887
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:13
- 大小:16.73KB
维特比译码程序.docx
《维特比译码程序.docx》由会员分享,可在线阅读,更多相关《维特比译码程序.docx(13页珍藏版)》请在冰豆网上搜索。
维特比译码程序
(n,k,N)卷积码的维特比译码算法实现
#include
#definet_src0
#definet_des1
#definet_len2
#definet_flag3
#definet_in4
usingnamespacestd;
intmyn=0;
intstalen=0;
intmyg1[10]={0};
intmyg2[10]={0};
intstan0[256][2]={0};//输入0时个状态的输出
intstan1[256][2]={0};//输入1时各状态的输出
intstachn[256][2]={0};//状态装换表
intpath[256][100]={0};//存储路径
intcalpath[256]={0};//存储路径长度
intmyin[24];//一次处理12次
intmyout[200];//
intmyoutsym=0;
intpthsym;
intoutfull=0;//决定是否输出
inttable1[8]={1,2,4,8,16,32,64,128};
voidchartobits(charch,int*bits);
charbitstochar(int*bits);
intcalluj(inta1,inta2,intb1,intb2);
voidinitpath(void);
voidselpath(inta1,inta2);
voidwridata(void);
voidviterbit(void);
voidwritdataedn(void);
voidcreatsta(void);
voidmyinput(void);
intmain(){
myinput();
creatsta();
viterbit();
}
voidmyinput(void){
inti,j;
cout<<"输入编码的约束长度N:
(3 cin>>myn; stalen=int(pow,myn-1)); cout<<"选择默认的编码矢量则输入1,输入2则可输入其他的编码矢量"< cin>>i; if(i==1){ switch(myn){ case3: myg1[0]=1,myg1[1]=1,myg1[2]=1; myg2[0]=1,myg2[1]=0,myg2[2]=1; break; case4: 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; case5: 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; case6: 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; case7: 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; case8: 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; case9: myg1[0]=1,myg1[1]=1,myg1[2]=0,myg1[3]=1,myg1[4]=0,myg1[5]=1,myg1[6]=1,myg1[7]=1,myg1[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,myg2[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< } voidcreatsta(void){ inti,j,k,myi; inttembits[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,myn-1-j)){ tembits[j]=1; myi=myi-pow,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,myn-1)); stachn[i][1]=myi/2; for(j=0;j if(myi>=pow,myn-1-j)){ tembits[j]=1; myi=myi-pow,myn-1-j); } else{ tembits[j]=0; } } for(k=0;k stan1[i][0]+=myg1[k]*tembits[k]; stan1[i][1]+=myg2[k]*tembits[k]; } stan1[i][0]=stan1[i][0]%2; stan1[i][1]=stan1[i][1]%2; } cout<<"状态转移出"< for(i=0;i cout< cout< cout<<"输入0状态转移后的输出"< for(i=0;i cout< cout< cout<<"输入1状态转移后的输出"< for(i=0;i cout< cout< } voidchartobits(charch,int*bits){ inti; for(i=0;i<8;i++){ if(ch<0) bits[i]=1; else bits[i]=0; ch=ch<<1; } } charbitstochar(int*bits){ chartemp=0; inti; for(i=0;i<8;i++){ if(bits[i]==1) temp+=table1[7-i]; } returntemp; } intcalluj(inta1,inta2,intb1,intb2){ inty=0; if(a1! =b1) y++; if(a2! =b2) y++; return(y); } voidinitpath(){ inttem; intt_tem[256][5]={0}; inti,j,k,l; intljtem[256][100]; intpttem[256]={0}; intstaflag[256]={0}; staflag[0]=1; inta1,a2; for(l=0;l for(i=0;i for(j=0;j ljtem[i][j]=path[i][j]; i=0; a1=myin[2*l]; a2=myin[2*l+1]; for(j=0;j if(staflag[j]==1){ tem=calluj(a1,a2,stan0[j][0],stan0[j][1]); t_tem[i][t_src]=j; t_tem[i][t_des]=stachn[j][0]; t_tem[i][t_len]=calpath[j]+tem; t_tem[i][t_in]=0; tem=calluj(a1,a2,stan1[j][0],stan1[j][1]); t_tem[i+1][t_src]=j; t_tem[i+1][t_des]=stachn[j][1]; t_tem[i+1][t_len]=calpath[j]+tem; t_tem[i+1][t_in]=1; i=i+2; } } for(k=0;k staflag[k]=0; for(k=0;k staflag[t_tem[k][t_des]]=1; calpath[t_tem[k][t_des]]=t_tem[k][t_len]; for(j=0;j path[t_tem[k][t_des]][j]=ljtem[t_tem[k][t_src]][j]; path[t_tem[k][t_des]][pthsym]=t_tem[k][t_in]; } pthsym++; } /*cout<<"初始化后的路径长度"< for(inti=0;i<8;i++) cout< cout< } voidselpath(inta1,inta2){//16选8 intt_tem[512][5]={0}; inti,j,tem; intljtem[256][100]; j=0; for(i=0;i<2*stalen;i=i+2){ tem=calluj(a1,a2,stan0[j][0],stan0[j][1]); t_tem[i][t_src]=j; t_tem[i][t_des]=stachn[j][0]; t_tem[i][t_len]=calpath[j]+tem; t_tem[i][t_flag]=0; t_tem[i][t_in]=0; //t_tem[i][t_rep]=0; tem=calluj(a1,a2,stan1[j][0],stan1[j][1]); t_tem[i+1][t_src]=j; t_tem[i+1][t_des]=stachn[j][1]; t_tem[i+1][t_len]=calpath[j]+tem; t_tem[i+1][t_flag]=0; t_tem[i+1][t_in]=1; //t_tem[i][t_rep]=0; j++; } for(i=0;i<2*stalen;i++) for(j=i+1;j<2*stalen;j++) if(t_tem[i][t_des]==t_tem[j][t_des]){ if(t_tem[i][t_len]<=t_tem[j][t_len]){ t_tem[i][t_flag]=1; } else{ t_tem[j][t_flag]=1; } } for(i=0;i for(j=0;j ljtem[i][j]=path[i][j]; for(i=0;i<2*stalen;i++) if(t_tem[i][t_flag]==1){ calpath[t_tem[i][t_des]]=t_tem[i][t_len]; for(j=0;j path[t_tem[i][t_des]][j]=ljtem[t_tem[i][t_src]][j]; path[t_tem[i][t_des]][pthsym]=t_tem[i][t_in]; } if(pthsym>16) outfull=1; pthsym++; } voidwridata(){ inti,j,icout,equcout; icout=0; equcout=0; for(i=0;i for(j=0;j if(path[j][i]==path[j+1][i]) equcout++; if(equcout==stalen-1){ myout[myoutsym++]=path[0][i]; icout++; equcout=0; } else break; } if(icout! =0){ for(i=0;i for(j=0;j path[j][i]=path[j][i+icout]; } } pthsym=pthsym-icout; outfull=0; } voidwritdataedn(void){ inti,j; i=0; for(j=1;j if(calpath[i]>calpath[j]) i=j; for(j=0;j myout[myoutsym++]=path[i][j]; } voidviterbit(){ FILE*fp_input,*fp_output; if(! (fp_input=fopen("","r"))==1){ cout<<"failedtoopen"< exit(0); } else cout<<"weopenedtheoutput_file"< if(! (fp_output=fopen("","w+"))==1){ cout<<"failedtoopenoutput_file"< exit(0); } else cout<<"weopenedthe"< charch; intcount=0; inti,j; charwch; intwcout=0; intmybit[8]; ch=fgetc(fp_input); chartobits(ch,mybit); for(i=0;i<8;i++) myin[i]=mybit[i]; while(feof(fp_input)==0){ ch=fgetc(fp_input); //cout<<"输入"< /*cout<<"输入数据1为"< for(temi=0;temi<8;temi++) cout< cout< if(count==0){ chartobits(ch,mybit); for(i=0;i<8;i++) myin[i+8]=mybit[i]; initpath(); for(j=myn-1;j<8;j=j++) selpath(myin[2*j],myin[2*j+1]); } else{ chartobits(ch,myin); for(j=0;j<4;j++) selpath(myin[2*j],myin[2*j+1]); } count++; if(count==0) count=1; //if(outfull==1) wridata(); if(myoutsym>=8){ wcout=int(myoutsym/8); for(i=0;i for(j=0;j<8;j++) mybit[j]=myout[8*i+j]; wch=bitstochar(mybit); //cout<<"输出为"< fputc(wch,fp_output); } for(i=0;i myout[i]=myout[wcout*8+i]; myoutsym=myoutsym-wcout*8; } } writdataedn(); if(myoutsym>=3){ for(i=0;i<8-myoutsym;i++) myout[myoutsym++]=0; wch=bitstochar(myout); fputc(wch,fp_output); } fclose(fp_input); fclose(fp_output); cout<<"inputanyintegertoend"< cin>>i; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 译码 程序