维特比译码程序.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:
(3cin>>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;jcin>>myg1[j];
cout<<"输入g2"<for(j=0;jcin>>myg2[j];
}
cout<<"连接矢量1为"<for(j=0;jcout<cout<cout<<"连接矢量2为"<for(j=0;jcout<cout<cout<<"stalen:
"<cout<}
voidcreatsta(void){
inti,j,k,myi;
inttembits[10];
for(i=0;istan1[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;jif(myi>=pow,myn-1-j)){
tembits[j]=1;
myi=myi-pow,myn-1-j);
}
else{
tembits[j]=0;
}
}
for(k=0;kstan0[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;jif(myi>=pow,myn-1-j)){
tembits[j]=1;
myi=myi-pow,myn-1-j);
}
else{
tembits[j]=0;
}
}
for(k=0;kstan1[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;icout<cout<cout<<"输入0状态转移后的输出"<for(i=0;icout<cout<cout<<"输入1状态转移后的输出"<for(i=0;icout<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;lfor(i=0;ifor(j=0;jljtem[i][j]=path[i][j];
i=0;
a1=myin[2*l];
a2=myin[2*l+1];
for(j=0;jif(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;kstaflag[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;jpath[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;ifor(j=0;jljtem[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;jpath[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;ifor(j=0;jif(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;ifor(j=0;jpath[j][i]=path[j][i+icout];
}
}
pthsym=pthsym-icout;
outfull=0;
}
voidwritdataedn(void){
inti,j;
i=0;
for(j=1;jif(calpath[i]>calpath[j])
i=j;
for(j=0;jmyout[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;ifor(j=0;j<8;j++)
mybit[j]=myout[8*i+j];
wch=bitstochar(mybit);
//cout<<"输出为"<fputc(wch,fp_output);
}
for(i=0;imyout[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;
}