找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2761|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

(信息論編碼)信道容量迭代算法

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-2-23 01:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>

  4. void main()
  5. {
  6. register int i,j;
  7. register int k;
  8. int r,s;                     /*信道矩陣的行數(shù)和列數(shù)*/
  9. float *p=NULL;
  10. float *q=NULL;
  11. float *d=NULL;
  12. float *a=NULL;
  13. float **p_ji=NULL;           /*二維數(shù)組p_yx存放信道矩陣*/
  14. float C,u,max,t,IU;         /*C為信道容量*/
  15. printf("the number of input information source:\nr=");   /*輸入行數(shù)和列數(shù)*/
  16. scanf("%d",&r);
  17. printf("the number of output information source:\ns=");
  18. scanf("%d",&s);

  19. p=(float *)calloc(r,sizeof(float));                   /*初始化需要用到的數(shù)組*/
  20. q=(float *)calloc(r,sizeof(float));
  21. d=(float *)calloc(r,sizeof(float));
  22. a=(float *)calloc(r,sizeof(float));
  23. p_ji=(float **)calloc(r,sizeof(float));
  24. for(i=0;i<r;i++)
  25. p_ji[i]=(float *)calloc(r,sizeof(float));


  26. printf("Please matrix of channel:\n");   /*輸入信道矩陣*/
  27. for(i=0;i<r;i++)
  28. {
  29.   for(j=0;j<s;j++)
  30.   {
  31.    printf("p_ji[%d][%d]=",i,j);
  32.        scanf("%f",&p_ji[i][j]);
  33.       }
  34.      printf("\n");
  35. }

  36. for(i=0;i<r;i++)   /*判斷輸入的信道矩陣是否符合概率分布*/
  37. {
  38.      t=0.0;
  39.      for(j=0;j<s;j++)
  40.      t=t+p_ji[i][j];
  41.   if(t<=0.999999||t>=1.000001)
  42.      {
  43.       printf("Error!");
  44.            exit(-1);
  45.        }
  46. }

  47. for(i=0;i<r;i++)                       /*取初始概率為均勻分布*/
  48. p[i]=1.0/r;
  49. for(j=0;j<s;j++)                       /*計(jì)算輸出信源概率分布q[j]*/
  50. {
  51.   q[j]=0;
  52.      for (i=0;i<r;i++)
  53.      q[j]=q[j]+p[i]*p_ji[i][j];
  54. }

  55. for(i=0;i<r;i++)   /*計(jì)算a[i]*/
  56. {
  57.   d[i]=0;
  58.   for(j=0;j<s;j++)
  59.   {
  60.    if(p_ji[i][j]==0)
  61.    d[i]=d[i]+0;
  62.       else
  63.       d[i]=d[i]+p_ji[i][j]*log(p_ji[i][j]/q[j]);
  64.   }
  65.   a[i]=exp(d[i]);
  66. }

  67. u=0.0;
  68. for(i=0;i<r;i++)   /*計(jì)算u*/
  69. u=u+p[i]*a[i];
  70. C=log(u)/log(2.0);   
  71. max=a[0];        
  72. for(i=0;i<r;i++)
  73. {
  74.   if(a[i]>=max)
  75.   max=a[i];
  76. }
  77. IU=log(max)/log(2.0);  /*計(jì)算IU*/

  78. k=1;
  79. while((IU-C)>=10e-6)       /*迭代計(jì)算*/
  80. {      /*計(jì)算最佳輸入分布p[i]*/
  81.   for(i=0;i<r;i++)
  82.        p[i]=p[i]*a[i]/u;
  83.      for(j=0;j<s;j++)     /*計(jì)算輸出信源的概率分布q[j]*/
  84.      {
  85.       q[j]=0;
  86.          for (i=0;i<r;i++)
  87.          q[j]=q[j]+p[i]*p_ji[i][j];
  88.      }
  89.      for(i=0;i<r;i++)     /*計(jì)算a[i]*/
  90.      {
  91.       d[i]=0;
  92.       for(j=0;j<s;j++)
  93.       {
  94.        if(p_ji[i][j]==0)
  95.         d[i]=d[i]+0;
  96.           else
  97.         d[i]=d[i]+p_ji[i][j]*log(p_ji[i][j]/q[j]);
  98.       }
  99.        a[i]=exp(d[i]);
  100.      }
  101.      u=0.0;
  102.      for(i=0;i<r;i++)        /*計(jì)算u*/
  103.         u=u+p[i]*a[i];
  104.      C=log(u)/log(2.0);     /*計(jì)算IL*/
  105.        max=a[0];        
  106.      for(i=0;i<r;i++)
  107.      {
  108.       if(a[i]>=max)
  109.    max=a[i];
  110.      }
  111.      IU=log(max)/log(2.0);  /*計(jì)算IU*/
  112.   k=k+1;
  113. }


  114. printf("The matrix of channel is:\n"); /*輸出信道矩陣*/
  115. for(i=0;i<r;i++)
  116. {
  117.   for(j=0;j<s;j++)
  118.   printf("%.3f   ",p_ji[i][j]);
  119.      printf("\n");
  120. }
  121. printf("The iteration number is:\nk=%d\n",k);     /*輸出迭代次數(shù)*/
  122. printf("The best input probability distribution is:\n");  /*計(jì)算輸出信源的概率分布q[j]*/
  123. for(i=0;i<s;i++)
  124. printf("%.3f   ",q[i]);
  125. printf("\nThe capacity of the channel is:\nC=%fbit/symbol\n",C); /*輸出信道容量*/
  126. printf("The best input probability distribution is:\n");     /*輸出最佳輸入分布*/
  127. for(i=0;i<r;i++)
  128. printf("%.3f   ",p[i]);
  129. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表