信道容量实验报告.docx
- 文档编号:10268495
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:11
- 大小:41.86KB
信道容量实验报告.docx
《信道容量实验报告.docx》由会员分享,可在线阅读,更多相关《信道容量实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
信道容量实验报告
湖南大学
信息科学与工程学院
实验报告
实验名称信道容量的迭代算法
课程名称信息论与编码
1.实验目的
(1)进一步熟悉信道容量的迭代算法;
(2)学习如何将复杂的公式转化为程序;
(3)掌握C语言数值计算程序的设计和调试技术。
2、实验方法
硬件:
pc机
开发平台:
visualC++软件
编程语言:
c语言
3、实验要求
(1)已知:
信源符号个数r、信宿符号个数s、信道转移概率矩阵P。
(2)输入:
任意的一个信道转移概率矩阵。
信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入。
(3)输出:
最佳信源分布P*,信道容量Co
4.算法分析
1:
procedureCHANNELCAPACITY(r,s,(Pji))
8:
outputP*=(Pi)r,C
9:
endprocedure
5.程序调试
1、头文件引入出错f:
\visualc++\channel\cpp1.cpp(4):
fatalerrorC1083:
Cannotopenincludefile:
'unistd.h':
Nosuchfileordirectory
————#include
//#include
\visualc++\channel\cpp1.cpp(5):
fatalerrorC1083:
Cannotopenincludefile:
'values.h':
Nosuchfileordirectory
————#include
//#include
2、变量赋值错误f:
\visualc++\channel\cpp1.cpp(17):
errorC2065:
'ij':
undeclaredidentifierf:
\visualc++\channel\cpp1.cpp(17):
errorC2440:
'initializing':
cannotconvertfrom'int'to'float**'Conversionfromintegraltypetopointertyperequiresreinterpret_cast,C-stylecastorfunction-stylecast
————float**phi_ij=ij=NULL;纠错:
float**phi_ij=NULL;
3、常量定义错误f:
\visualc++\channel\cpp1.cpp(40):
errorC2143:
syntaxerror:
missing';'before'for'————for(i=0;i phi_ij[i]=(float*)calloc(s,sizeof(float));f: \visualc++\channel\cpp1.cpp(52): errorC2021: expectedexponentvalue,not''————if(fabs(validate-1.0)>DELTA) f: \visualc++\channel\Cpp1.cpp(84): errorC2021: expectedexponentvalue,not''————if(fabs(p_j)>=DELTA) f: \visualc++\channel\Cpp1.cpp(100): errorC2021: expectedexponentvalue,not''————if(fabs(phi_ij[i][j])>=DELTA) f: \visualc++\channel\Cpp1.cpp(116): errorC2021: expectedexponentvalue,not''————while(fabs(C-C_pre)/C>DELTA); 纠错: #defineDELTA0.000001;F: \visualc++\channel\Cpp1.cpp(68): errorC2065: 'MAXFLOAT': undeclaredidentifierF: \visualc++\channel\Cpp1.cpp(68): warningC4244: '=': conversionfrom'int'to'float',possiblelossofdata ————C=-MAXFLOAT; 纠错: #defineMAXFLOAT1000000; 3、引用中文逗号f: \visualc++\channel\cpp1.cpp(60): errorC2018: unknowncharacter'0xa1'f: \visualc++\channel\cpp1.cpp(60): errorC2018: unknowncharacter'0xb1'f: \visualc++\channel\cpp1.cpp(60): errorC2065: 'Starting': undeclaredidentifierf: \visualc++\channel\cpp1.cpp(60): errorC2059: syntaxerror: '.' f: \visualc++\channel\cpp1.cpp(60): errorC2017: illegalescapesequencef: \visualc++\channel\cpp1.cpp(60): errorC2018: unknowncharacter'0xa1'f: \visualc++\channel\cpp1.cpp(60): errorC2018: unknowncharacter'0xb1'————fprintf(stdout,”Starting..\n”); 纠错: fprintf(stdout,"Starting..\n"); 4、没有进行强制转换 F: \visualc++\channel\Cpp1.cpp(65): warningC4244: '=': conversionfrom'double'to'float',possiblelossofdata ————p_i[i]=1.0/(float)r;纠错: p_i[i]=(float)(1.0/(float)r); F: \visualc++\channel\Cpp1.cpp(101): warningC4244: '+=': conversionfrom'double'to'float',possiblelossofdata ————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): warningC4244: '=': conversionfrom'double'to'float',possiblelossofdata ————sum[i]=pow(2.0,sum[i]);纠错: sum[i]=(float)(pow(2.0,sum[i])); F: \visualc++\channel\Cpp1.cpp(114): warningC4244: '=': conversionfrom'double'to'float',possiblelossofdata ————C=log(p_j)/log(2.0); 纠错: C=(float)(log(p_j)/log(2.0)); 4、表达式错误 F: \visualc++\channel\Cpp1.cpp(86): errorC2065: 'phi_ji': undeclaredidentifierF: \visualc++\channel\Cpp1.cpp(86): errorC2109: subscriptrequiresarrayorpointertypeF: \visualc++\channel\Cpp1.cpp(86): errorC2109: subscriptrequiresarrayorpointertype————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): errorC2065: 'fprint': undeclaredidentifierF: \visualc++\channel\Cpp1.cpp(122): errorC2018: unknowncharacter'0xa1'F: \visualc++\channel\Cpp1.cpp(122): errorC2018: unknowncharacter'0xb1'F: \visualc++\channel\Cpp1.cpp(122): errorC2065: 'The': undeclaredidentifierF: \visualc++\channel\Cpp1.cpp(122): errorC2146: syntaxerror: missing')'beforeidentifier'iteration' F: \visualc++\channel\Cpp1.cpp(122): errorC2017: illegalescapesequenceF: \visualc++\channel\Cpp1.cpp(122): errorC2017: illegalescapesequenceF: \visualc++\channel\Cpp1.cpp(122): errorC2018: unknowncharacter'0xa1'F: \visualc++\channel\Cpp1.cpp(122): errorC2018: unknowncharacter'0xb1'————fprint(stdout,”Theiterationnumberis%d.\n\n”,k);纠错: fprintf(stdout,"Theiterationnumberis%d.\n\n",k); F: \visualc++\channel\Cpp1.cpp(145): errorC2143: syntaxerror: missing')'before';'————free((p_i); 纠错: free(p_i); 5、没有返回值 F: \visualc++\channel\Cpp1.cpp(149): warningC4508: 'main': functionshouldreturn'void'returntypeassumed、 纠错: return0; 6.改进程序 /*引入头文件*/#include /*定义常量*/ #defineDELTA0.0000001//DELTA为相对误差门限 #defineMAXFLOAT1000000;//MAXFLOAT为初始化信道容量值 intmain(void) { /*定义全局变量*/ /*register允许直接从寄存器中读取变量,提高速率*/registerinti,j;//i、j为整型变量 registerintk;//信道容量迭代计算次数intr,s;//r为信源符号个数,s为新宿符号个数 float*p_i=NULL;//r个信源符号发生的概率 float**p_ji=NULL;//信源到新宿的信道转移概率矩阵P float**phi_ij=NULL; floatC,C_pre,validate;//C为信道容量,C_pre为信道最大容量,validate输入转移概率矩阵是否合法 float*sum=NULL;//信源符号所带的全部信息量floatp_j;//条件概率 /*输入信源符号和新宿符号个数*/printf("请输入信源符号个数r、信宿符号个数s...\n"); printf("+++++注意! ! ! r必须大于等于s! ! +++++\n"); fscanf(stdin,"%d",&r);fscanf(stdin,"%d",&s); avalue; 为判定 /*为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 p_ji[i]=(float*)calloc(s,sizeof(float)); phi_ij=(float**)calloc(r,sizeof(float*)); /*输入转移概率矩阵*/for(i=0;i /*为每个phi_ij分配大小为s的内存空间*/phi_ij[i]=(float*)calloc(s,sizeof(float));printf("信道转移概率矩阵P...\n"); for(i=0;i for(j=0;j /*判定输入的转移概率矩阵是否正确*/for(i=0;i { validate=0.0; for(j=0;j { validate+=p_ji[i][j]; } 1,输入数据不合 if((validate-1.0)>=0)//如果转移概率矩阵的概率和大于法 { fprintf(stdout,"invalidinputdata.\n"); exit(-1); } } /*显示开始计算..*/fprintf(stdout,"Starting..\n"); /*初始化p_i和phi_ij*/for(i=0;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 { p_j=0.0;for(i=0;i elsefor(i=0;i } /*计算p_i(k+1)*/ p_j=0.0;for(i=0;i for(j=0;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 {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,"Theiterationnumberis%d.\n\n",k);//迭代次数 信道 最佳信源分布 fprintf(stdout,"Thecapacityofthechannelis%.6fbit/symbol: \n\n",C);//容量 fprintf(stdout,"Thebestinputprobabilitydistributionis: \n");//for(i=0;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); return0; } 7.实验结果 i°F;\visualc++\chiumeL\Del]LicXC|)pl.eze* 请输入信: 蔚官疸礦科匕 +++++itS! ! ! •必须大于等于*! ! +++++ 22 信道转移慨卒距阵P-- B.1G_20_38.1 StrM'Liriy・■ TheiLtiML丄unidiuniLier1客5- Thecapac±tyofthechannelis1.428287bit/symbol: TheJbestinputpnobabilitdistributionis- 0.491801 0.508199 Pt*essanvkeytocamtinue 八、实验结论 信道容量是指信道能无错误传送的最大信息率。 对于只有一个信源和一个信宿的单用户信道,它是一个数,单位是比特每秒或比特每符号。 它代表每秒或每 个信道符号能传送的最大信息量,或者说小于这个数的信息率必能在此信道中无错误地传送。 信道的输入、输出都取值于离散符号集,且都用一个随机变量来表示的信道就是离散单符号信道。 由于信道中存在干扰,因此输入符号在传输中将会产生错误,这种信道干扰对传输的影响可用传递概率来描述。 信道传递概率通常称为前向概率。 它是由于信道噪声引起的,所以通常用它描述信道噪声的特性。 有时把p(x)称为输入符号的先验概率。 而对应的把p(x|y)称为输入符号的后验(后向)概率。 平均互信息I(X;Y)是接收到输出符号集丫后所获得的关于输入符号集X的信息量。 信源的不确定性为H(X),由于干扰的存在,接收端收到丫后对信源仍然存在的不确定性为H(X|Y),又称为信道疑义度。 信宿所消除的关于信源的不确定性,也就是获得的关于信源的信息为I(X;Y),它是平均意义上每传送一个 符号流经信道的信息量。 对于固定的信道,总存在一种信源(某种输入概率分布),使信道平均传输一个符号接收端获得的信息量最大,也就是说对于每个固定信道都有一个最大的信息传输率,这个最大的信息传输率即为信道容量,而相应的输入概率分布称为最佳输入分布。 为了评价实际信道的利用率,应具体计算已给信道的容量。 这是一个求最大值的问题。 由于互信息对输入符号概率而言是凸函数,其极值将为最大值,因此 这也就是求极值的问题。 对于离散信道,P(x)是一组数,满足非负性和归一性等条件,可用拉格朗日乘子法求得条件极值。 对于连续信道,P(x)是一函数,须 用变分法求条件极值。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信道容量 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)