维特比译码程序.docx

上传人:b****4 文档编号:3936887 上传时间:2022-11-26 格式:DOCX 页数:13 大小:16.73KB
下载 相关 举报
维特比译码程序.docx_第1页
第1页 / 共13页
维特比译码程序.docx_第2页
第2页 / 共13页
维特比译码程序.docx_第3页
第3页 / 共13页
维特比译码程序.docx_第4页
第4页 / 共13页
维特比译码程序.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

维特比译码程序.docx

《维特比译码程序.docx》由会员分享,可在线阅读,更多相关《维特比译码程序.docx(13页珍藏版)》请在冰豆网上搜索。

维特比译码程序.docx

维特比译码程序

(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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1