资源简介
信道容量的迭代算法的C语言实现,可以运行的源代码,可以运行
代码片段和文件信息
#include
#include
#include
#include “unistd.h“
#include “values.h“
#define DELTA 1e-6 /*delta the threshold*/
int main (void)
{
register int ij;
register int k;
int rs;
float*p_i=NULL;
float**p_ji=NULL;
float**phi_ij=NULL;
float CC_prevalidate;
float*sum=NULL;
float p_j;
/* Read the number fof input symbol:rand the number of output symbol:s*/
fscanf(stdin“%d“&r);
fscanf(stdin“%d“&s);
/*allocation memory for p_ip_ji andphi_ij*/
p_i=(float*)calloc(rsizeof(float));
p_ji=(float**)calloc (ssizeof(float));
phi_ij=(float**) calloc (rsizeof(float*));
for(i=0;i p_ji[i]=(float*)calloc(rsizeof (float*));
phi_ij=(float**) calloc(rsizeof (float*));
for(i=0;i phi_ij[i]=(float*) calloc(ssizeof(float));
/*read the channel transition probility matrix p_ji*/
for(i=0;i for(j=0;j fscanf(stdin“%f“&p_ji[i][j]);
/* validate the input data*/
for(i=0;i {
validate=0.0;
for(j=0;j {validate+=p_ji[i][j];
}
if(fabs(validate-1.0)>DELTA)
{fprintf(stdout“invalid input data.\n“);
exit(-1);
}
}
fprintf(stdout“statrt...\n“);
/*initialize the p_i and phi_ij*/
for(i=0;i {p_i[i]=1.0/(float)r;
}
/*initialize C iteration counter : k and temprory variable*/
C=-MAXFLOAT;//MAXFLOAT wos defined in
k=0;
sum=(float*)calloc(rsizeof(float));
/*strat iterate*/
/***********************************************/
do
{
k++;
/*calculate phi_ij(k) first*/
for(j=0;j {p_j=0.0;
for(i=0;i p_j+=p_i[i]*p_ji[i][j];
if(fabs(p_j)>=DELTA)
for(i=0;i phi_ij[i][j]=p_i[i]*p_ji[i][j]/p_j;
else
for(i=0;i phi_ij[i][j]=0.0;
}
/*caculate p_i(k+1) then*/
p_j=0.0;
for(i=0;i {
sum[i]=0.0;
for(j=0;j {/*prevent divided by zero*/
if(fabs(phi_ij[i][j])>DELTA)
sum[i]+=p_ji[i][j]*log(phi_ij[i][j])/log(2.0);
}
sum[i]=pow(2.0sum[i]);
p_j+=sum[i];
}
for(i=0;i {
p_i[i]=sum[i]/p_j;
}
/*and C(k+1)*/
C_pre=C;
C=log(p_j)/log(2.0);
}
while(fabs(C-C_pre)/C>DELTA);
free(sum);
sum=NULL;
/*Output the result*/
fprintf(stdout“The iteration number is %d.\n\n“k);
fprintf(stdout“The capacity of the channel is %.f bit /symbol .\n\n“C);
fprintf(stdout“The best input probality distribution is :\n“);
for(i=0;i fprintf(stdout“%.6f“p_i[i]);
fprintf(stdout“\n“);
/*Free the memory we allocation before with stack sequence*/
for (i=s-1;i>=0;i--)
{
free(phi_ij[i]);
phi_ij[i]=NULL;
}
free(phi_ij);
phi_ij=NULL;
for(i=r-1;i>=0;i--)
{
free(p_ji[i]);
p_ji[i]=NULL;
}
free(p_ji);
p_ji=NULL;
free(p_i);
p_i=NULL;
exit(0);
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 33792 2009-11-25 08:41 ximxilun\Debug\vc60.idb
文件 45056 2009-11-25 08:41 ximxilun\Debug\vc60.pdb
文件 225367 2009-11-25 08:41 ximxilun\Debug\xindao.exe
文件 218728 2009-11-25 08:41 ximxilun\Debug\xindao.ilk
文件 7063 2009-11-25 08:41 ximxilun\Debug\xindao.obj
文件 43520 2009-11-25 08:46 ximxilun\Debug\xindao.opt
文件 269200 2009-11-25 08:32 ximxilun\Debug\xindao.pch
文件 386048 2009-11-25 08:41 ximxilun\Debug\xindao.pdb
文件 201 2008-11-15 19:51 ximxilun\unistd.h
文件 1151 2008-11-15 20:00 ximxilun\values.h
文件 2943 2009-11-25 08:41 ximxilun\xindao.c
文件 3399 2009-11-25 08:29 ximxilun\xindao.dsp
文件 537 2009-11-25 08:46 ximxilun\xindao.dsw
文件 33792 2009-11-25 08:46 ximxilun\xindao.ncb
文件 48640 2009-11-25 08:46 ximxilun\xindao.opt
文件 746 2009-11-25 08:41 ximxilun\xindao.plg
目录 0 2009-11-25 08:46 ximxilun\Debug
目录 0 2009-11-25 08:46 ximxilun
----------- --------- ---------- ----- ----
1320183 18
评论
共有 条评论