信道容量实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
w .. . ..
湖南大学
信息科学与工程学院
实验报告
实验名称信道容量的迭代算法
课程名称信息论与编码
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,(
ji p )) 2:initialize:信源分布
i p =1/r ,相对误差门限σ,C=—∞
3:repeat
4:
5: 1i ji r i ji i p p p p =∑ij
φ
6:
C 2211log [exp(log )]
r s ji ij r j p φ==∑∑
7:until C C σ
∆≤
8:output P*= ()i r p ,C
9:end procedure
5.程序调试
1、头文件引入出错
f:\visualc++\channel\cpp1.cpp(4) : fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory
————#include
纠错://#include
f:\visualc++\channel\cpp1.cpp(5) : fatal error C1083: Cannot open include file: 'values.h': No such file or directory
————#include
纠错://#include
2、变量赋值错误
f:\visualc++\channel\cpp1.cpp(17) : error C2065: 'ij' : undeclared identifier
f:\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 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 ' ' 21 211exp(log )exp(log )s ji ij j r s ji ij r j p p φφ===∑∑∑i p ————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 identifier F:\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 identifier f:\visualc++\channel\cpp1.cpp(60) : error C2059: syntax error : '.' f:\visualc++\channel\cpp1.cpp(60) : error C2017: illegal escape sequence f:\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 identifier F:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer type