信息论实验报告

合集下载

信息论实验报告

信息论实验报告

信息论实验报告班级:姓名:学号:实验一:信道容量的迭代算法1.实验目的(1)进一步熟悉信道容量的迭代算法;(2)学习如何将复杂的公式转化为程序;(3)掌握C 语言数值计算程序的设计和调试技术。

2、实验要求(1)已知:信源符号个数r 、信宿符号个数s 、信道转移概率矩阵P 。

(2)输入:任意的一个信道转移概率矩阵。

信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入。

(3)输出:最佳信源分布P*,信道容量C 。

3.算法分析1:procedure CHANNEL CAPACITY(r,s,(ji p )) 2:initialize:信源分布i p =1/r ,相对误差门限σ,C=—∞3:repeat4:5:6: C 2211log [exp(log )]r s ji ij r j p φ==∑∑7:until C Cσ∆≤8:output P*= ()i r p ,C9:end procedure4.程序调试21211exp(log )exp(log )sji ij j r s ji ij r j p p φφ===∑∑∑i p 1i ji r i ji i p p p p =∑ijφ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;5.改进程序/*引入头文件*/#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;}6.实验结果6.实验二:唯一可译码判决准则1.实验目的(1)进一步熟悉唯一可译码判决准则;(2)掌握C语言字符串处理程序的设计和调试技术。

信息基础论实验报告

信息基础论实验报告

一、实验目的1. 理解信息的基本概念和特征。

2. 掌握信息系统的基本组成和功能。

3. 了解信息处理的基本方法和技术。

4. 培养运用信息理论分析和解决实际问题的能力。

二、实验内容1. 信息的基本概念和特征2. 信息系统的组成和功能3. 信息处理的基本方法和技术4. 信息安全与伦理三、实验步骤1. 信息的基本概念和特征(1)查阅资料,了解信息的基本概念和特征。

(2)通过实例分析,加深对信息概念的理解。

(3)讨论信息在日常生活、工作中的应用。

2. 信息系统的组成和功能(1)学习信息系统组成的基本要素,如硬件、软件、数据等。

(2)了解信息系统的功能,包括信息收集、处理、存储、传输、检索等。

(3)分析信息系统在各个领域的应用。

3. 信息处理的基本方法和技术(1)学习信息处理的基本方法,如编码、解码、压缩、解压缩等。

(2)了解信息处理技术的应用,如数字信号处理、图像处理、语音处理等。

(3)通过实例分析,掌握信息处理技术在实际问题中的应用。

4. 信息安全与伦理(1)学习信息安全的基本概念和重要性。

(2)了解信息安全的技术手段,如加密、认证、防火墙等。

(3)讨论信息伦理问题,如隐私保护、知识产权等。

四、实验结果与分析1. 信息的基本概念和特征通过查阅资料和实例分析,我们了解到信息是反映客观事物属性和运动状态的知识,具有客观性、普遍性、传递性、共享性、时效性等特征。

信息在日常生活、工作中的应用十分广泛,如天气预报、电子商务、社交网络等。

2. 信息系统的组成和功能通过学习,我们了解到信息系统由硬件、软件、数据、人员等要素组成。

信息系统的功能包括信息收集、处理、存储、传输、检索等。

在各个领域,如政府、企业、教育等,信息系统都发挥着重要作用。

3. 信息处理的基本方法和技术通过学习,我们掌握了信息处理的基本方法,如编码、解码、压缩、解压缩等。

同时,我们了解到信息处理技术在数字信号处理、图像处理、语音处理等领域的应用,为解决实际问题提供了有力支持。

信息论上机实验报告

信息论上机实验报告

信息论与编码实验报告实验一:计算离散信源的熵一、实验设备: 1、计算机2、软件:Matlab 二、实验目的:1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程; 三、习题:1. 甲地天气预报构成的信源空间为:1111(),,,8482X p x ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦ 小雨云 大雨晴 乙地信源空间为:17(),88Y p y ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦小雨晴 求此两个信源的熵。

求各种天气的自信息量。

代码:x=[1/2,1/4,1/8,1/8]; y=[7/8,1/8];HX=sum(-x.*log2(x)) HY=sum(-y.*log2(y)) IX=-log2(x) IY=-log2(y) 答案:() 1.75;()0.5436H X H Y ==2、 某信息源的符号集由A 、B 、C 、D 、E 组成,设每一符号独立出现,其出现的概率分别为,1/4,1/8,1/8,3/16,5/16,试求该信源符号的平均信息量。

代码:x=[1/4,1/8,1/8,3/16,5/16]; HX=sum(-x.*log2(x))答案:H(X) = 2.2272bit/符号3、设有四个消息分别以概率1/4,1/8,1/8,1/2传送,每一消息的出现是相互独立的。

试计算其平均信息量。

代码:x=[1/4,1/8,1/8,1/2]; HX=sum(-x.*log2(x)) 答案:H(X) =1.75bit/符号4. 设一个二元信源(只有0和1两种符号)其概率空间为:(),1X p x p p ⎡⎤⎡⎤=⎢⎥⎢⎥-⎣⎦⎣⎦0 1编程画出H 与p 的关系,并说明当P 呈什么分布时,平均信息量达到最大值。

(说明:H=-p.*log2(p)-(1-p).log2(1-p);) 代码:p= 1/1000000:1/1000:1;H=-p.*log2(p)-(1-p).*log2(1-p); plot(p,H) grid on xlabel('p'); ylabel('HP'); 图:实验二:验证熵的可加性与强可加性1. 【例2.6】有一离散无记忆信源123111(),,244a a a X p x ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦验证二次扩展信源2X 的熵等于离散信源X 的熵的2倍,即2()2()H X H X =代码:x=[1/2,1/4,1/4];hx=sum(x.*log2(1./x))x2=[1/4,1/16,1/16,1/8,1/8,1/8,1/16,1/8,1/16] hx2=sum(x2.*log2(1./x2)) 答案:2() 1.5;() 3.0H X H X ==2. 验证两个统计独立的信源,X Y ,验证:()()()H XY H X H Y =+其中:123111(),,244a a a X p x ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦123111(),,333b b b Y p y ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦代码:x=[1/2,1/4,1/4]; y=[1/3,1/3,1/3];xy=[1/6,1/6,1/6,1/12,1/12,1/12,1/12,1/12,1/12] hx=sum(x.*log2(1./x)) hy=sum(y.*log2(1./y)) Hxy=sum(xy.*log2(1./xy)) 答案:() 1.5,() 1.585() 3.085H X H Y H XY ===3、条件熵的计算与熵的强可加性 验证离散二维平稳信源,满足:12121()()(|)H X X H X H X X =+某一离散二维平稳信源0121141(),,3694X p x ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦12X X 其联合概率分布12()p X X 为:编程计算:1) 联合熵12()H X X 2) 条件熵21(|)H X X3) 验证:12121()()(|)H X X H X H X X =+代码:x1=[11/36,4/9,1/4]; x2=[11/36,4/9,1/4];b=[1/4,1/18,0;1/18,1/3,1/18;0,1/18,7/36]; HXY=0;for i=1:size(b,1) for j=1:size(b,2) if b(i,j)>0HXY=HXY-b(i,j).*log2(b(i,j)); end end end HXYHx1=sum(x1.*log2(1./x1)) Hx2=sum(x2.*log2(1./x2))b0=b(1,:); b1=b(2,:); b2=b(3,:);x1x2=[b0./x2;b1./x2;b2./x2]; Hx1x2=0;for i=1:size(x1x2,1) for j=1:size(x1x2,2) if x1x2(i,j)>0Hx1x2=Hx1x2-b(i,j).*log2(x1x2(i,j)); end end end Hx1x2 答案:12112121() 1.5426;(|)0.8717() 2.4144()(|) 2.4144H X H X X H X X H X H X X ===+=实验三:离散信道的平均互信息的计算1. 【习题3.1】 设信源12()0.6,0.4X x x p x ⎡⎤⎡⎤=⎢⎥⎢⎥⎣⎦⎣⎦通过一干扰信道,接收到符号为12[,]Y y y =,其信道矩阵为:516631,44P ⎡⎤⎢⎥=⎢⎥⎢⎥⎢⎥⎣⎦1) 求信源X 中事件1x 和2x 分别含有的自信息;2) 收到消息(1,2)j y j =后,获得的关于(1,2)i x i =的信息量;3) 求信源X 和输出变量Y 的信息熵; 4) 信道疑义度(|)H X Y 和噪声熵(|)H Y X ; 5) 接收到消息Y 后获得的平均互信息;代码:x=[0.6,0.4];p=[5/6,1/6;3/4,1/4]; Ix1=log2(1./(x(1,1))) Ix2=log2(1./(x(1,2)))pxy=[x(1,1)*p(1,:);x(1,2)*p(2,:)]; py=[x*p(:,1),x*p(:,2)];px_y=[pxy(:,1)/py(1,1),pxy(:,2)/py(1,2)]; I=log2(p./[py;py]) Hx=sum(x.*log2(1./x)) Hy=sum(py.*log2(1./py))Hx_y=sum(sum(pxy.*log2(1./px_y))) Hy_x=sum(sum(pxy.*log2(1./p)))Ixy=sum(sum(pxy.*log2(p./[py;py])))答案:12111221221.()0.737() 1.32192.(;)0.0589,(;)0.263,(;)0.0931,(;)0.32193.()0.971,()0.72194.(|)0.9635(|)0.71455.(;)0.0074I x I x I x y I x y I x y I x y H X H Y H X Y H Y X I X Y ====-=-======2. 二元信道的互信息与信源分布的关系 有二元信源:01()1X p x ωω⎡⎤⎡⎤=⎢⎥⎢⎥-⎣⎦⎣⎦有二元信道,其传递矩阵为:11p p P p p -⎡⎤=⎢⎥-⎣⎦, 其中0.2p =,即传递矩阵0.80.20.20.8P ⎡⎤=⎢⎥⎣⎦编程实现下面题目:1) 画出平均互信息(;)I X Y 随信源分布ω的关系曲线,并求出最大平均互信息。

信息导论实验报告总结(3篇)

信息导论实验报告总结(3篇)

第1篇一、实验背景随着信息技术的飞速发展,信息已成为现代社会的重要资源。

为了让学生更好地了解信息的基本概念、信息处理技术以及信息在各个领域的应用,我们开展了信息导论实验。

本次实验旨在通过实际操作,使学生掌握信息处理的基本方法,提高信息素养,为后续相关课程的学习打下基础。

二、实验目的1. 理解信息的基本概念,掌握信息处理的基本方法。

2. 掌握信息检索技巧,提高信息获取能力。

3. 了解信息在各个领域的应用,增强信息意识。

4. 培养学生的动手能力和团队协作精神。

三、实验内容1. 信息检索实验:通过搜索引擎、数据库等工具,查找特定主题的相关信息,并评价信息的可靠性。

2. 信息处理实验:运用文字处理软件、表格处理软件等工具,对收集到的信息进行整理、分析、加工和展示。

3. 信息安全实验:学习信息加密、数字签名等安全技术在信息传输和存储中的应用。

4. 信息可视化实验:运用图表、图形等手段,将抽象的信息转化为直观的可视化形式。

四、实验过程1. 实验准备:学生分组,明确实验任务,查阅相关资料,准备实验所需的软件和工具。

2. 实验实施:按照实验指导书的要求,完成各项实验任务。

3. 实验总结:对实验过程中遇到的问题进行分析,总结实验经验,撰写实验报告。

五、实验结果与分析1. 信息检索实验:学生通过搜索引擎、数据库等工具,成功检索到所需信息,并学会评价信息的可靠性。

2. 信息处理实验:学生运用文字处理软件、表格处理软件等工具,对收集到的信息进行整理、分析、加工和展示,提高了信息处理能力。

3. 信息安全实验:学生掌握了信息加密、数字签名等安全技术在信息传输和存储中的应用,增强了信息安全意识。

4. 信息可视化实验:学生通过图表、图形等手段,将抽象的信息转化为直观的可视化形式,提高了信息传达效果。

六、实验心得与体会1. 信息检索实验让我认识到,信息检索是获取信息的重要途径,掌握信息检索技巧对于提高信息素养至关重要。

2. 信息处理实验让我体会到,信息处理能力是信息时代必备的基本技能,通过实际操作,我学会了如何高效地处理信息。

信息论实验报告-

信息论实验报告-

信息论实验报告学生:班级:学号:实验一香农编码一、程序设计的流程图二、程序清单#include <iostream>#include<math.h>#include<string>using namespace std;void swap(double *x,double *y);int main(){int N;cout<<"输入信源个数"<<endl;cin>>N;double S[N]; //注意变量在数组中的影响cout<<"输入信源概率"<<endl;for(int i=0;i<N;i++)cin>>S[i];for(int i=0;i<N;i++){for(int j=i;j<N;j++)if(S[i]<S[j])swap(S[i],S[j]);}int nm[N];for(int i=0;i<N;i++){nm[i]=int(-(log(S[i])/log(2)))+1;if(nm[i]==(-(log(S[i])/log(2)))+1)nm[i]--;}double AA[N];AA[0]=S[0];for(int i=1;i<N;i++ )AA[i]=AA[i-1]+S[i];string MM[N];for(int i=0;i<N;i++){double tem=0;double aa=AA[i];for(int j=0;j<N;j++){tem=aa*2;if(tem>1){MM[i]+='1';aa=tem-1;}else{MM[i]+='0';aa=tem;}}}string BB[N];for(int i=0;i<N;i++){for(int j=0;j<nm[i];j++)BB[i]+=MM[i][j];}cout<<"输出编码"<<endl;for(int i=0;i<N;i++)cout<<BB[i]<<endl;}void swap(double &x,double &y){double a;a=x;x=y;y=a;}实验二.费洛编码.一、 流程图二、程序清单#include <iostream>#include<string>#include<math.h>using namespace std;void dw(int n,int H,int W,double *si,string *m); int main(){int N;cout<<"输入信源个数"<<endl;cin>>N;double S[N];cout<<"输入信源概率"<<endl;for(int i=0;i<N;i++)cin>>S[i];for(int i=0;i<N;i++){for(int j=i;j<N;j++){if(S[i]<S[j]){double a;a=S[i];S[i]=S[j];S[j]=a;}}}string MM[N];dw(N,0,N-1,S,MM);cout<<"输出编码"<<endl;for(int i=0;i<N;i++)cout<<MM[i]<<endl;}void dw(int n,int H,int W,double *si,string *m ) {double sum=0,sm=0;int a1=W-H;if(a1>=1){for(int j=H;j<=W;j++)sum+=*(si+j);double b[n];for(int i=H;i<=W;i++){sm+=*(si+i);b[i]=fabs(2*sm-sum)/sum;}int ZH;double a=b[H];for(int i=H;i<=W;i++)if(b[i]<=a){a=b[i];ZH=i;}for(int i=H;i<=W;i++){if(i<=ZH) m[i]+='0';else m[i]+='1';}int nn=n;double *ss;ss=si;string *mm;mm=m;if(ZH==H)dw(nn,ZH+1,W,ss,mm);else if(ZH==W-1)dw(nn,H,ZH,ss,mm);else{dw(nn,H,ZH,ss,mm);dw(nn,ZH+1,W,ss,mm);}}}实验三.霍夫曼一、程序流程图二、 程序清单#include<iostream>#include<string>using namespace std;struct HNode{double weight;int parent;int lchild;int rchild;};void HuffmanTree(HNode *HuffNode,int n,double *si,string *m); int hc(string m);void nv(string *m,int n);int main(){int N;cout<<"输入信源个数"<<endl;cin>>N;double *S=new double[N];cout<<"输入信源概率"<<endl;for(int i=0;i<N;i++)cin>>S[i];string *MM=new string[N];for(int i=0;i<N;i++){for(int j=i;j<N;j++){if(S[i]<S[j]){double a;a=S[i];S[i]=S[j];S[j]=a;}}}HNode *node=new HNode[2*N-1];HuffmanTree(node,N,S,MM);nv(MM,N);cout<<"输出编码"<<endl;for(int i=0;i<N;i++)cout<<MM[i]<<endl;}void HuffmanTree(HNode *HuffNode,int n,double *si,string *m) {int i,j,x1,x2,c,p;float m1,m2;for (i=0;i<2*n-1;i++){HuffNode[i].weight=0;HuffNode[i].parent=-1;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;}for (i=0;i<n;i++){HuffNode[i].weight=si[i];}for (i=0;i<n-1;i++){m1=m2=1;x1=x2=0;for (j=0;j<n+i;j++){if (HuffNode[j].parent==-1&&HuffNode[j].weight<m1){m2=m1;x2=x1;m1=HuffNode[j].weight;x1=j;}else if (HuffNode[j].parent==-1&&HuffNode[j].weight<m2){m2=HuffNode[j].weight;x2=j;}}HuffNode[x1].parent=n+i;HuffNode[x2].parent=n+i;HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;HuffNode[n+i].lchild=x1;HuffNode[n+i].rchild=x2;}for(i=0;i<n;i++){c=i;p= HuffNode[c].parent;while(p!=-1){if(HuffNode[p].lchild ==c)m[i]+='0';elsem[i]+='1';c=p;p=HuffNode[c].parent;}}}int hc(string m){int a=0;for(int i=0;m[i]!='\0';i++)a++;return a;}void nv(string *m,int n){char mn[n];int b;for(int i=0;i<n;i++){b=hc(m[i]);for(int j=0;j<b;j++){mn[j]=m[i][b-j-1];}m[i]=mn;}}实验四.信道一、程序流程图三、程序清单#include <stdlib.h>#include <iostream>#include <math.h>using namespace std;int main(){int ni,no;int i,j;cout<<"输入信源个数"<<endl;cin>>ni;cout<<"输出信源个数"<<endl;cin>>no;double *Si=new double[ni];double *So=new double[no];cout<<"输入信源概率"<<endl;for (i=0;i<ni;i++){cin>>Si[i];}cout<<endl;//再输入信道转移概率矩阵//注意进行判断,某行如果总概率大于1,则出现错误应从新输入cout<<"输入转移概率:"<<endl;float **p; //转移条件概率p=new float *[ni];for (i=0;i<ni;i++){p[i]=new float[no];}for (i=0;i<ni;i++){for (j=0;j<no;j++){cin>>p[i][j];}}for (i=0;i<ni;i++){float a=0;for (j=0;j<no;j++){a+=p[i][j];}if (a!=1.0){cout<<"输入数据有误,请检查后再次输入。

信息论实习报告

信息论实习报告

实习报告实习单位:某某信息科技有限公司实习时间:2023年2月18日至2023年3月18日实习岗位:信息论实习生一、实习背景及目的随着信息技术的快速发展,信息论作为一门研究信息传输和处理的理论基础,在各领域中发挥着越来越重要的作用。

为了加深我对信息论知识的理解,提高实际操作能力,我选择了某某信息科技有限公司进行为期一个月的实习。

实习目的在于将所学理论知识与实际工作相结合,拓宽知识面,培养实践操作技能。

二、实习内容及收获1. 实习内容(1)参与公司项目研发,负责信息传输过程中的信号处理和编码工作。

(2)协助工程师进行实验室测试,收集实验数据,分析实验结果。

(3)学习公司内部技术文档,了解公司的信息论技术应用和发展方向。

(4)参加公司组织的培训课程,提升自己在信息论方面的专业知识。

2. 实习收获(1)理论知识应用:通过实际参与项目研发,我将所学的信息论知识应用于实际工作中,提高了理论知识的实际运用能力。

(2)实践操作技能:在实验室测试过程中,我学会了使用各种测试设备,掌握了实验数据的收集和分析方法。

(3)团队协作:与公司同事共同完成项目任务,我学会了如何进行有效沟通,提高了团队协作能力。

(4)行业认识:通过实习,我更加了解了信息论在实际应用中的重要性,以及对相关行业的发展趋势有了更深入的认识。

三、实习中遇到的问题及解决办法在实习过程中,我遇到了一些问题,主要包括:(1)理论知识与实际应用的衔接:在实际工作中,我发现所学理论知识并不能直接应用于实际问题,需要不断地学习和摸索。

(2)技术难题:在项目研发过程中,遇到了一些技术难题,需要向工程师请教和寻求帮助。

解决办法:(1)加强学习:通过阅读相关资料和参加公司培训,提高自己的理论水平和实际操作能力。

(2)积极请教:遇到问题时,主动向工程师请教,争取他们的指导和帮助。

四、实习总结通过本次实习,我对信息论在实际应用中的重要性有了更深入的认识,同时自己的实践操作能力和团队协作能力也得到了锻炼和提高。

信息论实验报告

信息论实验报告

桂林理工大学实验报告班级:通信09-2班学号:3090731219 姓名:崔泽实验名称:计算离散信源的熵日期:2011年5月10日一、实验目的1、熟悉离散信源的特点2、熟悉离散信源平均信息量的计算方法二、实验内容1、写出计算自信息量的Matlab程序2、写出计算离散信源平均信息量的Matlab程序3、掌握二元离散信源的最大信息量与概率的关系4、完成习题三、习题1、程序:x=[0.5 0.25 0.125 0.125 ];y=[0.875 0.125];b=-x.*log2(x)H1=sum(b)c=-y.*log2(y)H1=sum(c)X=-log2(x)Y=-log2(y)程序运行结果:b = 0.5000 0.5000 0.3750 0.3750H1 =1.7500c = 0.1686 0.3750H1 = 0.5436X = 1 2 3 3Y =0.1926 3.0000由上面结果可以看出,甲信源的熵为: 1.7500已信源的熵为:0.5436甲地各种天气的信息量晴,云,大雨,小雨分别为1 2 3 3已地各种天气的信息量晴,小雨分别为0.1926 3.00002、Matlab程序:x=[1/4 1/8 1/8 3/16 5/16];a=-x.*log2(x);H=sum(a)程序运行结果:H = 2.22723、Matlab程序:X=[1/4 1/8 1/8 1/2];a=-x.*log2(x);H=sum(a)程序运行结果:H = 1.75003、Matlab程序:p=0.00011:0.1:0.99999;x=[p,1-p];a=-x.*log2(x);H=sum(a)plot(x,a)pHH = 7.0879当p呈等概率分布时,平均信息量达到最大值7.0879桂林理工大学实验报告班级:通信09-2班学号:3090731225 姓名:崔泽实验名称:离散信道德平均互信息及其信道容量的计算日期:2011年5月20日一、实验目的1、了解信道传输概率的状态图和信道转移概率的矩阵的特点2、了解什么是信道容量和最佳输入概率分布3、熟悉计算平均互信息和信道容量的计算步骤二、实验内容1、写出计算互信息和平均互信息的Matlab程序2、写出计算几种特殊离散信道的信道容量的Matlab程序3、完成习题三、习题1、Matlab程序:w=0.01:0.1:0.99;a1=log2(0.8./(0.6.*w+0.2));a2=log2(0.2./((-0.6).*w+0.8))I=0.8.*w.*a1+0.2.*(1-w).*a2+0.2.*w.*a2+0.8.*(1-w).*a1plot(w,I)程序运行结果:Imax=1.1681;即 C=1.1681;2、(1)原理:C=logr Matlab程序:r=3;c=log2(r)运算结果:c =1.5850(2)原理:C=log2(s)Matlab程序:S=2;C=log2(s)运行结果:C=1(3)原理:C=log2(s)-H(p1,p2,…,ps); Matlab程序:s=4;c=log2(s)+2/3*log2(1/3)+1/3*log2(1/6) 运行结果:c =0.0817(4)4、一般信道,其信道矩阵为:111244121636113884P⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦桂林理工大学实 验 报 告班级:通信09-2班 学号:3090731225 姓名:崔泽 实验名称:有噪信道编码定理 日期:2011年5月30日一、实验目的1、理解有噪信道编码定理的物理意义2、熟悉 Matlab 编程二、实验内容1、学习应用有噪信道编码定理解决实际问题2、将程序在计算机上仿真实现,验证程序的正确性3、完成习。

信息论课程实验报告

信息论课程实验报告

中国地质大学(武汉)CHINA UNIV ERSIT Y OF GEOSCIENCES信息论课程实验报告指导老师:严军姓名:刘一龙班级:71082-14学号:20081002007中国地质大学(武汉)2011年6月实验一构造(7,4)系统码一、实验题目Construct a systematic (7,4) linear block code. Y ou can use c / MA TLAB / HDL (VHDL or Verilog-HDL) to describe it. Please write the detail of how to realize it in computer language. And list the program lines.二、实验程序算法设计:利用H的线性独立,通过n的二进制形式构造出H,然后利用H构造出G。

本算法具有通用性,不仅可以计算出(7,4)的生成矩阵,还可以构造出(15,11),(31,26)的生成矩阵。

Matlab程序:clc;disp('请输入系统码n的值');n = input('n=');disp('请输入系统码k的值');k = input('k=');r = n-k;temp=[];for i=1:ny=dec2bin(i,r);for j=1:rtemp(i,j)=mod(y(j),2);endendfor i=1:rt = temp(i,:);temp(i,:)=temp(2^(i-1),:);temp(2^(i-1),:)=t;endfor i=1:(fix(r/2))t = temp(:,i);temp(:,i)=temp(:,r-i+1);temp(:,r-i+1)=t;endH = temp';%-----构造矩阵G--------%P=H(:,r+1:n);G=[P',eye(k)];disp('生成矩阵');Gdisp('校验矩阵');H三、实验结果请输入系统码n的值n=7请输入系统码k的值k=4生成矩阵G =1 1 0 1 0 0 01 0 1 0 1 0 00 1 1 0 0 1 01 1 1 0 0 0 1校验矩阵H =1 0 0 1 1 0 10 1 0 1 0 1 10 0 1 0 1 1 1请输入系统码n的值n=15请输入系统码k的值k=11生成矩阵G =Columns 1 through 81 0 1 0 1 0 0 00 1 1 0 0 1 0 01 1 1 0 0 0 1 01 1 0 0 0 0 0 11 0 0 1 0 0 0 00 1 0 1 0 0 0 01 1 0 1 0 0 0 00 0 1 1 0 0 0 01 0 1 1 0 0 0 00 1 1 1 0 0 0 01 1 1 1 0 0 0 0 Columns 9 through 150 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 01 0 0 0 0 0 00 1 0 0 0 0 00 0 1 0 0 0 00 0 0 1 0 0 00 0 0 0 1 0 00 0 0 0 0 1 00 0 0 0 0 0 1校验矩阵H =Columns 1 through 81 0 0 0 1 0 1 10 1 0 0 0 1 1 10 0 1 0 1 1 1 00 0 0 1 0 0 0 0Columns 9 through 151 0 1 0 1 0 10 1 1 0 0 1 10 0 0 1 1 1 11 1 1 1 1 1 1实验二循环码一、实验题目We have already learned how to encode and decode cyclic codes. Please use the generator polynomial g(x)=1+x+x2+x4to construct a (7,3) code. And if the received code vector is [1 1 0 0 1 1 1], how to decode it? Use c / MATLAB / HDL language to realize the encoding and decoding system.二、实验程序算法设计:通过计算自己将生成矩阵G输入到计算机,然后输入要传输的信息m,利用c=mG 自动生成码字c。

信息论实验报告

信息论实验报告

一、实验目的1. 理解信息论的基本概念和原理;2. 掌握信息熵、条件熵、互信息等基本概念的计算方法;3. 学会使用 MATLAB 进行信息论实验,并分析实验结果;4. 提高编程能力和数据分析能力。

二、实验原理信息论是一门研究信息传输、处理和存储的学科,其核心是信息熵。

信息熵是衡量信息不确定性的度量,表示信息中所包含的平均信息量。

信息熵的计算公式如下:H(X) = -Σ p(x) log2(p(x))其中,H(X) 表示随机变量 X 的熵,p(x) 表示 X 取值为 x 的概率。

条件熵是衡量在已知另一个随机变量 Y 的条件下,随机变量 X 的不确定性。

条件熵的计算公式如下:H(X|Y) = -Σ p(x,y) log2(p(x|y))其中,H(X|Y) 表示在 Y 已知的条件下 X 的熵,p(x,y) 表示 X 和 Y 同时取值为x 和 y 的概率,p(x|y) 表示在 Y 已知的情况下 X 取值为 x 的条件概率。

互信息是衡量两个随机变量之间相互依赖程度的度量。

互信息的计算公式如下:I(X;Y) = H(X) - H(X|Y)其中,I(X;Y) 表示随机变量 X 和 Y 之间的互信息。

三、实验内容1. 使用 MATLAB 编写程序,计算给定信源的概率分布,并计算其熵;2. 使用 MATLAB 编写程序,计算给定两个随机变量的联合概率分布,并计算其条件熵和互信息;3. 分析实验结果,验证信息熵、条件熵和互信息之间的关系。

四、实验步骤1. 输入信源的概率分布,使用 MATLAB 计算 H(X);2. 输入两个随机变量的联合概率分布,使用 MATLAB 计算 H(X,Y)、H(X|Y) 和I(X;Y);3. 分析实验结果,比较 H(X)、H(X|Y) 和 I(X;Y) 之间的关系。

五、实验结果与分析1. 信源概率分布及其熵输入信源的概率分布为:p(x) = [0.2, 0.3, 0.5]计算得到:H(X) = -0.2 log2(0.2) - 0.3 log2(0.3) - 0.5 log2(0.5) ≈ 1.5852. 两个随机变量的联合概率分布及其条件熵和互信息输入两个随机变量的联合概率分布为:p(x,y) = [0.1, 0.2, 0.3, 0.4]计算得到:H(X,Y) = -0.1 log2(0.1) - 0.2 log2(0.2) - 0.3 log2(0.3) - 0.4log2(0.4) ≈ 2.097H(X|Y) = -0.1 log2(0.1) - 0.2 log2(0.2) - 0.3 log2(0.3) - 0.4log2(0.4) ≈ 1.585I(X;Y) = H(X) - H(X|Y) ≈ 0.512分析实验结果,可以发现:(1)信息熵 H(X) 表示信源中包含的平均信息量,当信源概率分布越均匀时,信息熵越大;(2)条件熵 H(X|Y) 表示在已知随机变量 Y 的条件下,随机变量 X 的不确定性,当 X 和 Y 之间的依赖程度越高时,条件熵越小;(3)互信息 I(X;Y) 表示随机变量 X 和 Y 之间的相互依赖程度,当 X 和 Y 之间的依赖程度越高时,互信息越大。

信息论实验报告

信息论实验报告

前言信息论是现代通信与信息工程的理论基础。

作为电子信息科学与技术专业本科生的学科基础课,本课程主要讲授:信息的定义和测度、信源和信息熵、连续熵和信息变差、信道和互信息、平均互信息和信道容量、数据处理和信息测量理论、无失真信源编码理论和编码方法等内容。

本课程按“单符号离散信息系统”、“多符号离散信息系统”、“连续信息系统”三个“系统”层面,逐步深入展开,以严密的数学分析贯串始终。

通过教学,使学生掌握信息理论的基本概念和信息分析方法,为今后进一步研究信息科学和信息技术打下坚实的理论基础。

实验一:唯一可译码判断实验学时:3实验类型:(演示、验证、综合、√设计、研究)实验要求:(√必修、选修)一、实验目的通过本次试验了解唯一可译码地判断原理;实现用C语言编写判断唯一可译码地程序二、实验内容编程实现唯一可译码的判决准则―――Sardinas-Patterson算法三、实验原理、方法和手段Sardinas-Patterson算法描述:设C为码字集合,按以下步骤构造此码的尾随后缀集合F:(1) 考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中;(2) 考查C和Fi两个集合,若Wj∈C是Wi∈Fi的前缀或Wi∈Fi是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;(3)F=∪Fi即为码C的尾随后缀集合;(4) 若F中出现了C中的元素,则算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。

在我们设计的算法中,需要注意的是我们需要的是先输出所有尾随后缀的集合,然后再判断该码是否是唯一可译码,即如F中出现了C中的元素,则C不是唯一可译码,否则若F中没有出现新的元素,则C为唯一可译码。

而不是F中出现C中的元素就终止,这也是在本题的要求中需要注意的问题。

1、概要设计:由于需要判断尾随后缀,所以我们需要反复的比较C和F中的码字。

1)首先我们用一个b[30][30]的数组来存放所有的尾随后缀的集合;用Q记录所有尾随后缀的个数;2)用数组a[30][30]来存放输入的码字,L[30]来存放码字的长度;通过一个双重循环并调用houzhui(a[i],a[j],L[i],L[j])函数来找到a[30][30]中的为随后缀,即:for(i=0;i<n-1;i++){for(j=0;j<n;j++){if(i!=j&&L[i]<L[j])HuoZhui(a[i],a[j],L[i],L[j]);}}3)通过判断Q是否大于0,如果不大于0,即b[30][30]中没有码字,也就是不存在尾随后缀,那么可判断a[30][30]是唯一可译码,否则进行如下操作;4)计算b[30][30]中尾随后缀的长度,用k1表示;并调用HuoZhui(b[i],a[j],k1,L[j])其中k1<L[j]来a[30][30]中所存在的后缀,并加入到b[30][30]中,通过一个循环,找到a[30][30]中所有尾随后缀;即for(i=0;i<Q;i++){k1=strlen(b[i]);for(j=0;j<n;j++){if(k1<L[j])HuoZhui(b[i],a[j],k1,L[j]);}}5)寻找b[30][30]中的尾随后缀;用k2表示b[30][30]中码字的长度,并调用HuoZhui(a[i],b[j],L[i],k2)来实现,其中k2>L[j];通过循环调用即可找到b[30][30]中的所有尾随后缀,最后再将他们分别存放在b[30][30]中;即通过for(i=0;i<n;i++){for(j=0;j<Q;j++){k2=strlen(b[j]);if(k2>L[i]){HuoZhui(a[i],b[j],L[i],k2);}}}6)在反复调用HuoZhui(a[i],a[j],L[i],L[j])函数中如果b[30][30]中有重复出现的,即尾随后缀相同的不用再次放入b[30][30]中。

最新《信息论基础》实验报告-实验1

最新《信息论基础》实验报告-实验1

最新《信息论基础》实验报告-实验1实验目的:1. 理解信息论的基本概念,包括信息熵、互信息和编码理论。

2. 通过实验掌握香农信息熵的计算方法。

3. 学习并实践简单的数据压缩技术。

实验内容:1. 数据集准备:选择一段英文文本作为实验数据集,统计各字符出现频率。

2. 信息熵计算:根据字符频率计算整个数据集的香农信息熵。

3. 编码设计:设计一种基于频率的霍夫曼编码方案,为数据集中的每个字符分配一个唯一的二进制编码。

4. 压缩与解压缩:使用设计的霍夫曼编码对原始文本进行压缩,并验证解压缩后能否恢复原始文本。

5. 性能评估:比较压缩前后的数据大小,计算压缩率,并分析压缩效果。

实验步骤:1. 从文本文件中读取数据,统计每个字符的出现次数。

2. 利用统计数据计算字符的相对频率,并转换为概率分布。

3. 应用香农公式计算整个数据集的熵值。

4. 根据字符频率构建霍夫曼树,并为每个字符生成编码。

5. 将原始文本转换为编码序列,并记录压缩后的数据大小。

6. 实现解压缩算法,将编码序列还原为原始文本。

7. 分析压缩前后的数据大小差异,并计算压缩率。

实验结果:1. 原始文本大小:[原始文本大小]2. 压缩后大小:[压缩后大小]3. 压缩率:[压缩率计算结果]4. 霍夫曼编码表:[字符与编码的对应表]实验讨论:- 分析影响压缩效果的因素,如字符集大小、字符频率分布等。

- 讨论在实际应用中,如何优化编码方案以提高压缩效率。

- 探讨信息论在数据压缩之外的其他应用领域。

实验结论:通过本次实验,我们成功地应用了信息论的基本原理,通过霍夫曼编码技术对文本数据进行了有效压缩。

实验结果表明,基于字符频率的霍夫曼编码能够显著减少数据的存储空间,验证了信息论在数据压缩领域的有效性和实用性。

信息论实验报告实验1

信息论实验报告实验1

信息论实验报告一实验一1、实验内容(1)英文信源由26个英文字母和1个空格组成,假定字符从中等概选取,那么一条100个字符的信息提供的信息量为多少?(2)若将27个字符分为三类,9个出现概率占2/7,13个出现概率占4/7,5个出现占1/7,而每类中符号出现等概,求该字符信源的信息熵。

2、设计思路及步骤I=log2P iH(X)=∑−P i log2Pii26个字母和一个空格,因等概选取可以先求得其中一个字符的信息量,通过扩展实现计算100个字符的信息量。

对于第二问,可以将字符分为三组,又因每组字符的概率相等,因此可以求出每组每一个字符的概率。

通过信息熵的定义可以求出结果。

3、程序代码及调试过程4、出现的问题及解决方法(1)没有看清题目要求,漏掉空格(2)是否可以将三组字符看作整体5、结果及说明通过实验结果可以看出100个字符的信息量,以及字符信源熵。

比较H2与H3可以看出,并不可以简单的将三组数据看作整体。

6、实验总结本实验通过计算多字符的信息量与分组信息熵,让我们加深了信息论中有关信息量与信息熵的概念与定义,同时也让我们熟悉了matlab的基本操作。

实验二1、实验内容绘制二进制信源熵函数曲线。

2、设计思路及步骤根据信源熵的定义以及公式计算出熵,通过matlab的矩阵运算计算出熵数组,然后通过plot函数画出图像。

3、程序代码及调试过程4、出现的问题及解决方法矩阵乘法出错,,需要使用matlab中的点乘5、结果及说明信源熵的图像为凸形曲线,熵在信源等概分布时取最大值,先增大再减小。

6、实验总结本实验通过对信源熵的作图让我们熟悉了matlab中图像生成函数,以及矩阵运算。

实验三,四1、实验内容求信源的熵和其二次、三次扩展信源的熵。

离散二维平稳信源的概率空间:求:(a)信源符号之间无依赖性时,信源X的信息熵H(X);(b)信源符号有依赖性时的条件熵H(X2|X1);(c)联合熵H(X1X2);(d)根据以上三者之间的关系,验证结果的正确性。

信息论实验报告(实验三、香农编码)

信息论实验报告(实验三、香农编码)

学生实验报告 院别 电子工程学院课程名称 信息论与编码 班级实验名称 实验三、香农编码 姓名实验时间 学号指导教师 成绩报 告 内 容 一、实验目的和任务1、理解信源编码的意义; 2、熟悉 MATLAB 程序设计; 3、掌握香农编码的方法及计算机实现; 4、 对给定信源进行香农编码,并计算编码效率;二、实验原理介绍给定某个信源符号的概率分布,通过以下的步骤进行香农编码1、信源符号按概率从大到小排列;12.......n p p p ≥≥≥2、确定满足下列不等式的整数码长i K 为()()1i i i lb p K lb p -≤<-+3、为了编成唯一可译码,计算第i 个消息的累加概率:4、将累加概率i P 变换成二进制数;5、取i P 二进制数的小数点后i K 位即为该消息符号的二进制码字。

三、实验设备介绍1、计算机2、编程软件MATLAB6.5以上四、实验内容和步骤对如下信源进行香农编码,并计算编码效率。

12345670.200.190.180.170.150.100.01X a a a a a a a P ⎡⎤⎡⎤=⎢⎥⎢⎥⎣⎦⎣⎦(1)先对信源概率进行从大到小的排序(2)计算第i 个消息的累加概率以及每个消息的码长K (i )11()i i k k P p a -==∑(3)调用子函数将累加概率的十进制表示转换成二进制(4)取第i个累加概率二进制的小数点后的K(i)位,即为该消息符号的二进制码字。

五、实验数据记录六、实验结论与心得通过本次实验,加强了对matlab程序的学习,进一步提高了我的编程能力。

信息论课程设计实验报告

信息论课程设计实验报告

《信息论课程设计》实验报告题目 1:实现香农编码及计算其编码效率题目 2:实现有噪信道编码中的循环码院系(部):计算机科学与技术学院专业及班级:信息与计算科学1301班姓名:唐诗韵学号: 1308060105 日期: 2016/01/10目录1. 课题描述 (1)2. 信源编码的相关介绍 (2)3. 香农编码(题目一) (3)3.1. 香农编码算法 (3)3.2. 香农编码特点 (4)4. 香农编码的C++程序实现 (4)4.1. 程序设计 (4)4.2. 运行结果 (6)5. 实现有噪信道中的循环码编码方法(题目二) (6)5.1. 循环码编码算法 (6)5.2. 循环码编码特点 (7)6. 循环码编码的C++程序实现 (7)6.1. 程序设计 (7)6.2. 运行结果 (9)7. 总结 (10)8. 参考文献 (11)1.课题描述信息论是一门理论和实践相结合的专业,因此相关题目都是来自于实践,同时具有上机练习的可操作性,此门科目是通信的基础。

香农1984年发表的一篇论文标志着信息论诞生,在他的论文中主要用概率来描述有效传输信息的问题,用概率给予了信息的定量描述方法,并提出了信源熵的概念,在现实生活中,人们经常把消息和信息分不清,认为消息就是信息,实则不是,消息是描述实物,而信息是定量描述一个消息所传输的信息量,通常用自信息量来描述一个消息所传达的信息量,它取值为此事件发生的概率的负对数,它表示一个事件发生之前此事件发生的不确定性大小,也表示一个事件发生后它所能提供的信息量,两个相互独立的消息所提供的信息量等于各自信息量之和。

此外,还可用互信息来描述信息的传达,为一个事件给出关于另一个事件的信息量,也表示事件y出现后信宿获得的关于x的信息量,互信息的引出,使信息的传递得到了定量的表示。

如果事件是以序列的形式表示的,及事件集,则用平均自信息量来表示信源所传递的信息,平均信息量表示信源的平均不确定性,比如抛掷一枚硬币的试验所包含的平均信息量。

信息论课程实验报告—唯一可译码的判定

信息论课程实验报告—唯一可译码的判定

return ISUDC; } /************************************************************************/ /* 该函数是用来对每个 pPostfix 和原码字序列进行比较, 如果重复了则在 pRetnBuf 中 /* 返回本身.并返回 1.否则如果没有得到新的后缀码的话返回 0 表示无重复*/ /* Stack 用来存储递归中产生的后缀码集合,这样确保每次得到的后缀码不会重复 /* 防止进去死循环 /************************************************************************/ int GetBacktraceSeq(const pCharVector& pCode,char* pPostfix,pCharVector& Stack,char** pRetnBuf) { char* iter1; for (int i = 0; i < pCode.size(); i++) { iter1 = pCode.at(i); int nRetn = IsPrefix(iter1,pPostfix); if (nRetn == ISSAME) { //第一次进来的话由于是码字序列内部的比较,所以 //肯定会遇到自己跟自己比较然后相等的情况,对该情况不允考虑 if(Stack.size() == 0) continue; *pRetnBuf = new char[strlen(pPostfix) + 1]; strcpy(*pRetnBuf,pPostfix); return 1; } if (ISPREFIX == nRetn) { //新得到的后缀码已经重复了,跳过对他的处理 if(PushBackUniqueValue(Stack,iter1) == false) continue; char* pTemp = NULL; //递归处理下一个后缀码 if(GetBacktraceSeq(pCode,pPostfix+strlen(iter1),Stack,&pTemp) == 0) { *pRetnBuf = NULL; Stack.pop_back(); continue; } Stack.pop_back(); //递归过程中遇到重复码字,算法应立即返回. //将自身和递归得到的后面的后缀码组合成一个歧义序列返回 char* pNewTraceSeq = new char[strlen(iter1) + strlen(pTemp) + 1]; pNewTraceSeq[0] = 0; strcat(pNewTraceSeq,iter1); strcat(pNewTraceSeq + strlen(iter1),pTemp); delete[] pTemp;

信息类实验设计实验报告(3篇)

信息类实验设计实验报告(3篇)

第1篇实验名称:信息类实验实验目的:1. 掌握信息处理的基本方法和技巧。

2. 熟悉信息检索工具的使用。

3. 提高信息分析和综合能力。

实验时间:2021年X月X日实验地点:XX大学信息检索实验室实验器材:1. 计算机2. 信息检索系统3. 信息处理软件实验人员:XX(姓名)、XX(姓名)实验步骤:一、实验准备1. 确定实验主题:选择一个与专业相关的主题,例如“人工智能在医疗领域的应用”。

2. 熟悉信息检索系统:了解所使用的信息检索系统的基本操作和功能。

3. 准备信息处理软件:安装并熟悉信息处理软件,如Excel、SPSS等。

二、信息检索1. 使用信息检索系统,以关键词“人工智能”、“医疗”进行检索。

2. 分析检索结果,筛选出与实验主题相关的文献资料。

3. 下载并整理检索到的文献资料。

三、信息处理1. 使用信息处理软件对文献资料进行整理,包括文献的分类、排序等。

2. 对文献内容进行摘要和总结,提炼出关键信息。

3. 对整理后的信息进行统计分析,得出实验结论。

四、实验结果分析1. 通过信息检索,共检索到100篇与实验主题相关的文献资料。

2. 经过筛选,选出30篇具有代表性的文献资料。

3. 对30篇文献资料进行整理和分析,得出以下结论:(1)人工智能在医疗领域的应用主要体现在辅助诊断、治疗和康复等方面。

(2)目前,人工智能在医疗领域的应用还存在一些挑战,如数据质量、算法可靠性等。

(3)未来,人工智能在医疗领域的应用前景广阔。

五、实验总结1. 通过本次实验,掌握了信息处理的基本方法和技巧,提高了信息检索能力。

2. 熟悉了信息检索系统的使用,为今后的研究提供了便利。

3. 培养了信息分析和综合能力,为今后的学术研究奠定了基础。

实验报告:一、实验背景随着信息技术的快速发展,信息处理在各个领域都发挥着越来越重要的作用。

为了提高信息处理能力,我们进行了本次实验,旨在掌握信息处理的基本方法和技巧,熟悉信息检索工具的使用,提高信息分析和综合能力。

实验1-信息论相关实验实验报告

实验1-信息论相关实验实验报告

信息论与编码实验一实验报告学生姓名周群创指导教师张祖平学号 ********** 专业班级电子信息1101实验一关于信源熵的实验一、实验目的1. 掌握离散信源熵的原理和计算方法。

2. 熟悉matlab 软件的基本操作,练习使用matlab 求解信源的信息熵。

3. 自学图像熵的相关概念,并应用所学知识,使用matlab 或其他开发工具求解图像熵。

4. 掌握Excel 的绘图功能,使用Excel 绘制散点图、直方图。

二、实验原理1. 离散信源相关的基本概念、原理和计算公式产生离散信息的信源称为离散信源。

离散信源只能产生有限种符号。

随机事件的自信息量I(x i)为其对应的随机变量x i 出现概率对数的负值。

即:I(x i)= -log2 p(x i)随机事件X 的平均不确定度(信源熵)H(X)为离散随机变量x i 出现概率的数学期望,即:H(X )=-∑p(x )I (x ) =-∑p(x ) log p(x )2. 二元信源的信息熵设信源符号集X={0,1},每个符号发生的概率分别为p(0)=p,p(1)=q,p+ q=1,即信源的概率空间为则该二元信源的信源熵为:H(X) = - p log p –q log q = - p log p – (1- p) log (1- p)即:H (p) = - p log p – (1- p) log (1- p) 其中 0 ≤p ≤13. MATLAB 二维绘图用matlab 中的命令plot(x, y)就可以自动绘制出二维图来。

例1-2,在matlab 上绘制余弦曲线图,y = cos x,其中0 ≤x ≤2。

>>x=0:0.1:2*pi; %生成横坐标向量,使其为0,0.1,0.2,…,6.2>>y=cos(x); %计算余弦向量>>plot(x,y) %绘制图形4. MATLAB 求解离散信源熵求解信息熵过程:1) 输入一个离散信源,并检查该信源是否是完备集。

信息论实验

信息论实验

北京科技大学UNIVERSITY OF SCIENCE AND TECHNOLOGY BEIJING 信息论实验报告学院:计算机与通信工程学院一1.实验目的(1)进一步熟悉唯一可译码判决准则(2)掌握C语言字符串处理程序的设计和调试技术2.实验要求(1)已知:信源符号个数q、码字集合C(2)输入:任意的一个码。

码字个数和每个具体的码字在运行时从键盘输入(3)输出:判决(是唯一可译码/不是唯一可译码)3.实验代码#include<stdio.h>#include<string.h>#define MAX 100char c[MAX][MAX];char f[MAX][MAX];int N,sum=0;int flag;void patterson(char c[],char d[]){int i,j,k;for(i=0;;i++){if(c[i]=='\0'&&d[i]=='\0') //2字符串一样,就跳出break;if(c[i]=='\0') //若d比c长,将d的尾随后缀放入f中{for(j=i;d[j]!='\0';j++) f[sum][j-i]=d[j];f[sum][j-i]='\0';for(k=0;k<sum;k++){if(strcmp(f[sum],f[k])==0) /*看当前生成的尾随后缀在f集合中是否存在*/ {sum--;break;}}sum++;break;}if(d[i]=='\0') //c比d长,将c的尾随后缀放入f中{for(j=i;c[j]!='\0';j++) f[sum][j-i]=c[j];f[sum][j-i]='\0';for(k=0;k<sum;k++){if(strcmp(f[sum],f[k])==0) /*查看当前生成的尾随后缀在f集合中是否存在*/{sum--;break;}}sum++;break;}if(c[i]!=d[i])//字符不一样了也退出break;}}/*主函数*/main(){int i,j;printf("输入码字的个数:");scanf("%d",&N);while(N>100){printf("输入码字个数过大,请输入小于100的数\n");printf("请输入码字的个数:");scanf("%d",&N);}flag=0;printf("请分别输入码字,长度<100个字符):\n");for(i=0;i<N;i++){scanf("%s",&c[i]);}for(i=0;i<N-1;i++)//判断如果码本身是否重复for(j=i+1;j<N;j++){if(strcmp(c[i],c[j])==0){flag=1;break;}}if(flag==1)//如果码本身有重复,就可以断定它不是唯一可译码{printf("这不是唯一可译码。

信息论实验一实验报告范文

信息论实验一实验报告范文

信息论实验一实验报告范文一、简要总结信源的熵、信道容量的物理意义,概念:信源熵的物理意义:指信源中的各个符号的平均不确定性;熵是信源符号的平均信息量,是信源符号的平均不确定度。

信道容量概念:在信道可以传输的基本前提下,对信源的一切可能的概率分布而言,信道能够传输的最大(接收)熵速率称为信道容量。

意义:求出了某个信道的信道容量,也就找到了信源的最佳概率分布。

从而指导人们改造信源,使之最大可能地利用信道的传输能力。

二、写出离散信源熵、离散信道容量计算的基本步骤,画出实现离散信源熵、离散信道容量计算的程序流程图。

离散信源熵的计算步骤:q1Hr某Elogrpailograip(ai)i1信道容量的计算步骤:CI某;Ybit/符号ma某P某实现离散信源熵的计算流程图:输入P(ai)H(某)=0,i=1H(某)=H(某)+P(a1)logr(1/a1)i“”实现离散信道容量计算的程序流程图:输入p(某i)p(0)(某i)p(yj/某i)aie某pp(yj/某i)lnp(某i)p(yj/某i)jiC1n1,nlnp(某i)aiiC2n1,nlnma某aiiC1n1,nC2n1,n是CC1n1,n结束p(某i)p(某i)aip(某i)aii否三、实现离散信源熵、离散信道容量计算的matlab源程序:离散信源的熵(借助习题2.16)和离散信道容量(借助习题3.6)分析习题2.16的matlab程序:Clearall;%清除所有变量P某=[0.70.3];P=0;%输入信源概率,P某=p(某)H某=-P某某log2(P 某’)%计算信源的熵H(某)Py某=[0.90.2;0.10.8];p某=[0.70.3;0.70.3];%Py某为条件概率P某y=Py某.某p某;fori=1:2 h某某(i,1)=-P某y(I,:)某log2(P某y(i,:)’);P=P+h某某(i,1);%计算H(某^2)endh2某=P/2%计算H2(某)程序运行结果:H某=0.8813H2某=0.7131习题3.6的matlab程序:clearall;%清除所有变量a=0;p=[2/31/3;1/32/3];%信道矩阵Pfori=1:2,a=a+p(1,i)某log2(p(1,i));endC=log2(2)+a%计算对称离散信道的信道容量Cfori=1:2,p1(i)=1/2;endp1%最佳输入概率分布程序运行结果C=0.0817p1=0.50000.50004、讨论信源的熵的大小与前后符号之间相关性的关系,讨论信道容量与信源先验概率及信道转移概率的关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告学院:专业:班级:姓名:学号:实验日期:实验名称:实验一:唯一可译码判别准则的代码实现实验二:霍夫曼编码的代码实现实验目的:实验一:1.进一步熟悉唯一可译码判别准则;2.掌握C 语言字符串处理程序的设计和调试技术。

实验二:1.进一步熟悉Huffman 编码过程;2.掌握C 语言递归程序的设计和调试技术。

实验仪器:装有visual studio 2010 的电脑一台实验原理:实验一:根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。

算法:1、考察 C 中所有的码字,若Wi 是Wj 的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1 中;2、考察C 和Fi 俩个集合,若Wi ∈C 是Wj∈F 的前缀或Wi ∈F 是Wj∈C 的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1 中;3、F=∪Fi 即为码C 的尾随后缀集合;4、若F 中出现了C 中的元素,算法终止,返回假(C 不是唯一可译码);否则若F 中没有出现新的元素,则返回真。

实验二:1.将q 个信源符合按概率大小递减排列;2.用“0,1”码符号分别代表概率最小的两个信源符号,并将这两个概率最小的信源符号合并成一个,从而得到只包含q-1 个符号的新信源,称为缩减信源s 1;3.把缩减信源s1的符号仍按概率大小递减次序排列,再将其最后两个概率最小的信源符号分别用“0”和“1”码符号表示,并且合并成一个符号,这样又形成了q-2 个信源符号的缩减信源s 2;4.依次继续下去,直至信源符号最后只剩下两个信源符号为止,将这最后两个信源符号分别用二元码符号“0”和“1”表示;5.然后从最后一级缩减信源开始,进行回溯,就得到各信源符号所对应的码符号序列,即对应的码字。

实验内容与步骤:实验一:1.已知:信源符号数和码字集合C;2.输入:任意的一个码,码字的个数和每个具体的码字在运行时从键盘输入;3.输出:判决(是唯一可译码/不是唯一可译码);循环(若继续判决则输入1 循环判决,否则输入0 结束运行)。

实验二:1. 输入:信源符号个数r、信源的概率分布P;2. 输出:每个信源符号对应的Huffman 编码的码字。

实验数据:实验一源代码:#include<stdio.h>#include<string.h>char c[100][50];char f[300][50];int N,sum=0;int flag;void patterson(char c[],char d[]){int i,j,k;for(i=0;;i++){if(c[i]=='\0'&&d[i]=='\0')break;if(c[i]=='\0'){for(j=i;d[j]!='\0';j++) f[sum][j-i]=d[j];f[sum][j-i]='\0';for(k=0;k<sum;k++){if(strcmp(f[sum],f[k])==0){sum--;break;}}sum++;break;}if(d[i]=='\0'){for(j=i;c[j]!='\0';j++) f[sum][j-i]=c[j];f[sum][j-i]='\0';for(k=0;k<sum;k++){if(strcmp(f[sum],f[k])==0){sum--;break;}}sum++;break;}if(c[i]!=d[i])break;}}void yima(){int i,j;printf(" 请输入码字的个数:");scanf("%d",&N);flag=0;printf(" 请分别输入码字:\n");for(i=0;i<N;i++){scanf("%s",&c[i]);}for(i=0;i<N-1;i++)for(j=i+1;j<N;j++){if(strcmp(c[i],c[j])==0){flag=1;break;}}if(flag==1){printf(" 这不是唯一可译码。

\n");}else{for(i=0;i<N-1;i++){for(j=i+1;j<N;j++){patterson(c[i],c[j]);}}for(i=0;;i++){int s=0;for(j=0;j<N;j++){if(i==sum){ s=1;break;}elsepatterson(f[i],c[j]);}if(s==1)break;}for(i=0;i<sum;i++){for(j=0;j<N;j++){if(strcmp(f[i],c[j])==0){flag=1;break;}}}if(flag==1){printf(" 这不是唯一可译码!\n");}elseprintf(" 这是唯一可译码!\n");}}void main(){int flag=1;while(flag){yima();printf(" 是否继续判别?1/0\n");scanf("%d",&flag);}}实验二源代码:#include<stdio.h>#include<stdlib.h>#define N 50#define maxval 10000.0#define maxsize 100typedef struct{char ch;float weight;int lchild,rchild,parent;}hufmtree;typedef struct{char bits[N]; //位串int start; //编码在位串中的起始位置char ch; //字符}codetype;void huffman(hufmtree tree[]);void huffmancode(codetype code[],hufmtree tree[]); int n;int m;void main(){int i,j;printf(" 输入信源符号个数\n");scanf("%d",&n);getchar();m = 2*n-1;hufmtree tree[2*N-1];codetype code[N];huffman(tree);huffmancode(code,tree);printf(" 输出每个字符的哈夫曼编码\n");for(i=0;i<n;i++){printf("%c: ",code[i].ch);for(j=code[i].start;j<n;j++)printf("%c ",code[i].bits[j]);printf("\n");}system("pause");}void huffman(hufmtree tree[]){int i,j,p1,p2;float small1,small2,f;char c;for(i=0;i<m;i++){tree[i].parent=0;tree[i].lchild=-1;tree[i].rchild=-1;tree[i].weight=0.0;}printf(" 依次读入前%d 个结点的字符及权值(空格隔开)\n",n);for(i=0;i<n;i++){printf(" 输入第%d 个字符为和权值",i+1);scanf("%c %f",&c,&f);getchar();tree[i].ch=c;tree[i].weight=f;}for(i=n;i<m;i++){p1=0;p2=0;small1=maxval;small2=maxval;for(j=0;j<i;j++)if(tree[j].parent==0)if(tree[j].weight<small1){small2=small1;small1=tree[j].weight;p2=p1;p1=j;}elseif(tree[j].weight<small2){small2=tree[j].weight;p2=j;}tree[p1].parent=i;tree[p2].parent=i;tree[i].lchild=p1;tree[i].rchild=p2;tree[i].weight=tree[p1].weight+tree[p2].weight;}}void huffmancode(codetype code[],hufmtree tree[]){int i,c,p;codetype cd;for(i=0;i<n;i++){cd.start=n;cd.ch=tree[i].ch;c=i;p=tree[i].parent;while(p!=0){cd.start--;if(tree[p].lchild==c)cd.bits[cd.start]='0';elsecd.bits[cd.start]='1';c=p;p=tree[p].parent;}code[i]=cd;}}实验一运行结果图:实验二运行结果图:实验结果与分析:实验一:由运行结果可知完成了对唯一可译码判别准则的实现实验二:由运行结果可知完成了对霍夫曼编码的实现。

相关文档
最新文档