信息论实验报告
信息论实验报告

信息论实验报告班级:姓名:学号:实验一:信道容量的迭代算法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语言字符串处理程序的设计和调试技术。
信息论课程实验报告—哈夫曼编码

*p2 = j;
}
}
void CreateHuffmanTree(HuffmanTree T)
{
int i,p1,p2;
InitHuffmanTree(T);
InputWeight(T);
for(i = n;i < m;i++)
4)依次继续下去,直至信源最后只剩下两个信源符号为止,将这最后两个信源符号分别用二元码符号“0”和“1”表示;
5)然后从最后—级缩减信源开始,进行回溯,就得到各信源符号所对应的码符号序列,即相应的码字。
四、实验目的:
(1)进一步熟悉Huffman编码过程;(2)掌握C语言递归程序的设计和调试技术。以巩固课堂所学编码理论的知识。
#include "stdio.h"
#include "stdlib.h"
#include <float.h>
#include <math.h>
#define n 8
#define m 2*n-1
typedef struct
{
float weight;
int lchild,rchild,parent;
}
}
void InputWeight(HuffmanTree T)
{
float temp[n] = {0.20,0.18,0.17,0.15,0.15,0.05,0.05,0.05};
for(int i = 0;i < n;i++)
T[i].weight = temp[i];
}
信息论上机实验报告

信息论与编码实验报告实验一:计算离散信源的熵一、实验设备: 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篇)

第1篇一、实验背景随着信息技术的飞速发展,信息已成为现代社会的重要资源。
为了让学生更好地了解信息的基本概念、信息处理技术以及信息在各个领域的应用,我们开展了信息导论实验。
本次实验旨在通过实际操作,使学生掌握信息处理的基本方法,提高信息素养,为后续相关课程的学习打下基础。
二、实验目的1. 理解信息的基本概念,掌握信息处理的基本方法。
2. 掌握信息检索技巧,提高信息获取能力。
3. 了解信息在各个领域的应用,增强信息意识。
4. 培养学生的动手能力和团队协作精神。
三、实验内容1. 信息检索实验:通过搜索引擎、数据库等工具,查找特定主题的相关信息,并评价信息的可靠性。
2. 信息处理实验:运用文字处理软件、表格处理软件等工具,对收集到的信息进行整理、分析、加工和展示。
3. 信息安全实验:学习信息加密、数字签名等安全技术在信息传输和存储中的应用。
4. 信息可视化实验:运用图表、图形等手段,将抽象的信息转化为直观的可视化形式。
四、实验过程1. 实验准备:学生分组,明确实验任务,查阅相关资料,准备实验所需的软件和工具。
2. 实验实施:按照实验指导书的要求,完成各项实验任务。
3. 实验总结:对实验过程中遇到的问题进行分析,总结实验经验,撰写实验报告。
五、实验结果与分析1. 信息检索实验:学生通过搜索引擎、数据库等工具,成功检索到所需信息,并学会评价信息的可靠性。
2. 信息处理实验:学生运用文字处理软件、表格处理软件等工具,对收集到的信息进行整理、分析、加工和展示,提高了信息处理能力。
3. 信息安全实验:学生掌握了信息加密、数字签名等安全技术在信息传输和存储中的应用,增强了信息安全意识。
4. 信息可视化实验:学生通过图表、图形等手段,将抽象的信息转化为直观的可视化形式,提高了信息传达效果。
六、实验心得与体会1. 信息检索实验让我认识到,信息检索是获取信息的重要途径,掌握信息检索技巧对于提高信息素养至关重要。
2. 信息处理实验让我体会到,信息处理能力是信息时代必备的基本技能,通过实际操作,我学会了如何高效地处理信息。
北邮信息论实验报告

信息论实验报告一、实验要求掷骰子游戏,每次同时抛掷两枚骰子,将两枚骰子点数的和作为游戏结果,重复抛掷1000次(视为1000次信源符号输出)。
要求:(1) 对1000次游戏结果进行逐符号二进制定长编码和译码。
(2) 对1000次游戏结果进行逐符号二进制变长编码和译码(Huffman编码)。
(3) 比较上述两种编码的效率二、实验结果(1) 对1000次游戏结果进行逐符号二进制定长编码和译码。
1、随机游戏模拟的信源的熵2、产生的随机序列3、定长码编码译码结果:由于篇幅限制,仅截取部分编码结果:观察出译码正确。
4、定长码编码效率:(2) 对1000次游戏结果进行逐符号二进制变长编码和译码(Huffman编码)。
1、随机游戏模拟的信源的熵:H(X)=3.2744 bit/符号2、Huffman编码的码字结果:3、平均码长:l=3.3056 bit4、部分序列编码、译码结果:信源序列:编码结果:译码结果:5、编码效率:(3)两者编码效率的比较:答:由MATLAB仿真实验的结果可以看出,定长码的编码效率是0.8186,而Huffman 编码的效率是0.9906,明显看出Huffman编码的效率要高。
三、实验代码(2)Huffman编码译码部分:四、实验总结本实验通过MATLAB模拟掷骰子游戏,每次同时抛掷两枚骰子,将两枚骰子点数的和作为游戏结果,重复抛掷1000次(视为1000次信源符号输出)。
然后通过定长编码译码和Huffman编码译码对信源进行处理,最后得到正确的编码译码结果,同时可以看出Huffman编码的效率比定长码高。
由此可以看出在信源各符号出现的概率差别很大时,采用Huffman编码使平均码长最短,编码效率达到最佳。
信息论实验报告香农编码

目录实验目的: (2)实验要求: (2)程序算法: (2)程序运行结果: (4)程序操作步骤: (5)试验中遇到的困难及解决方法: (5)实验心得及体会: (5)实验目的:1.进一步熟悉使用C++编程语言及软件。
2.进一步认识shannon编码过程,并能在学习中灵活运用。
实验要求:要求:(a) 允许使用的编程语言:C、C++、Basic、Pascal、Fortran、Java、Perl、Tk/Tcl(b) 输入:信源符号个数q、信源符号s0,...,sq−1,信源概率分布p0,...,pq−1。
(c) 输出:信源符号与码字的对应关系表(编码表)。
(d) 源程序格式整齐清晰,注释简单明了。
程序算法:(a) 将q 个信源符号按其概率的递减次序排列:p(s0) > p(s1) > ... > p(sq−1)(b) 计算出各个信源符号的累加概率:(c) 按下式计算第i 个消息的二元代码组的码长li:(d) 将累加概率F(si)(十进制小数)变换成二进制小数。
根据码长li 取小数点后li 个二进制符号作为第i 个消息的码字。
程序代码:#include <iostream>#include <math.h>using namespace std;void InsertSort(double r[],char m[] ,int n)//直接插入排序算法按照概率从大到小排列符号和相应概率{for(int i=1;i<n;i++){r[n]=r[i]; //设置哨兵m[n]=m[i]; //设置哨兵for(int j=i-1;(r[n]>r[j])&&(j>=0);j--)//寻找插入位置{r[j+1]=r[j];//记录后移m[j+1]=m[j];//记录后移}r[j+1]=r[n];m[j+1]=m[n];}}void Leijia(double p[], int s)//将当前概率及之前概率相加{for(int r=1;r<s;r++)p[r]=p[r-1]+p[r];}void main(){int geshu,erjinzhi[100][100];int z=0,g=0;double gailv[100],L[100];char fuhao[100];cout<<"请输入需要编码的字符个数(小于100)"<<endl; cin>>geshu;cout<<"请按照先后顺序输入符号"<<endl;for(int i=0;i<geshu;i++)cin>>fuhao[i];cout<<"请输入各相应符号的概率"<<endl;for(int j=0;j<geshu;j++)cin>>gailv[j];InsertSort( gailv,fuhao, geshu);for(z=0;z<geshu;z++){L[z]=-log(gailv[z])/log(2);L[z]=ceil(L[z]);//向上取整求所需要的位数}Leijia( gailv, geshu);for( z=0;z<geshu;z++)//求相应的二进制编码{gailv[z]=gailv[z]-floor(gailv[z]);for( g=0;g<L[z];g++){if((gailv[z]*2)>=1){erjinzhi[z][g]=1;gailv[z]=(gailv[z]*2)-1;}else{erjinzhi[z][g]=0;gailv[z]=gailv[z]*2;}}}cout<<"各信源符号及相应码字分别为"<<endl; for(z=0;z<geshu;z++){cout<<fuhao[z]<<'\t';for( g=0;g<L[z];g++)cout<< erjinzhi[z][g];cout<<endl;}}程序运行结果:程序操作步骤:1.按照提示输入所要编码的符号个数并回车2.按顺序输入要求个数的符号并回车3.按顺序输入各符号相应的概率并回车4.即可得到各符号相应的shannon编码试验中遇到的困难及解决方法:本次试验相对而言比较简单,但由于长时间没有联系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 之间的依赖程度越高时,互信息越大。
信息论算术编码实验报告

实验三算术编码一、实验目的1.进一步学习C++语言概念和熟悉VC 编程环境。
2.学习算术编码基本流程, 学会调试算术编码程序。
3. 根据给出资料,自学自适应0 阶算术编、解码方法。
二、实验内容与原理(一)实验原理:1.算术编码基本原理这是将编码消息表示成实数0 和1 之间的一个间隔,消息越长,编码表示它的间隔就越小,表示这一间隔所需的二进制位就越多。
算术编码用到两个基本的参数:符号的概率和它的编码间隔。
信源符号的概率决定压缩编码的效率,也决定编码过程中信源符号的间隔,而这些间隔包含在0到1之间。
编码过程中的间隔决定了符号压缩后的输出。
首先借助下面一个简单的例子来阐释算术编码的基本原理。
考虑某条信息中可能出现的字符仅有a b c 三种,我们要压缩保存的信息为bccb。
在没有开始压缩进程之前,假设对a b c 三者在信息中的出现概率一无所知(采用的是自适应模型),暂认为三者的出现概率相等各为1/3,将0 - 1 区间按照概率的比例分配给三个字符,即a 从0.0000 到0.3333,b 从0.3333 到0.6667,c 从0.6667 到1.0000。
进行第一个字符b编码,b 对应的区间0.3333 -0.6667。
这时由于多了字符b,三个字符的概率分布变成:Pa = 1/4,Pb = 2/4,Pc = 1/4。
按照新的概率分布比例划分0.3333 - 0.6667 这一区间,划分的结果可以用图形表示为:+-- 0.6667 Pc = 1/4 | +-- 0.5834 | | Pb = 2/4 | | | +-- 0.4167 Pa = 1/4 | +-- 0.3333 接着拿到字符c,现在要关注上一步中得到的c 的区间0.5834 -0.6667。
新添了c 以后,三个字符的概率分布变成Pa = 1/5,Pb = 2/5,Pc = 2/5。
用这个概率分布划分区间0.5834 - 0.6667:+-- 0.6667 | Pc = 2/5 | +-- 0.6334 | Pb = 2/5 || +-- 0.6001 Pa = 1/5 | +-- 0.5834 输入下一个字符c,三个字符的概率分布为:Pa = 1/6,Pb = 2/6,Pc = 3/6。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息论实验
姓名:邓梅学号:2013090102030
实验一:信息度量方法
1.实验目的:
本实验通过计算给定的信源的熵,加深对信源及其扩展信源的熵的概念的理解
2.实验原理:
信源熵是信源的统计平均不确定性的描述,是概率p(x)的函数
3.实验内容:
有两个二元随机变量X,Y,他们的联合概率呈一定分布,同时定义另一随机变量Z=X*Y,求相关熵,条件熵及互信息
实验二:哈夫曼编码
1.实验目的:
掌握哈弗曼编码的原理及编码步骤
2.实验原理:
①把信源发出的n个消息按其概率递减次序排列
②把概率最小的两个消息分别编成“1”和“0”码元(即把概率较大的消息编为“1”,概率较小的消息编为“0”;或反之也可),并对这两个消息求概率之和
③把上述的概率和作为一个新消息的概率,再与原来的其他消息按概率递减的次序排列
④重复上述编码步骤②与③,直到概率和是1为止
⑤从最终的编码步骤,在各个消息编码方向线的逆行程顺序地取下所编出的码元,构成相对的代码组
3.实验内容:
根据哈弗曼算法为某一信源进行哈弗曼编码,并计算其平均码长和编码效率
相关程序及结果:(1)信源熵程序及结果
(2)哈弗曼编码程序:
运行结果:
直接调用MATLAB中Huffman函数现实如下
直接调用的结果:
实验结论:
通过本次实验,我对信源熵的概念更加了解了,同时也对MATLAB的应用更加熟练,尽管还有很多不足之处。
在哈弗曼实验中,对矩阵的一些循环处理还不是很会,需要求助网络和相关资料书,接下来的学习时间中会加强对MATLAB的练习,。