信道容量实验报告
正式实验报告二—信道容量计算

一、实验目的1.掌握离散信道的信道容量的计算方法;2.理解不同类型信道的不同特点与不同的计算方法;二、实验内容1.进一步熟悉一般离散信道的信道容量计算方法;2.进一步复习巩信道性质与实际应用;3.学习如何将复杂的公式转化为程序。
三、实验仪器、设备1、计算机-系统最低配置256M内存、P4 CPU;2、MATLAB编程软件。
四、实现原理信道容量是信息传输率的极限,当信息传输率小于信道容量时,通过信道编码,能够实现几乎无失真的数据传输;当数据分布满足最佳分布时,实现信源与信道的匹配,使得信息传输率能够达到信道容量。
本实验利用信道容量的算法,使用计算机完成信道容量的计算。
实验采用迭代算法计算信道容量,即:设DMC的转移概率pyx(i,j),p(i)是任意给定的一组初始给定输入分布,开始为等概率分布,以后逐次迭代更新p(i)的取值。
其所有分量P (i)均不为0。
按照如下方法进行操作:具体方法:1、计算q(j)=ijipyxip),(*)(,pyx(i,j)为信道转移概率2、计算a(i)先算中间变量d(i)=∑jjqjipyxjipyx)(/),(log(*),(然后,a(i)=exp(d(i))3、计算中间变量U=∑iip ia)(*)(4、计算IL=log2(u)5、计算IU=log2(max(a(i))6、当IU-IL>ε(ε为设定的迭代精度)时,进入以下循环,否则输出迭代次数n,信道容量C=IU计算结果,最佳分布p(i)。
①重新计算p(i)=p(i)*a(i)/U②计算q(j),方法同1③计算a(i),方法同2④计算中间变量U=∑iip ia)(*)(⑤计算IL=log2(u)⑥计算IU=log2(max(a(i))⑦计次变量n=n+1返回6判断循环条件是否满足。
五、实验步骤1、计算非对称信道的信道容量运行程序待程序运行完毕,记录迭代次数n和信道容量计算结果C。
2、计算对称信道的信道容量运行程序待程序运行完毕,记录迭代次数n和信道容量计算结果C。
实验二 计算信道容量

PXi[i] = ((PXi[i] * a[i]) / sum);
}
n ++;
}
}while(cap_max-cap_result>= e);
printf("\n\n迭代次数为:%d\n" ,n);
for(i=0;i<X_num;i++)
{
printf("最佳信源概率:%f\n" ,PXi[i]);
}
/**************************************************************************
函数名:double Calculate_cap_result(double PXi[],double a[])
功能:计算并输出迭代法所需的参数cap_result
double Calculate_cap_max(double a[])
{
int i;
double max_a = a[0];
for(i=0;i<X_num;i++)
{
if(a[i] > max_a)
{
max_a = a[i];
}
}
printf("较大值=%f",log(max_a));
return log(max_a);
for(i=0;i<X_num;i++)
{
for(j=0;j<Y_num;j++)
{
printf("P[%d][%d]=",i,j);
scanf("%lf",&P[i][j]);
天线数量对信道条件以及信道容量影响仿真实验

天线数量对信道条件以及信道容量影响仿真实验
天线数量对信道条件和信道容量的影响可以通过仿真实验进行探究。
下面是一种可能的实验设计:
1. 确定模拟环境:选择一种常见的无线通信信道模型,例如Rayleigh衰落信道或者高斯信道。
2. 设置参数:确定通信系统的一些基本参数,如信号频率、传输功率、噪声功率、距离等。
3. 设定信道的起始条件:根据所选的信道模型,设定初始的信道衰落情况。
4. 编写仿真程序:使用编程语言(如Matlab、Python等)编写仿真程序,根据设定的参数和信道模型,模拟信道中的传输过程。
5. 设置不同的天线数量:在程序中通过调整天线数量的参数,比如接收端或发送端的天线数量,来模拟不同的信道条件。
6. 运行仿真实验:运行仿真程序,得到不同天线数量下的信道传输性能指标,如信号强度、信噪比、误码率等。
7. 分析结果:根据实验结果,比较不同天线数量下的信道条件和信道容量的差异。
可以观察到,增加天线数量通常会提高信号强度、提高信噪比,从而提高信道容量。
需要注意的是,在进行仿真实验时,要按照中国法律法规,遵守相关规定,确保不会进行非法的通信行为或其他任何违法行为。
同时,此实验仅涉及技术方面的内容,请勿使用仿真结果从事任何违法行为。
离散无记忆信道的信道容量计算实验报告PPT课件

2.信道容量算法
信道容量是互信息的最大值,首先要将信道容量求极值得问题表示 为二重交替优化问题。
(1)
• 运行结 果
(2)
实验结果(1):输入概率转移矩阵是之前例题中的概率转移矩阵,迭代 次数为11和70次,经验证,迭代程序结果比例题中的一般信道容量算 法更为精确。
实验结果(2):迭代次数为4,迭代结果为1.3219,经验算发现此输入 概率转移矩阵的实际结果为1.329,误差不大,符合要求,另外精度越 高,结果越接近。
离散无记忆信道的迭代运算
一、为什么要迭代?
(*)
(1)解方程组求出的输入分布 {P(x)}可能不唯一,因为可能有多个 极值点;
(2)需要验证求出的输入分布序列 是否符合要求。
(2)从达到DMC的信道容量的充要条件出发:
二、Blahut-Arimoto算法
1.交替优化
(2)、通过轮流固定f的其中一个自变量,对另一个没固定的 自变量求极值,由此来确定受此自变量影响下的最值。下一 次对另一个自变量也如此操作,循环往复形成迭代。
程序部分
• 程序设计思路
• (1)参数输入模块
• (2)判断模块
判断矩阵中的元素是否 >=0且<=1
判断矩阵的行相加是否 都为1
• (3)迭代模块1
• (4)迭代模块2
• (5)输出模块Байду номын сангаас
• P116 4.3 (b)
• 一般的DMC
• 一般的DMC
概率矩阵:
参考文献
[1]王育民、李晖 .《信息论与编码理论第二版》[M]北京:高等教育出版社,2013.4 96-101 [2]辛英.《离散信道容量的迭代算法及其实现》[D]山东:山东工商学院,1994 [3]徐伟业 耿苏燕 马湘蓉 冯月芹.《任意DMC信道容量的计算与仿真》[D]南京:南京工程学院 2017
信道容量的计算方法研究

信道容量的计算方法研究
信道容量是指在某个给定的带宽和信噪比条件下,传输信息的最大速率。
信道容量通常用单位时间内传输的比特数(比特每秒)来表示。
计算信道容量的公式为:
C = B × log2(1 + S/N)
其中,C表示信道容量,B表示信道带宽,S表示信号功率,N 表示噪声功率。
此公式在120年前由德国数学家Hartley提出,称为哈特利公式。
它用于描述在理想信道条件下的信息传输限制。
该公式表示,在频带B内、噪声功率为N的情况下,传输速率C理论上最高为
C=B*log2(1+S/N)。
这个公式是通过链路的信道特性分析来得出的,实际链路中应用时需要估计 S/N 的值。
重点是最大值的计算,信道容量很大程度上反映了信道的质量,在无线通信系统中,信道容量的提高是很重要的一个方面,因为它能够提高系统的使用效率和可靠性,从而增加系统的吞吐量和容量。
此外,还可以通过其他信源不同于离散和连续的信源,或者利用其他编码方法和调制技术等等方法,提高信道容量。
信道容量实验报告

湖南大学信息科学与工程学院实验报告实验名称信道容量的迭代算法课程名称信息论与编码第1页共9页1.实验目的(1)进一步熟悉信道容量的迭代算法; (2)学习如何将复杂的公式转化为程序;(3)掌握C 语言数值计算程序的设计和调试技术。
2、实验方法硬件:pc 机开发平台:visual c++软件 编程语言:c 语言3、实验要求(1)已知:信源符号个数r 、信宿符号个数s 、信道转移概率矩阵P 。
(2)输入:任意的一个信道转移概率矩阵。
信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入。
(3)输出:最佳信源分布P*,信道容量C 。
4.算法分析1:procedure CHANNEL CAPACITY(r,s,(jip ))2:initialize:信源分布ip =1/r ,相对误差门限σ,C=—∞3:repeat 4:5:6:C2211log [exp(log )]rsji ij r j p φ==∑∑7:until C Cσ∆≤8:output P*=()i rp ,C9:end procedure21211exp(log )exp(log )sji ij j r sjiij r j p pφφ===∑∑∑ip 1i jiri jii p p p p=∑ijφ5.程序调试1、头文件引入出错f:\visualc++\channel\cpp1.cpp(4) : fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory————#include<unistd.h>纠错://#include<unistd.h>f:\visualc++\channel\cpp1.cpp(5) : fatal error C1083: Cannot open include file: 'values.h': No such file or directory————#include<values.h>纠错://#include<values.h>2、变量赋值错误f:\visualc++\channel\cpp1.cpp(17) : error C2065: 'ij' : undeclared identifierf:\visualc++\channel\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'int' to 'float ** ' Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast————float **phi_ij=ij=NULL;纠错:float **phi_ij=NULL;3、常量定义错误f:\visualc++\channel\cpp1.cpp(40) : error C2143: syntax error : missing ';' before 'for' ————for(i=0;i<r;i++)phi_ij[i]=(float *)calloc(s,sizeof(float));f:\visualc++\channel\cpp1.cpp(52) : error C2021: expected exponent value, not ' '————if(fabs(validate -1.0)>DELTA)f:\visualc++\channel\Cpp1.cpp(84) : error C2021: expected exponent value, not ' '————if(fabs(p_j)>=DELTA)f:\visualc++\channel\Cpp1.cpp(100) : error C2021: expected exponent value, not ' '————if(fabs(phi_ij[i][j])>=DELTA)f:\visualc++\channel\Cpp1.cpp(116) : error C2021: expected exponent value, not ' ' ————while(fabs(C-C_pre)/C>DELTA);纠错:#define DELTA 0.000001;F:\visualc++\channel\Cpp1.cpp(68) : error C2065: 'MAXFLOAT' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(68) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data————C=-MAXFLOAT;纠错:#define MAXFLOAT 1000000;3、引用中文逗号f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'f:\visualc++\channel\cpp1.cpp(60) : error C2065: 'Starting' : undeclared identifierf:\visualc++\channel\cpp1.cpp(60) : error C2059: syntax error : '.'f:\visualc++\channel\cpp1.cpp(60) : error C2017: illegal escape sequencef:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'————fprintf(stdout,”Starting..\n”);纠错:fprintf(stdout,"Starting..\n");4、没有进行强制转换F:\visualc++\channel\Cpp1.cpp(65) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————p_i[i]=1.0/(float)r;纠错:p_i[i]=(float)(1.0/(float)r);F:\visualc++\channel\Cpp1.cpp(101) : warning C4244: '+=' : conversion from 'double' to 'float', possible loss of data————sum[i]+=p_ji[i][j]*log( phi_ij[i][j])/ log(2.0);纠错:sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0));F:\visualc++\channel\Cpp1.cpp(103) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————sum[i]=pow(2.0,sum[i]);纠错:sum[i]=(float)(pow(2.0,sum[i]));F:\visualc++\channel\Cpp1.cpp(114) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————C= log(p_j)/ log(2.0);纠错:C= (float)(log(p_j)/ log(2.0));4、表达式错误F:\visualc++\channel\Cpp1.cpp(86) : error C2065: 'phi_ji' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer typeF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer type ————phi_ij[i][j]=p_i[i]* phi_ji[i][j]/p_j;纠错:phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'fprint' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'The' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2146: syntax error : missing ')' before identifier 'iteration'F:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'————fprint(stdout,”The iteration number is %d.\n\n”,k);纠错:fprintf(stdout,"The iteration number is %d.\n\n",k);F:\visualc++\channel\Cpp1.cpp(145) : error C2143: syntax error : missing ')' before ';' ————free((p_i);纠错:free(p_i);5、没有返回值F:\visualc++\channel\Cpp1.cpp(149) : warning C4508: 'main' : function should return a value; 'void' return type assumed、纠错:return 0;6.改进程序/*引入头文件*/#include<stdio.h>#include<math.h>#include<stdlib.h>/*定义常量*/#define DELTA 0.0000001//DELTA为相对误差门限#define MAXFLOAT 1000000;//MAXFLOAT为初始化信道容量值int main( void){/*定义全局变量*//*register允许直接从寄存器中读取变量,提高速率*/register int i,j;//i、j为整型变量register int k;//信道容量迭代计算次数int r,s;//r为信源符号个数,s为新宿符号个数float *p_i=NULL;//r个信源符号发生的概率float **p_ji=NULL;//信源到新宿的信道转移概率矩阵Pfloat **phi_ij=NULL;float C,C_pre,validate;//C为信道容量,C_pre为信道最大容量,validate为判定输入转移概率矩阵是否合法float * sum=NULL;//信源符号所带的全部信息量float p_j;//条件概率/*输入信源符号和新宿符号个数*/printf("请输入信源符号个数r、信宿符号个数s...\n");printf("+++++注意!!!r必须大于等于s!!+++++\n");fscanf(stdin,"%d",&r);fscanf(stdin,"%d",&s);/*为 p_i,p_ji 和 phi_ij 分配内存空间*/p_i=(float *)calloc(r,sizeof(float));p_ji=(float **)calloc(r,sizeof(float));/*为每个p_ji分配大小为s的内存空间*/for(i=0;i<r;i++)p_ji[i]=(float *)calloc(s,sizeof(float));phi_ij=(float **)calloc(r,sizeof(float*));/*输入转移概率矩阵*/for(i=0;i<r;i++)/*为每个phi_ij分配大小为s的内存空间*/phi_ij[i]=(float *)calloc(s,sizeof(float));printf("信道转移概率矩阵P...\n");for(i=0;i<r;i++)for(j=0;j<s;j++)fscanf(stdin,"%f",&p_ji[i][j]);/*判定输入的转移概率矩阵是否正确*/for(i=0;i<r;i++){validate=0.0;for(j=0;j<s;j++){validate +=p_ji[i][j];}if((validate-1.0)>=0)//如果转移概率矩阵的概率和大于1,输入数据不合法{fprintf(stdout,"invalid input data.\n");exit(-1);}}/*显示开始计算..*/fprintf(stdout,"Starting..\n");/*初始化 p_i 和 phi_ij*/for(i=0;i<r;i++){/* p_i为等概率,即概率为1/r*/p_i[i]=(float)(1.0/(float)r);}/*初始化信道容量c,迭代次数k和临时变量variable*/C=-MAXFLOAT;k=0;/* 为sum分配大小为r的内存空间*/sum=(float *)calloc(r,sizeof(float));/*开始迭代计算*/do{k++;//每进行一次迭代,迭代次数k加1/* 计算phi_ij(k)*/for(j=0;j<s;j++){p_j=0.0;for(i=0;i<r;i++)p_j+=p_i[i]*p_ji[i][j];if(fabs(p_j)>=DELTA)for(i=0;i<r;i++)phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;elsefor(i=0;i<r;i++)phi_ij[i][j]=0.0;}/*计算p_i(k+1)*/p_j=0.0;for(i=0;i<r;i++){sum[i]=0.0;for(j=0;j<s;j++){/*相对误差门限为0*/if(fabs(phi_ij[i][j])>=DELTA)sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0)); }sum[i]=(float)(pow(2.0,sum[i]));p_j+=sum[i];}for(i=0;i<r;i++){p_i[i]=sum[i]/p_j;}C_pre=C;C= (float)(log(2.0)/log(p_j) );}while(fabs(C-C_pre)/C>DELTA);free(sum);sum=NULL;/*显示结果*/fprintf(stdout,"The iteration number is %d.\n\n",k);//迭代次数fprintf(stdout,"The capacity of the channel is %.6f bit/symbol:\n\n",C);//信道容量fprintf(stdout,"The best input probability distribution is :\n");//最佳信源分布 for(i=0;i<r;i++)fprintf(stdout,"%.6f\n",p_i[i]);fprintf(stdout,"\n");/* 释放指针空间*/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);return 0;}7.实验结果八、实验结论信道容量是指信道能无错误传送的最大信息率。
渠道容量实验报告.doc

渠道容量实验报告湖南大学信息科学与工程学院的实验报告共11页,第11页。
湖南大学信息科学与工程研究所实际报道了实验名称信道容量的迭代算法。
课程名称信息论与编码1。
实验目的(1)更熟悉信道容量的迭代算法;(2)学习如何将复杂的公式转换成程序;(3)掌握C语言数值计算程序的设计和调试技术。
2.实验方法的硬件:电脑开发平台:Visual c软件编程语言:c 语言3.实验要求(1)已知:源符号数r、宿符号数s和信道转移概率矩阵p。
(2)输入:任意一个信道转移概率矩阵。
源符号的数量、汇符号的数量和每个特定的转移概率在运行时从键盘输入。
(3)输出:最佳源分布P*,信道容量c. 4。
算法分析1:程序通道容量(r,s,())2:初始化:源分布=1/r,相对误差阈值,C=-3:重复4:5:6:C7:直到8:输出P*=,C9:程序调试1.头文件介绍错误f : \ visual c \ channel \ CPP 1 . CPP(4):宿命论错误c108:无法打开include file : ' unistd . h ' : no such file或directory——3354 # include错误更正://# includefile: \ visual c \ channel \ CPP 1 . CPP(5):宿命论错误c 108:无法打开include file : '值,nosuchfile或directory——3354 # include错误更正://#包括2.变量赋值错误f : \ visual c \ channel \ CPP 1 . CPP(17): error c 20653: ' ij ' :未声明的标识符f : \ visual c \ channel \ CPP 1 . CPP(17): error c 2440: ' initializing ' 3:无法从' int '转换为' float * * '从integritytype转换为pointer type requirements reinterpriset _ cast,c-(2) learn(3)掌握C语言数值计算程序的设计和调试技术。
一般信道的信道容量求解

一般信道的信道容量求解组员:文枝传李红井任富绳马增敏指导教师:张坤老师一:实验目的使学生学会利用Matlab求解信道容量及最佳概率分布,帮助学生巩固所学知识,同时拓展学生的知识。
二:实验内容已知信道的转移矩阵P_YX为3.03.01.03.01.01.01.07.03.0 2.04.0 1.009.02.065.006 .03.03.02.02.027.04.023.01.0求该信道的信道容量和最佳概率输入分布。
三:实验步骤及编码方法(1) 建立一个名为contmax的文件,输入以下内容:%任意信道的信道容量C及最佳输入分布P_X源程序function [P_X,C,N]=contmax(P_YX,e)% 计算任意信道的信道容量C及最佳输入分布P_X% P_X -------最佳概率输入分布% C----------信道容量N----------迭代次数% P_YX-----DMC信道的转移矩阵e-----------精度if length(find(P_YX<0)~=0)error('Not a probable vector.Negtive component');endif abs(sum(P_YX')-1)>10e-10error('Not a probable vector,Component do not add up to "1" '); end% 变量初始化C1=1;C=0;N=0;r=size(P_YX);P_X=ones(1,r(1))/r(1);% 调整P_YX的零元素值Pyx=(P_YX==0).*eps;P_YX=P_YX+Pyx;% 迭代求解while (abs(C1-C))>eP_Y=P_X*P_YX;I1=sum((P_YX.*log2(P_YX))');I2=log2(P_Y)*(P_YX'); BETA=exp(I1-I2);B=P_X*(BETA');C1=log(B);C=log(max(BETA));P_X=P_X.*BETA/B;N=N+1;(2) 在命令窗口输入信道的转移矩阵P_YX>> P_YX=[0.1 0.23 0.4 0.27;0.2 0.2 0.3 0.3;0.06 0.65 0.2 0.09;0.1 0.4 0.2 0.3;0.7 0.1 0.1 0.1;0.3 0.1 0.3 0.3]P_YX =0.1000 0.2300 0.4000 0.27000.2000 0.2000 0.3000 0.30000.0600 0.6500 0.2000 0.09000.1000 0.4000 0.2000 0.30000.7000 0.1000 0.1000 0.10000.3000 0.1000 0.3000 0.3000四:实验结果[P_X,C,N]=contmax(P_YX,0.01)P_X =0.1495 0.0005 0.4101 0.0021 0.4299 0.0080C =0.4290N =37>> [P_X,C,N]=contmax(P_YX,0.001)P_X =0.1647 0.0000 0.4037 0.0001 0.4304 0.0011C =0.4215N =64五:实验分析由上比较分析得,当精度e=0.01时,P_X为最佳概率输入分布,即P_X =0.1495 0.0005 0.4101 0.0021 0.4299 0.0080此时,信道容量C = 0.4290(bit/符号)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖南大学信息科学与工程学院实验报告实验名称信道容量的迭代算法课程名称信息论与编码第1页共9页1.实验目的(1)进一步熟悉信道容量的迭代算法; (2)学习如何将复杂的公式转化为程序;(3)掌握C 语言数值计算程序的设计和调试技术。
2、实验方法硬件:pc 机开发平台:visual c++软件 编程语言:c 语言3、实验要求(1)已知:信源符号个数r 、信宿符号个数s 、信道转移概率矩阵P 。
(2)输入:任意的一个信道转移概率矩阵。
信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入。
(3)输出:最佳信源分布P*,信道容量C 。
4.算法分析1:procedure CHANNEL CAPACITY(r,s,(jip ))2:initialize:信源分布ip =1/r ,相对误差门限σ,C=—∞3:repeat 4:5:6:C2211log [exp(log )]rsji ij r j p φ==∑∑7:until C Cσ∆≤8:output P*=()i rp ,C9:end procedure21211exp(log )exp(log )sji ij j r sjiij r j p pφφ===∑∑∑ip 1i jiri jii p p p p=∑ijφ5.程序调试1、头文件引入出错f:\visualc++\channel\cpp1.cpp(4) : fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory————#include<unistd.h>纠错://#include<unistd.h>f:\visualc++\channel\cpp1.cpp(5) : fatal error C1083: Cannot open include file: 'values.h': No such file or directory————#include<values.h>纠错://#include<values.h>2、变量赋值错误f:\visualc++\channel\cpp1.cpp(17) : error C2065: 'ij' : undeclared identifierf:\visualc++\channel\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'int' to 'float ** ' Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast————float **phi_ij=ij=NULL;纠错:float **phi_ij=NULL;3、常量定义错误f:\visualc++\channel\cpp1.cpp(40) : error C2143: syntax error : missing ';' before 'for' ————for(i=0;i<r;i++)phi_ij[i]=(float *)calloc(s,sizeof(float));f:\visualc++\channel\cpp1.cpp(52) : error C2021: expected exponent value, not ' '————if(fabs(validate -1.0)>DELTA)f:\visualc++\channel\Cpp1.cpp(84) : error C2021: expected exponent value, not ' '————if(fabs(p_j)>=DELTA)f:\visualc++\channel\Cpp1.cpp(100) : error C2021: expected exponent value, not ' '————if(fabs(phi_ij[i][j])>=DELTA)f:\visualc++\channel\Cpp1.cpp(116) : error C2021: expected exponent value, not ' ' ————while(fabs(C-C_pre)/C>DELTA);纠错:#define DELTA 0.000001;F:\visualc++\channel\Cpp1.cpp(68) : error C2065: 'MAXFLOAT' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(68) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data————C=-MAXFLOAT;纠错:#define MAXFLOAT 1000000;3、引用中文逗号f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'f:\visualc++\channel\cpp1.cpp(60) : error C2065: 'Starting' : undeclared identifierf:\visualc++\channel\cpp1.cpp(60) : error C2059: syntax error : '.'f:\visualc++\channel\cpp1.cpp(60) : error C2017: illegal escape sequencef:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'————fprintf(stdout,”Starting..\n”);纠错:fprintf(stdout,"Starting..\n");4、没有进行强制转换F:\visualc++\channel\Cpp1.cpp(65) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————p_i[i]=1.0/(float)r;纠错:p_i[i]=(float)(1.0/(float)r);F:\visualc++\channel\Cpp1.cpp(101) : warning C4244: '+=' : conversion from 'double' to 'float', possible loss of data————sum[i]+=p_ji[i][j]*log( phi_ij[i][j])/ log(2.0);纠错:sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0));F:\visualc++\channel\Cpp1.cpp(103) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————sum[i]=pow(2.0,sum[i]);纠错:sum[i]=(float)(pow(2.0,sum[i]));F:\visualc++\channel\Cpp1.cpp(114) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————C= log(p_j)/ log(2.0);纠错:C= (float)(log(p_j)/ log(2.0));4、表达式错误F:\visualc++\channel\Cpp1.cpp(86) : error C2065: 'phi_ji' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer typeF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer type ————phi_ij[i][j]=p_i[i]* phi_ji[i][j]/p_j;纠错:phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'fprint' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'The' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2146: syntax error : missing ')' before identifier 'iteration'F:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'————fprint(stdout,”The iteration number is %d.\n\n”,k);纠错:fprintf(stdout,"The iteration number is %d.\n\n",k);F:\visualc++\channel\Cpp1.cpp(145) : error C2143: syntax error : missing ')' before ';' ————free((p_i);纠错:free(p_i);5、没有返回值F:\visualc++\channel\Cpp1.cpp(149) : warning C4508: 'main' : function should return a value; 'void' return type assumed、纠错:return 0;6.改进程序/*引入头文件*/#include<stdio.h>#include<math.h>#include<stdlib.h>/*定义常量*/#define DELTA 0.0000001//DELTA为相对误差门限#define MAXFLOAT 1000000;//MAXFLOAT为初始化信道容量值int main( void){/*定义全局变量*//*register允许直接从寄存器中读取变量,提高速率*/register int i,j;//i、j为整型变量register int k;//信道容量迭代计算次数int r,s;//r为信源符号个数,s为新宿符号个数float *p_i=NULL;//r个信源符号发生的概率float **p_ji=NULL;//信源到新宿的信道转移概率矩阵Pfloat **phi_ij=NULL;float C,C_pre,validate;//C为信道容量,C_pre为信道最大容量,validate为判定输入转移概率矩阵是否合法float * sum=NULL;//信源符号所带的全部信息量float p_j;//条件概率/*输入信源符号和新宿符号个数*/printf("请输入信源符号个数r、信宿符号个数s...\n");printf("+++++注意!!!r必须大于等于s!!+++++\n");fscanf(stdin,"%d",&r);fscanf(stdin,"%d",&s);/*为 p_i,p_ji 和 phi_ij 分配内存空间*/p_i=(float *)calloc(r,sizeof(float));p_ji=(float **)calloc(r,sizeof(float));/*为每个p_ji分配大小为s的内存空间*/for(i=0;i<r;i++)p_ji[i]=(float *)calloc(s,sizeof(float));phi_ij=(float **)calloc(r,sizeof(float*));/*输入转移概率矩阵*/for(i=0;i<r;i++)/*为每个phi_ij分配大小为s的内存空间*/phi_ij[i]=(float *)calloc(s,sizeof(float));printf("信道转移概率矩阵P...\n");for(i=0;i<r;i++)for(j=0;j<s;j++)fscanf(stdin,"%f",&p_ji[i][j]);/*判定输入的转移概率矩阵是否正确*/for(i=0;i<r;i++){validate=0.0;for(j=0;j<s;j++){validate +=p_ji[i][j];}if((validate-1.0)>=0)//如果转移概率矩阵的概率和大于1,输入数据不合法{fprintf(stdout,"invalid input data.\n");exit(-1);}}/*显示开始计算..*/fprintf(stdout,"Starting..\n");/*初始化 p_i 和 phi_ij*/for(i=0;i<r;i++){/* p_i为等概率,即概率为1/r*/p_i[i]=(float)(1.0/(float)r);}/*初始化信道容量c,迭代次数k和临时变量variable*/C=-MAXFLOAT;k=0;/* 为sum分配大小为r的内存空间*/sum=(float *)calloc(r,sizeof(float));/*开始迭代计算*/do{k++;//每进行一次迭代,迭代次数k加1/* 计算phi_ij(k)*/for(j=0;j<s;j++){p_j=0.0;for(i=0;i<r;i++)p_j+=p_i[i]*p_ji[i][j];if(fabs(p_j)>=DELTA)for(i=0;i<r;i++)phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;elsefor(i=0;i<r;i++)phi_ij[i][j]=0.0;}/*计算p_i(k+1)*/p_j=0.0;for(i=0;i<r;i++){sum[i]=0.0;for(j=0;j<s;j++){/*相对误差门限为0*/if(fabs(phi_ij[i][j])>=DELTA)sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0)); }sum[i]=(float)(pow(2.0,sum[i]));p_j+=sum[i];}for(i=0;i<r;i++){p_i[i]=sum[i]/p_j;}C_pre=C;C= (float)(log(2.0)/log(p_j) );}while(fabs(C-C_pre)/C>DELTA);free(sum);sum=NULL;/*显示结果*/fprintf(stdout,"The iteration number is %d.\n\n",k);//迭代次数fprintf(stdout,"The capacity of the channel is %.6f bit/symbol:\n\n",C);//信道容量fprintf(stdout,"The best input probability distribution is :\n");//最佳信源分布 for(i=0;i<r;i++)fprintf(stdout,"%.6f\n",p_i[i]);fprintf(stdout,"\n");/* 释放指针空间*/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);return 0;}7.实验结果八、实验结论信道容量是指信道能无错误传送的最大信息率。