(n,k,N)卷积码的维特比译码算法实现#include<iostream>#define t_src 0#define t_des 1#define t_len 2#define t_flag 3#define t_in 4using 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<N<9)"<<endl;cin>>myn;stalen=int(pow(2.0,myn-1));cout<<"选择默认的编码矢量则输入1,输入2则可输入其他的编码矢量"<<endl;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"<<endl;for(j=0;j<myn;j++)cin>>myg1[j];cout<<"输入g2"<<endl;for(j=0;j<myn;j++)cin>>myg2[j];}cout<<"连接矢量1为"<<endl;for(j=0;j<myn;j++)cout<<myg1[j]<<" ";cout<<endl;cout<<"连接矢量2为"<<endl;for(j=0;j<myn;j++)cout<<myg2[j]<<" ";cout<<endl;cout<<"stalen: "<<stalen;cout<<endl;}void creatsta(void){int i,j,k,myi;int tembits[10];for(i=0;i<stalen;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<myn;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<myn;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<myn;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<myn;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<<"状态转移出"<<endl;for(i=0;i<stalen;i++)cout<<stachn[i][0]<<","<<stachn[i][1]<<" ";cout<<endl;cout<<"输入0状态转移后的输出"<<endl;for(i=0;i<stalen;i++)cout<<stan0[i][0]<<","<<stan0[i][1]<<" ";cout<<endl;cout<<"输入1状态转移后的输出"<<endl;for(i=0;i<stalen;i++)cout<<stan1[i][0]<<","<<stan1[i][1]<<" ";cout<<endl;}void chartobits(char ch,int *bits){int i;for(i=0;i<8;i++){if(ch<0)bits[i]=1;elsebits[i]=0;ch=ch<<1;}}char bitstochar(int *bits){char temp=0;int i;for(i=0;i<8;i++){if(bits[i]==1)temp+=table1[7-i];}return temp;}int calluj(int a1,int a2,int b1,int b2){int y=0;if(a1!=b1)y++;if(a2!=b2)y++;return(y);}void initpath(){int tem;int t_tem[256][5]={0};int i,j,k,l;int ljtem[256][100];int pttem[256]={0};int staflag[256]={0};staflag[0]=1;int a1,a2;for(l=0;l<myn-1;l++){for(i=0;i<stalen;i++)for(j=0;j<pthsym;j++)ljtem[i][j]=path[i][j];i=0;a1=myin[2*l];a2=myin[2*l+1];for(j=0;j<stalen;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<stalen;k++)staflag[k]=0;for(k=0;k<i;k++){staflag[t_tem[k][t_des]]=1;calpath[t_tem[k][t_des]]=t_tem[k][t_len];for(j=0;j<pthsym;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<<"初始化后的路径长度"<<endl;for(int i=0;i<8;i++)cout<<calpath[i]<<" ";cout<<endl;*/}void selpath(int a1,int a2){//16选8int t_tem[512][5]={0};int i,j,tem;int ljtem[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<stalen;i++)for(j=0;j<pthsym;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<pthsym;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++;}void wridata(){int i,j,icout,equcout;icout=0;equcout=0;for(i=0;i<pthsym;i++){for(j=0;j<stalen-1;j++)if(path[j][i]==path[j+1][i])equcout++;if(equcout==stalen-1){myout[myoutsym++]=path[0][i];icout++;equcout=0;}elsebreak;}if(icout!=0){for(i=0;i<pthsym-icout;i++){for(j=0;j<stalen;j++)path[j][i]=path[j][i+icout];}}pthsym=pthsym-icout;outfull=0;}void writdataedn(void){int i,j;i=0;for(j=1;j<stalen;j++)if(calpath[i]>calpath[j])i=j;for(j=0;j<pthsym;j++)myout[myoutsym++]=path[i][j];}void viterbit(){FILE *fp_input,*fp_output;if(!(fp_input=fopen("D://output.txt","r"))==1){cout<<"failed to open output.txt"<<endl;exit(0);}elsecout<<"we opened the output_file "<<endl;if(!(fp_output=fopen("D://myinput.txt","w+"))==1){ cout<<"failed to open output_file"<<endl;exit(0);}elsecout<<"we opened the myinput.txt "<<endl;char ch;int count=0;int i,j;char wch;int wcout=0;int mybit[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<<"输入"<<ch<<" ";/*cout<<"输入数据1为"<<endl;for(temi=0;temi<8;temi++)cout<<myin[temi]<<" ";cout<<endl;*/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<wcout;i++){for(j=0;j<8;j++)mybit[j]=myout[8*i+j];wch=bitstochar(mybit);//cout<<"输出为"<<wch<<" ";fputc(wch,fp_output);}for(i=0;i<myoutsym-wcout*8;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<<"input any integer to end"<<endl;cin>>i;}。