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

信息论实验报告班级:姓名:学号:实验一:信道容量的迭代算法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. 信息处理的基本方法和技术通过学习,我们掌握了信息处理的基本方法,如编码、解码、压缩、解压缩等。
同时,我们了解到信息处理技术在数字信号处理、图像处理、语音处理等领域的应用,为解决实际问题提供了有力支持。
信息论课程实验报告—哈夫曼编码

*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];
}
信息导论实验报告总结(3篇)

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

游程编码实现有效性提高的原理及通用编码的思想康乐203201505020摘要:信源编码的目的是提高信息传输效率,其思想是去除消息中的冗余成分。
在无失真的信源编码中,根据信源的统计特性进行编码称为统计编码,而在信源统计特性未知的情况下,就需要一种新的编码方法,称之为通用编码。
本文对统计编码中的游程编码进行了分析,说明其有效性,给出其具有有效性的原理论述,对游程编码的截断效应进行了仿真;同时分析了通用编码的存在性与构造方法,还以字典码为例进行了仿真。
关键词:信源编码游程编码通用编码字典码一、信源编码概述通信的根本问题是将信源的输出在接收端精确的或近似的重现出来。
为此需要解决两个问题。
其一是信源的输出应如何描述,及如何计算它产生的信息量;其二是如何表示信源的输出,即信源编码问题。
由于信源可以根据信息输出的形式分为离散信源和连续信源,因此信源编码也就可以分为离散信源和连续信源。
根据通信的要求,可以将信源编码分为无失真信源编码和限定失真的信源编码。
若要求精确的重现信源的输出,就要保证信源产生的全部信息无损的传递给信宿,这时的信源编码就是无失真信源编码。
许多实际情况下,并不要求完全精确地复制出信源的输出,而且在有干扰的情况下,这也是不可能的。
一般对信源-信宿要定出可接收准则或保真度准则,这就是限定失真的信源编码。
离散信源的输出可以用如下符号序列表示:21012,,,,,U U U U U --其中l U 表示在第l 时刻产生的符号,l 为整数。
l U 为一随机变量,它在有限字母集{}1,k A a a =中选取。
如果使用D 字母的集合{}1,d B b b =作为码表,那么如果组成码字的码符号数目相等,我们就称之为等长编码,否则称之为非等长编码。
非等长编码则可以根据编码是否依赖信源的统计特性分为统计编码与通用编码。
二、 游程编码 2.1 游程编码概念游程编码(RLC, Run Length Coding ),又称“运行长度编码”或“行程编码”,是一种统计编码,该编码属于无损压缩编码,是栅格数据压缩的重要编码方法。
信息论实验报告-

信息论实验报告学生:班级:学号:实验一香农编码一、程序设计的流程图二、程序清单#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)积极请教:遇到问题时,主动向工程师请教,争取他们的指导和帮助。
四、实习总结通过本次实习,我对信息论在实际应用中的重要性有了更深入的认识,同时自己的实践操作能力和团队协作能力也得到了锻炼和提高。
北邮信息论实验报告

信息论实验报告一、实验要求掷骰子游戏,每次同时抛掷两枚骰子,将两枚骰子点数的和作为游戏结果,重复抛掷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编码使平均码长最短,编码效率达到最佳。
信息论实验报告

一、实验目的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

信息论实验·第一次实验报告题目一:掷毂子游戏的熵实验步骤:(程序见附件)我们首先计算掷毂子游戏熵的理论值:首先可以得到加和为2、3、…12的概率分别为1/36、2/36….6/36、5/36…1/36,然后利用公式:可以得到掷毂子游戏的熵的理论值为3.27bit/符号。
然后计算熵的仿真值:首先设定N=100:100:100000,然后做N次试验,统计最后加和的值所出现的频率,用频率近似概率,再次利用以上公式,得到仿真熵。
最后对不同的N得到的仿真熵与理论值的差别作图,寻找规律。
实验结论:经过理论分析,我们可知加和为2、3、…12的概率分别为1/36、2/36….6/36、5/36…1/36,进而得到掷毂子游戏的熵的理论值为3.27bit/符号。
下图为N取不同值时仿真熵的变化曲线(N=100:100:100000):根据观察可以得到,当N逐渐增大时,仿真熵逐渐趋近于理论计算得到的熵3.27bit/符号。
题目一(可选):计算英文文本的熵实验步骤:(程序见附件)首先,我们导入了一段样本文本,节选自欧亨利的小说《警察与赞美诗》(文本见附件),统计这段文本中英文字母(区分大小写)和空格出现的个数,进而得到各个字母出现的概率p(x),然后利用公式:计算样本的熵H(X)。
然后,我们统计了文本中相邻两个字符出现的概率p(xy),通过计算边缘概率分布可得p(x),然后利用公式p(y|x)=p(xy)/p(x)条件分布概率p(y|x),最后利用公式:计算得到样本的相邻两个字符的条件熵H(Y|X)。
最后,我利用生成了一组独立等概分布的英文随机序列,重新计算H(X)、H(Y|X),以检验模型的正确性。
实验结论:首先,我们可得实验的结果列表:输入文本测试项目实验值理论值小说节选H(X) 4.21bit/symbol 4.03bit/symbol小说节选H(Y|X) 3.14bit/symbol 3.32bit/symbol随机序列H(X) 5.72bit/symbol 5.73bit/symbol随机序列H(Y|X) 5.51bit/symbol 5.73bit/symbol 在上表中,实验值是通过matlab仿真得到,小说节选的两项理论值是通过查阅《信息论基础》(田宝玉、杨洁等编著,57页)得到,随机序列的理论值是通过计算:得到,随机序列共有53个符号,等概出现,我们认为H(Y|X)=H(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. 理解信息论的基本概念,包括信息熵、互信息和编码理论。
2. 通过实验掌握香农信息熵的计算方法。
3. 学习并实践简单的数据压缩技术。
实验内容:1. 数据集准备:选择一段英文文本作为实验数据集,统计各字符出现频率。
2. 信息熵计算:根据字符频率计算整个数据集的香农信息熵。
3. 编码设计:设计一种基于频率的霍夫曼编码方案,为数据集中的每个字符分配一个唯一的二进制编码。
4. 压缩与解压缩:使用设计的霍夫曼编码对原始文本进行压缩,并验证解压缩后能否恢复原始文本。
5. 性能评估:比较压缩前后的数据大小,计算压缩率,并分析压缩效果。
实验步骤:1. 从文本文件中读取数据,统计每个字符的出现次数。
2. 利用统计数据计算字符的相对频率,并转换为概率分布。
3. 应用香农公式计算整个数据集的熵值。
4. 根据字符频率构建霍夫曼树,并为每个字符生成编码。
5. 将原始文本转换为编码序列,并记录压缩后的数据大小。
6. 实现解压缩算法,将编码序列还原为原始文本。
7. 分析压缩前后的数据大小差异,并计算压缩率。
实验结果:1. 原始文本大小:[原始文本大小]2. 压缩后大小:[压缩后大小]3. 压缩率:[压缩率计算结果]4. 霍夫曼编码表:[字符与编码的对应表]实验讨论:- 分析影响压缩效果的因素,如字符集大小、字符频率分布等。
- 讨论在实际应用中,如何优化编码方案以提高压缩效率。
- 探讨信息论在数据压缩之外的其他应用领域。
实验结论:通过本次实验,我们成功地应用了信息论的基本原理,通过霍夫曼编码技术对文本数据进行了有效压缩。
实验结果表明,基于字符频率的霍夫曼编码能够显著减少数据的存储空间,验证了信息论在数据压缩领域的有效性和实用性。
信息论实验

北京科技大学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("这不是唯一可译码。
信息论实验报告实验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)根据以上三者之间的关系,验证结果的正确性。
信息论课程实验报告—唯一可译码的判定

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篇)

第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. 培养了信息分析和综合能力,为今后的学术研究奠定了基础。
实验报告:一、实验背景随着信息技术的快速发展,信息处理在各个领域都发挥着越来越重要的作用。
为了提高信息处理能力,我们进行了本次实验,旨在掌握信息处理的基本方法和技巧,熟悉信息检索工具的使用,提高信息分析和综合能力。
信息论实验一实验报告范文

信息论实验一实验报告范文一、简要总结信源的熵、信道容量的物理意义,概念:信源熵的物理意义:指信源中的各个符号的平均不确定性;熵是信源符号的平均信息量,是信源符号的平均不确定度。
信道容量概念:在信道可以传输的基本前提下,对信源的一切可能的概率分布而言,信道能够传输的最大(接收)熵速率称为信道容量。
意义:求出了某个信道的信道容量,也就找到了信源的最佳概率分布。
从而指导人们改造信源,使之最大可能地利用信道的传输能力。
二、写出离散信源熵、离散信道容量计算的基本步骤,画出实现离散信源熵、离散信道容量计算的程序流程图。
离散信源熵的计算步骤: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、理解和掌握信道容量的概念和物理意义;
2、了解信道容量的计算方法
3、采用计算机编程实现(MATLAB)
二、实验原理介绍
三、实验设备介绍
1、计算机
2、编程软件MATLAB6.5以上
四、实验内容和步骤
分别求出如下信道的信道容量
1、信道转移概率矩阵为
1/31/31/61/61/61/61/31/3P ⎡⎤=⎢⎥⎣⎦
2、信道转移概率矩阵为:
1/31/31/61/61/61/31/61/3P ⎡⎤=⎢⎥⎣⎦
1、
面出程序设计的流程图。
2、
写出在调试过程中出现的问题。
3、 对实验的结果进行分析。
五、实验数据记录
六、实验结论与心得
通过本次实验,加强了对matlab 程序的学习,进一步提高了我的编程能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息论实验报告学生:班级:学号:实验一香农编码一、程序设计的流程图二、程序清单#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);}}}实验三.霍夫曼一、程序流程图否开始输入letters Strcmp (“%是”,是)二、 程序清单#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<<"输入数据有误,请检查后再次输入。