找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2835|回复: 0
打印 上一主题 下一主题
收起左侧

(信息论编码)信道容量迭代算法

[复制链接]
跳转到指定楼层
楼主
ID:105323 发表于 2016-2-23 01:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  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;                     /*信道矩阵的行数和列数*/
  9. float *p=NULL;
  10. float *q=NULL;
  11. float *d=NULL;
  12. float *a=NULL;
  13. float **p_ji=NULL;           /*二维数组p_yx存放信道矩阵*/
  14. float C,u,max,t,IU;         /*C为信道容量*/
  15. printf("the number of input information source:\nr=");   /*输入行数和列数*/
  16. scanf("%d",&r);
  17. printf("the number of output information source:\ns=");
  18. scanf("%d",&s);

  19. p=(float *)calloc(r,sizeof(float));                   /*初始化需要用到的数组*/
  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++)                       /*计算输出信源概率分布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++)   /*计算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++)   /*计算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);  /*计算IU*/

  78. k=1;
  79. while((IU-C)>=10e-6)       /*迭代计算*/
  80. {      /*计算最佳输入分布p[i]*/
  81.   for(i=0;i<r;i++)
  82.        p[i]=p[i]*a[i]/u;
  83.      for(j=0;j<s;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++)     /*计算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++)        /*计算u*/
  103.         u=u+p[i]*a[i];
  104.      C=log(u)/log(2.0);     /*计算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);  /*计算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);     /*输出迭代次数*/
  122. printf("The best input probability distribution is:\n");  /*计算输出信源的概率分布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. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表