一般信道容量迭代算法c语言,(信息论编码)信道容量迭代算法

#include

#include

#include

void main()

{

register int i,j;

register int k;

int r,s;                     /*信道矩阵的行数和列数*/

float *p=NULL;

float *q=NULL;

float *d=NULL;

float *a=NULL;

float **p_ji=NULL;           /*二维数组p_yx存放信道矩阵*/

float C,u,max,t,IU;         /*C为信道容量*/

printf("the number of input information source:\nr=");   /*输入行数和列数*/

scanf("%d",&r);

printf("the number of output information source:\ns=");

scanf("%d",&s);

p=(float *)calloc(r,sizeof(float));                   /*初始化需要用到的数组*/

q=(float *)calloc(r,sizeof(float));

d=(float *)calloc(r,sizeof(float));

a=(float *)calloc(r,sizeof(float));

p_ji=(float **)calloc(r,sizeof(float));

for(i=0;i

p_ji[i]=(float *)calloc(r,sizeof(float));

printf("Please matrix of channel:\n");   /*输入信道矩阵*/

for(i=0;i

{

for(j=0;j

{

printf("p_ji[%d][%d]=",i,j);

scanf("%f",&p_ji[i][j]);

}

printf("\n");

}

for(i=0;i

{

t=0.0;

for(j=0;j

t=t+p_ji[i][j];

if(t<=0.999999||t>=1.000001)

{

printf("Error!");

exit(-1);

}

}

for(i=0;i

p[i]=1.0/r;

for(j=0;j

{

q[j]=0;

for (i=0;i

q[j]=q[j]+p[i]*p_ji[i][j];

}

for(i=0;i

{

d[i]=0;

for(j=0;j

{

if(p_ji[i][j]==0)

d[i]=d[i]+0;

else

d[i]=d[i]+p_ji[i][j]*log(p_ji[i][j]/q[j]);

}

a[i]=exp(d[i]);

}

u=0.0;

for(i=0;i

u=u+p[i]*a[i];

C=log(u)/log(2.0);

max=a[0];

for(i=0;i

{

if(a[i]>=max)

max=a[i];

}

IU=log(max)/log(2.0);  /*计算IU*/

k=1;

while((IU-C)>=10e-6)       /*迭代计算*/

{      /*计算最佳输入分布p[i]*/

for(i=0;i

p[i]=p[i]*a[i]/u;

for(j=0;j

{

q[j]=0;

for (i=0;i

q[j]=q[j]+p[i]*p_ji[i][j];

}

for(i=0;i

{

d[i]=0;

for(j=0;j

{

if(p_ji[i][j]==0)

d[i]=d[i]+0;

else

d[i]=d[i]+p_ji[i][j]*log(p_ji[i][j]/q[j]);

}

a[i]=exp(d[i]);

}

u=0.0;

for(i=0;i

u=u+p[i]*a[i];

C=log(u)/log(2.0);     /*计算IL*/

max=a[0];

for(i=0;i

{

if(a[i]>=max)

max=a[i];

}

IU=log(max)/log(2.0);  /*计算IU*/

k=k+1;

}

printf("The matrix of channel is:\n"); /*输出信道矩阵*/

for(i=0;i

{

for(j=0;j

printf("%.3f   ",p_ji[i][j]);

printf("\n");

}

printf("The iteration number is:\nk=%d\n",k);     /*输出迭代次数*/

printf("The best input probability distribution is:\n");  /*计算输出信源的概率分布q[j]*/

for(i=0;i

printf("%.3f   ",q[i]);

printf("\nThe capacity of the channel is:\nC=%fbit/symbol\n",C); /*输出信道容量*/

printf("The best input probability distribution is:\n");     /*输出最佳输入分布*/

for(i=0;i

printf("%.3f   ",p[i]);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值