⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uep_qpsk.c

📁 一些纠错编码源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
       } while( s >= 1);       x1 = u1*sqrt((-2.0*log(s))/s);       x2 = u2*sqrt((-2.0*log(s))/s);       /* Received (complex) signal */       rx[i][j] = amp*cos(2*((double)x[j])*pi/4.0) + x1 ;       ry[i][j] = amp*sin(2*((double)x[j])*pi/4.0) + x2 ;       }/*************************************************************************** *                                                                         * *                             DECODING                                    * *                                                                         * ***************************************************************************//* PART (I): Compare with (1111111) --> decode using the lower subtrellis */ /* initialize path metrics */   for(i1=1;i1<=7;i1++)      {      for(jj=1;jj<=trellis3[i1].count;jj++)         {         trellis_metric1[i1].branch[jj].final = 0.0;            trellis_metric1[i1].branch[jj].f[0] = 0.0;            trellis_metric1[i1].branch[jj].f[1] = 0.0;            }       }      for(j=1;j<=7;j++)        {          jj = j - 1;         for(k=1;k<=trellis3[j].count;k++)           {            /* compute metrics for coset[0][1] */           cosetvalue = trellis3[j].outbit1[k].coset[0][1];            /* squared Euclidean distance to received signal */           trellis_metric1[j].branch[k].distance[0] =                (rx[i][jj] - q[0][cosetvalue]) *                    (rx[i][jj] - q[0][cosetvalue])             + (ry[i][jj] - q[1][cosetvalue]) *                    (ry[i][jj] - q[1][cosetvalue]);            trellis_metric1[j].branch[k].final                     = trellis_metric1[j].branch[k].distance[0];		   trellis_metric1[j].branch[k].c12est[0]                    = trellis3[j].outbit1[k].coset[0][1];		   trellis_metric1[j].branch[k].c12est[1]                    = trellis3[j].outbit1[k].coset[0][1];            }         } /* Decode a sequence in the lower subtrellis by the VITERBI ALGORITHM */   surv_final1[0].metric[0] = 0.0;   for(j=1;j<=7;j++)       {       for(iii =0;iii<=1; iii++)         { suv_count1[iii] = 0; }       i1 = j -1;       for(k=1;k<=trellis3[j].count;k++)          {           n = trellis3[j].final_state[k] ;            suv_count1[n] = suv_count1[n] + 1;           m = trellis3[j].initial_state[k];           if(suv_count1[n] == 1)              {               suv1[j].surv_metric[n][0]                       = surv_final1[i1].metric[m] +                              trellis_metric1[j].branch[k].final;              suv1[j].surv_ini[n][0] = trellis3[j].initial_state[k];              suv1[j].surv_out[n][0] = trellis3[j].final_state[k];              suv1[j].est[n][0][0] = trellis_metric1[j].branch[k].c12est[0];              suv1[j].est[n][0][1] = trellis_metric1[j].branch[k].c12est[1];              surv_final1[j].metric[n] = suv1[j].surv_metric[n][0];              surv_final1[j].ini[n] = suv1[j].surv_ini[n][0];              surv_final1[j].final[n] = suv1[j].surv_out[n][0];              surv_final1[j].est[n][0] = suv1[j].est[n][0][0];               surv_final1[j].est[n][1] = suv1[j].est[n][0][1];               }           else               {               suv1[j].surv_metric[n][1]                 		= surv_final1[i1].metric[m] +                      		 trellis_metric1[j].branch[k].final;              suv1[j].surv_ini[n][1] = trellis3[j].initial_state[k];              suv1[j].surv_out[n][1] = trellis3[j].final_state[k];              suv1[j].est[n][1][0] = trellis_metric1[j].branch[k].c12est[0];              suv1[j].est[n][1][1] = trellis_metric1[j].branch[k].c12est[1];              surv_final1[j].metric[n] = suv1[j].surv_metric[n][1];              surv_final1[j].ini[n] = suv1[j].surv_ini[n][1];              surv_final1[j].final[n] = suv1[j].surv_out[n][1];              surv_final1[j].est[n][0] = suv1[j].est[n][1][0];               surv_final1[j].est[n][1] = suv1[j].est[n][1][1];               }           if(suv_count1[n] == 2)              {               if( suv1[j].surv_metric[n][1] >= suv1[j].surv_metric[n][0])                 {                    surv_final1[j].metric[n] = suv1[j].surv_metric[n][0];                 surv_final1[j].ini[n] = suv1[j].surv_ini[n][0];                 surv_final1[j].final[n] = suv1[j].surv_out[n][0];                 surv_final1[j].est[n][0] = suv1[j].est[n][0][0];                  surv_final1[j].est[n][1] = suv1[j].est[n][0][1];                  }              else                  {                    surv_final1[j].metric[n] = suv1[j].surv_metric[n][1];                 surv_final1[j].ini[n] = suv1[j].surv_ini[n][1];                 surv_final1[j].final[n] = suv1[j].surv_out[n][1];                 surv_final1[j].est[n][0] = suv1[j].est[n][1][0];                  surv_final1[j].est[n][1] = suv1[j].est[n][1][1];                  }             }           }    }    min_state = n;    ii = 7;/* Total metric of the surviving sequence in lower subtrellis (coset[0][1]) */    final1 = surv_final1[7].metric[min_state];    while (ii >= 1 )       {        x_estimate[ii].est[0] = surv_final1[ii].est[min_state][0];       x_estimate[ii].est[1] = surv_final1[ii].est[min_state][1];       x_estimate[ii].est[2] = 1;/* INVERSE MAPPING: Recover bits from QPSK signal */ 				test = x_estimate[ii].est[1];				x_estimate[ii].est[1] = 0;				if ( (test == 2) || (test == 3) )					x_estimate[ii].est[1] = 1;        nn = min_state;       min_state = surv_final1[ii].ini[nn];       ii--;       }/* PART (II): Compare with (0000000) --> decode using the upper subtrellis */ /* initialize path metrics */   for(i1=1;i1<=7;i1++)      {      for(jj=1;jj<=trellis3[i1].count;jj++)         {         trellis_metric[i1].branch[jj].final = 0.0;            trellis_metric[i1].branch[jj].f[0] = 0.0;            trellis_metric[i1].branch[jj].f[1] = 0.0;            }       }      for(j=1;j<=7;j++)        {         jj = j - 1;        for(k=1;k<=trellis3[j].count;k++)           {            /* compute metrics for coset[0][0] */           cosetvalue = trellis3[j].outbit1[k].coset[0][0];            /* squared Euclidean distance to received signal */           trellis_metric[j].branch[k].distance[0] =               (rx[i][jj] - q[0][cosetvalue]) *                   (rx[i][jj] - q[0][cosetvalue])             + (ry[i][jj] - q[1][cosetvalue]) *                   (ry[i][jj] - q[1][cosetvalue]);      	   trellis_metric[j].branch[k].final                  = trellis_metric[j].branch[k].distance[0];     	   trellis_metric[j].branch[k].c12est[0]                  				= trellis3[j].outbit1[k].coset[0][0];           trellis_metric[j].branch[k].c12est[1]                                = trellis3[j].outbit1[k].coset[0][0];    	   }        } /* Decode a sequence in the upper subtrellis by the VITERBI ALGORITHM */   surv_final[0].metric[0] = 0.0;   for(j=1;j<=7;j++)       {      for(iii =0;iii<=1; iii++)         { suv_count[iii] = 0; }         i1 = j -1;         for(k=1;k<=trellis3[j].count;k++)          {           n = trellis3[j].final_state[k] ;            suv_count[n] = suv_count[n] + 1;           m = trellis3[j].initial_state[k];           if(suv_count[n] == 1)           {             suv[j].surv_metric[n][0]                 = surv_final[i1].metric[m] +                      trellis_metric[j].branch[k].final;            suv[j].surv_ini[n][0] = trellis3[j].initial_state[k];            suv[j].surv_out[n][0] = trellis3[j].final_state[k];            suv[j].est[n][0][0] = trellis_metric[j].branch[k].c12est[0];            suv[j].est[n][0][1] = trellis_metric[j].branch[k].c12est[1];            surv_final[j].metric[n] = suv[j].surv_metric[n][0];            surv_final[j].ini[n] = suv[j].surv_ini[n][0];            surv_final[j].final[n] = suv[j].surv_out[n][0];            surv_final[j].est[n][0] = suv[j].est[n][0][0];             surv_final[j].est[n][1] = suv[j].est[n][0][1];            }           else            {             suv[j].surv_metric[n][1]                 = surv_final[i1].metric[m] +                      trellis_metric[j].branch[k].final;            suv[j].surv_ini[n][1] = trellis3[j].initial_state[k];            suv[j].surv_out[n][1] = trellis3[j].final_state[k];            suv[j].est[n][1][0] = trellis_metric[j].branch[k].c12est[0];            suv[j].est[n][1][1] = trellis_metric[j].branch[k].c12est[1];            surv_final[j].metric[n] = suv[j].surv_metric[n][1];            surv_final[j].ini[n] = suv[j].surv_ini[n][1];            surv_final[j].final[n] = suv[j].surv_out[n][1];            surv_final[j].est[n][0] = suv[j].est[n][1][0];             surv_final[j].est[n][1] = suv[j].est[n][1][1];            }            if(suv_count[n] == 2)             {                if( suv[j].surv_metric[n][1] >= suv[j].surv_metric[n][0])                 {                    surv_final[j].metric[n] = suv[j].surv_metric[n][0];                 surv_final[j].ini[n] = suv[j].surv_ini[n][0];                 surv_final[j].final[n] = suv[j].surv_out[n][0];                 surv_final[j].est[n][0] = suv[j].est[n][0][0];                  surv_final[j].est[n][1] = suv[j].est[n][0][1];                  }              else                  {                    surv_final[j].metric[n] = suv[j].surv_metric[n][1];                 surv_final[j].ini[n] = suv[j].surv_ini[n][1];                 surv_final[j].final[n] = suv[j].surv_out[n][1];                 surv_final[j].est[n][0] = suv[j].est[n][1][0];                  surv_final[j].est[n][1] = suv[j].est[n][1][1];                  }             }          }    }    min_state = n;    ii = 7;/* Total metric of the surviving sequence in upper subtrellis (coset[0][0]) */    final0 = surv_final[7].metric[min_state];    while (ii >= 1 )       {        x_estimate1[ii].est[0] = surv_final[ii].est[min_state][0];       x_estimate1[ii].est[1] = surv_final[ii].est[min_state][1];       x_estimate1[ii].est[2] = 0;/* INVERSE MAPPING: Recover bits from QPSK signal */        test = x_estimate1[ii].est[1];       x_estimate1[ii].est[1] = 0;       if ( (test == 2) || (test == 3) )          x_estimate1[ii].est[1] = 1;          nn = min_state;          min_state = surv_final[ii].ini[nn];          ii--;          }/* Decoding of a block finished. Count the number of decoding errors */    if( final1 >= final0 )  /* if sequence in the upper subtrellis */       {       if(x_estimate1[1].est[2] != code1[i].first)          {          first_error += 1.0;          }       for(kk=1;kk<=7;kk++)          {          k = kk - 1;          if(x_estimate1[kk].est[1] != code1[i].second[k])             {             second_error += 1.0;             }          }        }        else                   /* if sequence in the lower subtrellis */        {         if(x_estimate[1].est[2] != code1[i].first)            {            first_error += 1.0;            }         for(kk=1;kk<=7;kk++)            {            k = kk - 1;            if(x_estimate[kk].est[1] != code1[i].second[k])               {               second_error += 1.0;               }            }        }     }     error += (second_error + first_error);     error1 += first_error;     error2 += second_error;#ifdef DEBUG2printf("%8d %10.0f %10.0f %10.0f\n", ifinal, first_error, second_error, error);fflush(stdout) ;#endif   }   biterror = error/(NUMSIM*(7*200));    biterr1 = error1/(NUMSIM*200);    biterr2 = error2/(NUMSIM*(6*200));    first_error = NUMSIM*(7*200);   printf("Done... A total of %e bits were transmitted\n", first_error);   printf("error,error1,error2 = %20.0f %20.0f %20.0f\n",error, error1, error2);   printf("Pe  = %20.17e \n", biterror);   printf("Pe1 = %20.17e \n", biterr1);   printf("Pe2 = %20.17e \n", biterr2);   snr = 10*log10(amp*amp/2.0);   printf("Eb/No = %20.10f \n", snr);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -