📄 turbo_arq.cpp
字号:
//Turbo encoder
void decoding()
{
int i,j,k,iter,ss;
int cc1[20],cc2[20],cc3[20],cc4[20],cc5[20],cc6[20];
float ld[20][500],lh1[50][500],sign1[50][500],sign2[20][500];
float gamma1[2500][50],gamma2[2500][50],gammae1[2500][50],gammae2[2500][50];
float dgamma1[2500][50],dgamma2[2500][50],dgammae1[2500][50],dgammae2[2500][50];
float aldev[5000],daldev[5000],ipunc3[2000];
//Trellis state
//uk=0
for(ss=1;ss<9;ss++)
cc1[ss]=-1;
for(ss=1;ss<3;ss++)
cc2[ss]=-1;
for(ss=3;ss<7;ss++)
cc2[ss]=1;
for(ss=7;ss<9;ss++)
cc2[ss]=-1;
for(ss=1;ss<5;ss++)
cc3[ss]=-1;
for(ss=5;ss<9;ss++)
cc3[ss]=1;
//uk=1
for(ss=1;ss<9;ss++)
cc4[ss]=1;
for(ss=1;ss<3;ss++)
cc5[ss]=1;
for(ss=7;ss<9;ss++)
cc5[ss]=1;
for(ss=3;ss<7;ss++)
cc5[ss]=-1;
for(ss=1;ss<5;ss++)
cc6[ss]=1;
for(ss=5;ss<9;ss++)
cc6[ss]=-1;
iter=1;
//first extrinsic values must be set to zero in intial
for(i=1;i<m+1;i++)
pred[1][i]=0;
while(iter<9)
{
//first MAP decoder
for(pun=0;pun<m;pun+=mm)
{
//uk=0
for(i=1;i<m+1;i++);
{
Lre2[i+pun]=pred[iter][i+pun]; //extrinsic values from the second decoder
for(ss=0;ss<9;ss++)
{
gamma1[i+pun][ss]=exp(0.5*(Lre2[i+pun]*cc1[ss]+dpunc1[i+pun]*cc1[ss]
+dpunc2[i+pun]*cc2[ss]+dpunc3[i+pun]*cc3[ss]));
gammae1[i+pun][ss]=exp(0.5*(dpunc2[i+pun]*cc2[ss]+dpunc3[i+pun]*cc3[ss]));
}
}
//uk=1
for(i=1;i<m+1;i++)
{
for(ss=0;ss<9;ss++)
{
gamma2[i+pun][ss]=exp(0.5*(Lre2[i+pun]*cc4[ss]+dpunc1[i+pun]*cc4[ss]
+dpunc2[i+pun]*cc5[ss]+dpunc3[i+pun]*cc6[ss]));
gammae2[i+pun][ss]=exp(0.5*(dpunc2[i+pun]*cc5[ss]+dpunc3[i+pun]*cc6[ss]));
}
}
//Forward condition probability alpha
alpha[0+pun][1]=1;
for(ss=2;ss<9;ss++)
alpha[0+pun][ss]=0;
for(i=1;i<m+1;i++)
{
aldev[i+pun]=(alpha[i-1+pun][1]*(gamma1[i+pun][1]+gamma2[i+pun][1])
+alpha[i-1+pun][2]*(gamma1[i+pun][2]+gamma2[i+pun][2])
+alpha[i-1+pun][3]*(gamma1[i+pun][3]+gamma2[i+pun][3])
+alpha[i-1+pun][4]*(gamma1[i+pun][4]+gamma2[i+pun][4])
+alpha[i-1+pun][5]*(gamma1[i+pun][5]+gamma2[i+pun][5])
+alpha[i-1+pun][6]*(gamma1[i+pun][6]+gamma2[i+pun][6])
+alpha[i-1+pun][7]*(gamma1[i+pun][7]+gamma2[i+pun][7])
+alpha[i-1+pun][8]*(gamma1[i+pun][8]+gamma2[i+pun][8]));
alpha[i+pun][1]=(alpha[i-1+pun][1]*gamma1[i+pun][1]+alpha[i-1+pun][2]*gamma2[i+pun][2])/aldev[i+pun];
alpha[i+pun][2]=(alpha[i-1+pun][4]*gamma1[i+pun][4]+alpha[i-1+pun][3]*gamma2[i+pun][3])/aldev[i+pun];
alpha[i+pun][3]=(alpha[i-1+pun][5]*gamma1[i+pun][5]+alpha[i-1+pun][6]*gamma2[i+pun][6])/aldev[i+pun];
alpha[i+pun][4]=(alpha[i-1+pun][8]*gamma1[i+pun][8]+alpha[i-1+pun][7]*gamma2[i+pun][7])/aldev[i+pun];
alpha[i+pun][5]=(alpha[i-1+pun][2]*gamma1[i+pun][2]+alpha[i-1+pun][1]*gamma2[i+pun][1])/aldev[i+pun];
alpha[i+pun][6]=(alpha[i-1+pun][3]*gamma1[i+pun][3]+alpha[i-1+pun][4]*gamma2[i+pun][4])/aldev[i+pun];
alpha[i+pun][7]=(alpha[i-1+pun][6]*gamma1[i+pun][6]+alpha[i-1+pun][5]*gamma2[i+pun][5])/aldev[i+pun];
alpha[i+pun][8]=(alpha[i-1+pun][7]*gamma1[i+pun][7]+alpha[i-1+pun][8]*gamma2[i+pun][8])/aldev[i+pun];
}
//backward condition probability beta
for(ss=1;ss<9;ss++)
beta[mm+pun][ss]=0.125;
for(i=mm-1;i>0;i--)
{
beta[i+pun][1]=(beta[i+1+pun][1]*gamma1[i+1+pun][1]+beta[i+1+pun][5]*gamma2[i+1+pun][1])/aldev[i+1+pun];
beta[i+pun][2]=(beta[i+1+pun][5]*gamma1[i+1+pun][2]+beta[i+1+pun][1]*gamma2[i+1+pun][2])/aldev[i+1+pun];
beta[i+pun][3]=(beta[i+1+pun][6]*gamma1[i+1+pun][3]+beta[i+1+pun][2]*gamma2[i+1+pun][3])/aldev[i+1+pun];
beta[i+pun][4]=(beta[i+1+pun][2]*gamma1[i+1+pun][4]+beta[i+1+pun][6]*gamma2[i+1+pun][4])/aldev[i+1+pun];
beta[i+pun][5]=(beta[i+1+pun][3]*gamma1[i+1+pun][5]+beta[i+1+pun][7]*gamma2[i+1+pun][5])/aldev[i+1+pun];
beta[i+pun][6]=(beta[i+1+pun][7]*gamma1[i+1+pun][6]+beta[i+1+pun][3]*gamma2[i+1+pun][6])/aldev[i+1+pun];
beta[i+pun][7]=(beta[i+1+pun][8]*gamma1[i+1+pun][7]+beta[i+1+pun][4]*gamma2[i+1+pun][7])/aldev[i+1+pun];
beta[i+pun][8]=(beta[i+1+pun][4]*gamma1[i+1+pun][8]+beta[i+1+pun][8]*gamma2[i+1+pun][8])/aldev[i+1+pun];
}
//the log a posteriori operations
//uk=0
for(i=1;i<mm+1;i++)
{
sigma1[i+pun][1]=alpha[i-1+pun][1]*gammae1[i+pun][1]*beta[i+pun][1];
sigma1[i+pun][2]=alpha[i-1+pun][4]*gammae1[i+pun][4]*beta[i+pun][2];
sigma1[i+pun][3]=alpha[i-1+pun][5]*gammae1[i+pun][5]*beta[i+pun][3];
sigma1[i+pun][4]=alpha[i-1+pun][8]*gammae1[i+pun][8]*beta[i+pun][4];
sigma1[i+pun][5]=alpha[i-1+pun][2]*gammae1[i+pun][2]*beta[i+pun][5];
sigma1[i+pun][6]=alpha[i-1+pun][3]*gammae1[i+pun][3]*beta[i+pun][6];
sigma1[i+pun][7]=alpha[i-1+pun][6]*gammae1[i+pun][6]*beta[i+pun][7];
sigma1[i+pun][8]=alpha[i-1+pun][7]*gammae1[i+pun][7]*beta[i+pun][8];
}
//uk=1
for(i=1;i<mm+1;i++)
{
sigma2[i+pun][1]=alpha[i-1+pun][2]*gammae2[i+pun][2]*beta[i+pun][1];
sigma2[i+pun][2]=alpha[i-1+pun][3]*gammae2[i+pun][3]*beta[i+pun][2];
sigma2[i+pun][3]=alpha[i-1+pun][6]*gammae2[i+pun][6]*beta[i+pun][3];
sigma2[i+pun][4]=alpha[i-1+pun][7]*gammae2[i+pun][7]*beta[i+pun][4];
sigma2[i+pun][5]=alpha[i-1+pun][1]*gammae2[i+pun][1]*beta[i+pun][5];
sigma2[i+pun][6]=alpha[i-1+pun][4]*gammae2[i+pun][4]*beta[i+pun][6];
sigma2[i+pun][7]=alpha[i-1+pun][5]*gammae2[i+pun][5]*beta[i+pun][7];
sigma2[i+pun][8]=alpha[i-1+pun][8]*gammae2[i+pun][8]*beta[i+pun][8];
}
//extrinsic value by the log a posteriori probability ratio
for(i=1;i<mm+1;i++)
{
Lre1[i+pun]=log(sigma2[i+pun][1]+sigma2[i+pun][2]+sigma2[i+pun][3]+
sigma2[i+pun][4]+sigma2[i+pun][5]+sigma2[i+pun][6]+
sigma2[i+pun][7]+sigma2[i+pun][8])-log(sigma1[i+pun][1]+sigma1[i+pun][2]+
sigma1[i+pun][3]+sigma1[i+pun][4]+sigma1[i+pun][5]+sigma1[i+pun][6]+
sigma1[i+pun][7]+sigma1[i+pun][8]);
}
}
//interleaving (dounc1,Lre12)
sranint();
for(i=1;i<m+1;i++)
{
indat[i-1]=dpunc1[i];
slre[i-1]=Lre1[i];
}
for(i=0;i<m;i++)
{
sintv[i]=indat[index[i]];
smlre[i]=slre[index[i]];
}
for(i=0;i<m;i++)
{
intv1[i+1]=sintv[i]; //information bits interleaved
Lre12[i+1]=smlre[i]; //extrinsic values interleaved
}
//second MAP decoder
for(pun=0;pun<m;pun+=mm)
{
//transition probability gamma when uk=0
for(i=1;i<mm+1;i++)
{
for(ss=1;ss<9;ss++)
{
dgamma1[i+pun][ss]=exp(0.5*(Lre12[i+pun]*cc1[ss]+intv1[i+pun]*cc1[ss]+dpunc4[i+pun]*cc2[ss]
+dpunc5[i+pun]*cc3[ss]));
dgammae1[i+pun][ss]=exp(0.5*(dpunc4[i+pun]*cc2[ss]+dpunc5[i+pun]*cc3[ss]));
}
}
//transition probalitity gamma when uk=1
for(i=1;i<mm+1;i++)
{
for(ss=1;ss<9;ss++)
{
dgamma2[i+pun][ss]=exp(0.5*(Lre12[i+pun]*cc4[ss]+intv1[i+pun]*cc4[ss]+dpunc4[i+pun]*cc5[ss]
+dpunc5[i+pun]*cc6[ss]));
dgammae2[i+pun][ss]=exp(0.5*(dpunc4[i+pun]*cc5[ss]+dpunc5[i+pun]*cc6[ss]));
}
}
//forward conditional probability alpha
dalpha[0+pun][1]=1;
for(ss=2;ss<9;ss++)
dalpha[0+pun][ss]=0;
for(i=1;i<mm+1;i++)
{
daldev[i+pun]=(dalpha[i-1+pun][1]*(dgamma1[i+pun][1]+dgamma2[i+pun][1])
+dalpha[i-1+pun][2]*(dgamma1[i+pun][2]+dgamma2[i+pun][2])
+dalpha[i-1+pun][3]*(dgamma1[i+pun][3]+dgamma2[i+pun][3])
+dalpha[i-1+pun][4]*(dgamma1[i+pun][4]+dgamma2[i+pun][4])
+dalpha[i-1+pun][5]*(dgamma1[i+pun][5]+dgamma2[i+pun][5])
+dalpha[i-1+pun][6]*(dgamma1[i+pun][6]+dgamma2[i+pun][6])
+dalpha[i-1+pun][7]*(dgamma1[i+pun][7]+dgamma2[i+pun][7])
+dalpha[i-1+pun][8]*(dgamma1[i+pun][8]+dgamma2[i+pun][8]));
dalpha[i+pun][1]=(dalpha[i-1+pun][1]*dgamma1[i+pun][1]
+dalpha[i-1+pun][2]*dgamma2[i+pun][2])/daldev[i+pun];
dalpha[i+pun][2]=(dalpha[i-1+pun][4]*dgamma1[i+pun][4]
+dalpha[i-1+pun][3]*dgamma2[i+pun][3])/daldev[i+pun];
dalpha[i+pun][3]=(dalpha[i-1+pun][5]*dgamma1[i+pun][5]
+dalpha[i-1+pun][6]*dgamma2[i+pun][6])/daldev[i+pun];
dalpha[i+pun][4]=(dalpha[i-1+pun][8]*dgamma1[i+pun][8]
+dalpha[i-1+pun][7]*dgamma2[i+pun][7])/daldev[i+pun];
dalpha[i+pun][5]=(dalpha[i-1+pun][2]*dgamma1[i+pun][2]
+dalpha[i-1+pun][1]*dgamma2[i+pun][1])/daldev[i+pun];
dalpha[i+pun][6]=(dalpha[i-1+pun][3]*dgamma1[i+pun][3]
+dalpha[i-1+pun][4]*dgamma2[i+pun][4])/daldev[i+pun];
dalpha[i+pun][7]=(dalpha[i-1+pun][6]*dgamma1[i+pun][6]
+dalpha[i-1+pun][5]*dgamma2[i+pun][5])/daldev[i+pun];
dalpha[i+pun][8]=(dalpha[i-1+pun][7]*dgamma1[i+pun][7]
+dalpha[i-1+pun][8]*dgamma2[i+pun][8])/daldev[i+pun];
}
//backward conditional probability beta
for(ss=1;ss<9;ss++)
dbeta[mm+pun][ss]=0.125;
for(i=mm-1;i>0;i--)
{
dbeta[i+pun][1]=(dbeta[i+1+pun][1]*dgamma1[i+1+pun][1]
+dbeta[i+1+pun][5]*dgamma2[i+1+pun][1])/daldev[i+1+pun];
dbeta[i+pun][2]=(dbeta[i+1+pun][5]*dgamma1[i+1+pun][2]
+dbeta[i+1+pun][1]*dgamma2[i+1+pun][2])/daldev[i+1+pun];
dbeta[i+pun][3]=(dbeta[i+1+pun][6]*dgamma1[i+1+pun][3]
+dbeta[i+1+pun][2]*dgamma2[i+1+pun][3])/daldev[i+1+pun];
dbeta[i+pun][4]=(dbeta[i+1+pun][2]*dgamma1[i+1+pun][4]
+dbeta[i+1+pun][6]*dgamma2[i+1+pun][4])/daldev[i+1+pun];
dbeta[i+pun][5]=(dbeta[i+1+pun][3]*dgamma1[i+1+pun][5]
+dbeta[i+1+pun][7]*dgamma2[i+1+pun][5])/daldev[i+1+pun];
dbeta[i+pun][6]=(dbeta[i+1+pun][7]*dgamma1[i+1+pun][6]
+dbeta[i+1+pun][3]*dgamma2[i+1+pun][6])/daldev[i+1+pun];
dbeta[i+pun][7]=(dbeta[i+1+pun][8]*dgamma1[i+1+pun][7]
+dbeta[i+1+pun][4]*dgamma2[i+1+pun][7])/daldev[i+1+pun];
dbeta[i+pun][8]=(dbeta[i+1+pun][4]*dgamma1[i+1+pun][8]
+dbeta[i+1+pun][8]*dgamma2[i+1+pun][8])/daldev[i+1+pun];
}
//log a posteriori operation
//uk=0
for(i=1;i<mm+1;i++)
{
dsigma1[i+pun][1]=dalpha[i-1+pun][1]*dgammae1[i+pun][1]*dbeta[i+pun][1];
dsigma1[i+pun][2]=dalpha[i-1+pun][4]*dgammae1[i+pun][4]*dbeta[i+pun][2];
dsigma1[i+pun][3]=dalpha[i-1+pun][5]*dgammae1[i+pun][5]*dbeta[i+pun][3];
dsigma1[i+pun][4]=dalpha[i-1+pun][8]*dgammae1[i+pun][8]*dbeta[i+pun][4];
dsigma1[i+pun][5]=dalpha[i-1+pun][2]*dgammae1[i+pun][2]*dbeta[i+pun][5];
dsigma1[i+pun][6]=dalpha[i-1+pun][3]*dgammae1[i+pun][3]*dbeta[i+pun][6];
dsigma1[i+pun][7]=dalpha[i-1+pun][6]*dgammae1[i+pun][6]*dbeta[i+pun][7];
dsigma1[i+pun][8]=dalpha[i-1+pun][7]*dgammae1[i+pun][7]*dbeta[i+pun][8];
}
//uk=1
for(i=1;i<mm+1;i++)
{
dsigma2[i+pun][1]=dalpha[i-1+pun][2]*dgammae2[i+pun][2]*dbeta[i+pun][1];
dsigma2[i+pun][2]=dalpha[i-1+pun][3]*dgammae2[i+pun][3]*dbeta[i+pun][2];
dsigma2[i+pun][3]=dalpha[i-1+pun][6]*dgammae2[i+pun][6]*dbeta[i+pun][3];
dsigma2[i+pun][4]=dalpha[i-1+pun][7]*dgammae2[i+pun][7]*dbeta[i+pun][4];
dsigma2[i+pun][5]=dalpha[i-1+pun][1]*dgammae2[i+pun][1]*dbeta[i+pun][5];
dsigma2[i+pun][6]=dalpha[i-1+pun][4]*dgammae2[i+pun][4]*dbeta[i+pun][6];
dsigma2[i+pun][7]=dalpha[i-1+pun][5]*dgammae2[i+pun][5]*dbeta[i+pun][7];
dsigma2[i+pun][8]=dalpha[i-1+pun][8]*dgammae2[i+pun][8]*dbeta[i+pun][8];
}
//extrinsic values at the second decoder by the log a posteriori probability ratio
for(i=1;i<mm+1;i++)
{
Lre21[i+pun]=log(dsigma2[i+pun][1]+dsigma2[i+pun][2]+dsigma2[i+pun][3]+
dsigma2[i+pun][4]+dsigma2[i+pun][5]+dsigma2[i+pun][6]+
dsigma2[i+pun][7]+dsigma2[i+pun][8])-log(dsigma1[i+pun][1]+
dsigma1[i+pun][2]+dsigma1[i+pun][3]+dsigma1[i+pun][4]+dsigma1[i+pun][5]+
dsigma1[i+pun][6]+dsigma1[i+pun][7]+dsigma1[i+pun][8]);
}
}
//deinterleaving
sranint();
for(i=1;i<m+1;i++)
slre21[i-1]=Lre21[i];
for(i=0;i<m;i++)
sran[index[i]]=slre21[i];
for(i=0;i<m;i++)
{
Le21[i+1]=sran[i];
}
iter++; //increment the number of iteration
for(i=1;i<m+1;i++)
pred[iter][i]=Le21[i]; //introduced extrinsic values fron decoder2 to decoder1
}//end of iteration routine
//final decision
for(i=1;i<m+1;i++)
{
Lre[i]=dpunc1[i]+Lre1[i]+Le21[i];
final[i-1]=Lre[i];
}
for(i=0;i<m;i++)
{
if(final[i]>0)
decision[i]=1;
if(final[i]<0)
decision[i]=0;
}
//counting bit errors in a frame
error1=0;
for(i=0;i<m;i++)
{
if(y[i]!=decision[i])
error1=error1+1;
zz[j][i]=decision[i]; //data for crc decoder
}
//check and count if a frame has error
celer=0.0;
if(error1!=0)
celer=celer+1;
}
//CRC decoder and ARQ processor
void cdecode()
{
int i,j;
int s[17];
for(j=si;j<w-ei;j++)//si=0,w=1,ei=0
{
//windows size is set to 1
for(dc=1;dc<n+1;dc++)//n=368
{
//start of residue generation
if(zz[j][0]==1)
{
for(i=0;i<kk;i++) //kk=17
s[i]=zz[j][i]^p[i];
for(i=0;i<kk;i++)
zz[j][i]=s[i+1];
for(i=kk;i<m;i++) //m=384
zz[j][i-1]=zz[j][i];
}
else if(zz[j][0]==0)
{
for(i=0;i<kk;i++)
zz[j][i]=zz[j][i+1];
for(i=kk;i<m;i++)
zz[j][i-1]=zz[j][i];
}
}
//end of residue generation at decoder
}
}
//ARQ process
void selective()
{
int i,j;
int bk=0;
for(j=0;j<w;j++)//w=1
{
//windows size
for(i=0;i<kk-1;i++)
{
if(zz[j][i]!=0)
{
//check if the snydrome is '0'
done=0; //retransmission requested if the snydrome is not '0'
dd++; //increment the order of a frame for parity bits
vc=vc+1; //count the number of frames transmitted
if(dd==5)
dd=1; //back to source information after the parent code rate is used
break;
}
else if(zz[j][i]==0)
bk=bk+1; //check 16 bits in the snydrome
}
}
//the number of retransmission is limited to 3
if(bk==16||vc>4)
done=1; //do not request retransmission if the snydrome is zero
if(vc>4)
vc=4;
}
//Random data generation
//generation of float random data from 0 to 1
double rnd(void)
{
return(1.0/(RAND_MAX+1.0))*(rand()+0.5);
}
//guassian random data generatiom
double norndl(void)
{
static int i=0;
static int temp,u;
if(i==0)
{
i++;
temp=sqrt(-2*log(rnd()));
u=2*PI*rnd();
return temp*cos(u);
}
else
{
i=0;
return temp*sin(u);
}
}
//s-random interleaving
//double sranint(void)
void sranint(void)
{
int i,j,k;
ii=0;
idex1=1;
tt=0;
//selected interleaver parameters from n to 5
while(idex1<17)
{
//representing 16 rows in a block size of 512 positions
//initialize MSBs and LSBs
for(i=1;i<5;i++)
sy[i]=0; //set 4 bits of MSBs to 0
sy[0]=1; //add '1' to MSBs
for(i=0;i<5;i++)
lsb[i]=0; //initialize LSBs
idex=0; //first column in a row
while(idex<32)
{
//representing 32 rows in a block size of 512 positions
count=(idex1+invalue[idex])%16; //16 modular operation
for(i=0;i<9;i++)
sz[i]=0; //initialize (n+5) bits
k=1;
//multiply and select nLSBs
while(k<=count)
{
for(i=1;i<4;i++)
sy[i]=0;
sy[0]=1;
for(j=0;j<3;j++)
{
if(sz[0+j]==1&&sy[0+j]==1)
sy[1+j]=1;
}
for(i=0;i<4;i++)
{
sz[i]=sz[i]^sy[i];
}
k++;
}
//bit reverse of LSBs
for(i=0;i<5;i++)
reverse[8-i]=lsb[i];
for(i=0;i<4;i++)
reverse[i]=sz[i];
sz1[idex+tt]=0;
//transfor the value of modular 2 to decimal value
for(i=0;i<9;i++)
{
sz1[idex+tt]=sz1[idex+tt]+reverse[i]*pow(2,i);
}
//decide the output address
if(sz1[idex+tt]<m)
{
index[ii]=sz1[idex+tt];
ii++;
}
//LSBs for the next column
for(i=1;i<5;i++)
syy[i]=0;
syy[0]=1;
for(j=0;j<4;j++)
{
if(lsb[0+j]==1&&syy[0+j]==1)
syy[1+j]=1;
}
for(i=0;i<5;i++)
{
lsb[i]=lsb[i]^syy[i];
//return lsb[i];
}
idex++; //increment the order of column
} //end of a column operation with the table index
tt=tt+32;
idex1++; //increment the order of row
}
//return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -