信息论与编码实验指导书.docx
- 文档编号:29581471
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:23
- 大小:27.74KB
信息论与编码实验指导书.docx
《信息论与编码实验指导书.docx》由会员分享,可在线阅读,更多相关《信息论与编码实验指导书.docx(23页珍藏版)》请在冰豆网上搜索。
信息论与编码实验指导书
《信息论与编码》
实验指导书
前言
当前,信息论与编码已经成为电子信息类专业高年级学生必修的专业基础课。
尽管各个院校开设课程名称有所不同,但都是以香农信息论为核心内容的。
这是一门理论性和系统性很强的课程。
涉及多个学科,需要广泛数学知识。
为了能透彻掌握信息论基本概念和分析方法,做实验进行实践练习是不可缺少的环节。
通过综合性、验证性实验,可以加深对理论和概念的理解,增强分析和解决实际问题的能力。
为此,河北工业大学信息学院编写了《信息论与编码实验指导书》,由于可供参考的实验指导书有限,本书的不妥和错误之处,恳请读者予以批评指正。
马杰
2008年2月
实验一信息熵与图像熵计算---------------------------------------1
实验二Huffman编码实验------------------------------------------6
实验三算术编码实验------------------------------------------------11
实验四CRC校验编码实验------------------------------------------17
实验一信息熵与图像熵计算(2学时)
一、实验目的
1.复习MATLAB的基本命令,熟悉MATLAB下的基本函数。
2.复习信息熵基本定义,能够自学图像熵定义和基本概念。
二、实验内容
1.能够写出MATLAB源代码,求信源的信息熵。
2.根据图像熵基本知识,综合设计出MATLAB程序,求出给定图像的图像熵。
三、实验仪器、设备
1.计算机-系统最低配置256M内存、P4CPU。
2.Matlab仿真软件-7.0/7.1/2006a等版本Matlab软件。
四、实验原理
1.MATLAB中数据类型、矩阵运算、图像文件输入与输出知识复习。
2.利用信息论中信息熵概念,求出任意一个离散信源的熵(平均自信息量)。
自信息是一个随机变量,它是指某一信源发出某一消息所含有的信息量。
所发出的消息不同,它们所含有的信息量也就不同。
任何一个消息的自信息量都代表不了信源所包含的平均自信息量。
不能作为整个信源的信息测度,因此定义自信息量的数学期望为信源的平均自信息量:
信息熵的意义:
信源的信息熵H是从整个信源的统计特性来考虑的。
它是从平均意义上来表征信源的总体特性的。
对于某特定的信源,其信息熵只有一个。
不同的信源因统计特性不同,其熵也不同。
3.学习图像熵基本概念,能够求出图像一维熵和二维熵。
图像熵是一种特征的统计形式,它反映了图像中平均信息量的多少。
图像的一维熵表示图像中灰度分布的聚集特征所包含的信息量,令
Pi
Pi表示图像中灰度值为i的像素所占的比例,则定义灰度图像的一元灰度熵为:
图像的一维熵可以表示图像灰度分布的聚集特征,却不能反映图像灰度分布的空间特征,为了表征这种空间特征,可以在一维熵的基础上引入能够反映灰度分布空间特征的特征量来组成图像的二维熵。
选择图像的邻域灰度均值作为灰度分布的空间特征量,与图像的像素灰度组成特征二元组,记为(i,j),其中i表示像素的灰度值(0<=i<=255),j表示邻域灰度(0<=j<=255),
上式能反应某像素位置上的灰度值与其周围像素灰度分布的综合特征,其中f(i,j)为特征二元组(i,j)出现的频数,N为图像的尺度,定义离散的图像二维熵为:
构造的图像二维熵可以在图像所包含信息量的前提下,突出反映图像中像素位置的灰度信息和像素邻域内灰度分布的综合特征.
五、实验步骤
1.求解信息熵过程:
1)输入一个离散信源,并检查该信源是否是完备集。
2)去除信源中符号分布概率为零的元素。
3)根据平均信息量公式,求出离散信源的熵。
2.图像熵计算过程:
1)输入一幅图像,并将其转换成灰度图像。
2)统计出图像中每个灰度阶象素概率。
3)统计出图像中相邻两象素的灰度阶联合分布矩阵。
4)根据图像熵和二阶熵公式,计算出一幅图像的熵。
六、实验报告要求
1.按照本节内容后实验报告形式书写。
2.实验总结和心得要详细,可以根据自己实验情况,写出建议。
七、实验注意事项
1.Matlab语言课下多复习,尽量采用模块化编程方法,通过函数调用形式运行程序。
2.仔细理解、体会图像熵的概念,能够将其联合熵的概念理解透彻。
八、思考题
举例说明图像熵、信息熵在现实中有何实践指导意义?
附1:
信息熵计算源代码
函数源程序CalEntropy.m
%InformationShannonEntropycalculation
%jma@,22/08/2007
%array:
DiscreteProbabilitiesSet
%H:
OutputShannonEntropy
functionH=CalEntropy(array)
%Vectornumber
num=length(array);
%Checkprobabilitiessumto1:
ifabs(sum(array)-1)>.00001,
error('Probablitiesdon''tsumto1.')
end
%%Removeanyzeroprobabilities%%
zeroProbs=find(array if~isempty(zeroProbs), array(zeroProbs)=[]; %disp('Removedzeroornegativeprobabilities.') End %%Computetheentropy H=-sum(array.*log2(array));%单位bit/symbol 附2: 图像熵计算源代码 函数源程序ImgEntropy.m %%%%%%%ImageEntropycalculation%%%%%%%% %jma@,22/08/2007 %img: inputimagedata %H1,H2: Output1&2orderentropy function[H1,H2]=ImgEntropy(img) %colorimagetransformation I=imread(img); img=rgb2gray(I); imview(I),imview(img); [ix,iy]=size(img); %computeprobsforeachscalelevelinimage P1=imhist(img)/(ix*iy); temp=double(img); %fortheindexofimagepiexl temp=[temp,temp(: 1)]; %correlationprobmatrixbetween[0...255]graylevels CoefficientMat=zeros(256,256); forx=1: ix fory=1: iy i=temp(x,y);j=temp(x,y+1); CoefficientMat(i+1,j+1)=CoefficientMat(i+1,j+1)+1; end end %computetheprobofmatrix P2=CoefficientMat./(ix*iy); H1=0;H2=0; fori=1: 256 %calculate1ordimageentropy ifP1(i)~=0 H1=H1-P1(i)*log2(P1(i)); end %compute2ordimageentropy forj=1: 256 ifP2(i,j)~=0 H2=H2-P2(i,j)*log2(P2(i,j)); end end end H2=H2/2;%meanentropy/symbol sprintf('1ordimageentropyis: %d',H1) sprintf('2ordimageentropyis: %d',H2) 函数调用实例test.m %InformationTheoryexperimenttestingfile %jma@,22/08/2007 %testingDiscreteShannonEntropy %discreteprobabilitiesset probSet=[0.10.20.30.150.25]; %callCalEntropyfunction H=CalEntropy(probSet); sprintf('ShannonEntropyis: %d',H) %calculatetheImageentropy [H1,H2]=ImgEntropy('lena.jpg'); 附3: 实验报告固定样式 实验报告 班级: 姓名: 学号: 组别: 同组人: 课程名称: 实验室: 实验时间: (使用实验报告纸的,以上内容可按照实验报告纸格式填写) 实验一信息熵与图像熵计算 一、实验目的: 二、实验内容与原理: 三、实验器材(设备、元器件、软件工具、平台): 四、实验步骤: 五、实验数据及结果分析: 六、实验结论: 七、思考题 八、其他: 实验总结、心得体会及对本实验方法、手段及过程的改进建议等。 实验二Huffman编码(2学时) 一、实验目的 1.复习C++程序基本编写方法,熟悉VC编程环境。 2.会用VC调试Huffman编码程序。 二、实验内容 1.复习C++代码基本语法(结构体、树等数据结构定义) 2.根据Huffman编码源代码,学习算法实现流程,培养自己动手能力,在C++编译器下按步调试跟踪算法。 三、实验仪器、设备 1.计算机-系统最低配置256M内存、P4CPU。 2.C++编程软件-VisualC++7.0(MicrosoftVisualStudio2003) VisualC++8.0(MicrosoftVisualStudio2005) 四、实验原理 1.Huffman编码原理: ①将信源符号按概率从大到小的顺序排列,令 p(x1)≥p(x2)≥…≥p(xn) ②给两个概率最小的信源符号p(xn-1)和p(xn)各分配一个码位“0”和“1”,将这两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结果得到一个只包含(n-1)个信源符号的新信源。 称为信源的第一次缩减信源,用S1表示。 ③将缩减信源S1的符号仍按概率从大到小顺序排列,重复步骤2,得到只含(n-2)个符号的缩减信源S2。 ④重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号的概率之和必为1。 然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。 2.Huffman树的编码原理: 步骤1: 将各个符号及其出现频率分别作为不同的小二叉树(目前每棵树只有根节点) 步骤2: 在步骤1中得到的树林里找出频率值最小的两棵树,将他们分别作为左、右子树连成一棵大一些的二叉树,该二叉树的频率值设为两棵子树频率值之和。 步骤3: 对上面得到的树林重复步骤2的做法,直到所有符号都连入树中为止。 五、实验步骤 1.VC环境下,建一个C++控制台应用程序,并把源代码考到该程序目录下。 2.项目文件中含有一个预编译头文件,一个主函数入口文件和Huffman编码算法文件。 3.在入口文件中,输入任一个离散信源进行编码调试。 4.设置好程序断点,仔细分析Huffman树每步的建立过程。 5.输出离散信源中每个符号的Huffman编码,并与手工运算的结果进行比较。 六、实验报告要求 1.按照实验一附3中实验报告样式书写本次实验报告。 2.总结C++语言学习心得,并结合Huffman编码实验总结自己的得失,指出今后自己要练习改进之处。 根据自己实验情况,对本实验写出建议。 七、实验注意事项 1.指针数据结构定义 typedefstruct { unsignedlongweight; intparent,lchild,rchild; }HTNode,*HuffmanTree; typedefchar**HuffmanCode;//指向存放数组指针的数组即二维数组 2.二叉树生成操作放在数组中(节点n和数组大小m关系为: m=2*n-1)。 每次在树中找到两颗最小子树,其函数为Select(HuffmanTreeHT,intn,int*s1,int*s2),实际实现的是在数组中找到最小两个元素。 另外注意C++的数组起始索引是0,Matlab起始索引是1;程序中为了方便从1开始索引数组,HT[0].weight的大小设为0xffffffffL。 为了输出二进制Huffman码,程序最后对每个符号进行深度优先搜索,得到该符号的二进制字符,然后进行字符串拷贝,直到最后输出。 八、思考题 根据Huffman算法的C++源程序,试着写出Huffman编码的Matlab程序? 附1: Huffman编码源代码 源代码列表: stdafx.h Huffman.cpp 预编译头文件: stdafx.h以下代码 #pragmaonce #include #include #include #include #include 控制台应用CPP文件: Huffman.cpp #include"stdafx.h" typedefstruct { unsignedlongweight; intparent,lchild,rchild; }HTNode,*HuffmanTree; typedefchar**HuffmanCode; HuffmanCodeHC; voidSelect(HuffmanTreeHT,intn,int*s1,int*s2); voidHuffmanCoding(unsignedlong*w,intn) { inti; if(n<=1)return; intm=2*n-1; HuffmanTreep; HuffmanTreeHT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); memset(HT,0,sizeof(HTNode)*(m+1)); for(p=HT,i=1;i<=n;++i) { ++p; ++w; p->weight=*w; } ints1,s2; for(i=n+1;i<=m;++i) { Select(HT,i-1,&s1,&s2); HT[s1].parent=i;HT[s2].parent=i; HT[i].lchild=s1;HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); char*cd=(char*)malloc(n*sizeof(char)); cd[n-1]=0; intstart; unsignedlongf; for(i=1;i<=n;++i) { start=n-1; intc; for(c=i,f=HT[i].parent;f! =0;c=f,f=HT[f].parent) { if(HT[f].lchild==c) cd[--start]='0'; else cd[--start]='1'; } HC[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); } free(HT); //free(cd); } voidSelect(HuffmanTreeHT,intn,int*s1,int*s2) { inti; HT[0].weight=(unsignedlong)(-1l); *s1=*s2=0; for(i=1;i<=n;i++) if(HT[i].parent==0) { if(HT[i].weight { *s2=*s1; *s1=i; } elseif(HT[i].weight { *s2=i; } } } //函数测试实例 int_tmain(intargc,_TCHAR*argv[]) { constintLEN=3; inti; unsignedlongweight[LEN+1]; weight[0]=0; weight[1]=1; weight[2]=7; weight[3]=2; HuffmanCoding(weight,LEN); for(i=1;i<=LEN;i++) printf("%s\n",HC[i]); return0; } //EndofHuffman.cpp 实验三算术编码(2学时) 一、实验目的 1.进一步学习C++语言概念和熟悉VC编程环境。 2.学习算术编码基本流程,学会调试算术编码程序。 3.根据给出资料,自学自适应0阶算术编、解码方法。 二、实验内容 1.复习C++代码基本语法(类和虚函数等面向对象数据结构定义) 2.根据实验提供的源代码,学习算术编码实现流程,培养实际动手调试能力和相应的编程技巧。 三、实验仪器、设备 1.计算机-系统最低配置256M内存、P4CPU。 2.C++编程软件-VisualC++7.0(MicrosoftVisualStudio2003) VisualC++8.0(MicrosoftVisualStudio2005) 四、实验原理 1.算术编码基本原理是将编码消息表示成实数0和1之间的一个间隔,消息越长,编码表示它的间隔就越小,表示这一间隔所需的二进制位就越多。 算术编码用到两个基本的参数: 符号的概率和它的编码间隔。 信源符号的概率决定压缩编码的效率,也决定编码过程中信源符号的间隔,而这些间隔包含在0到1之间。 编码过程中的间隔决定了符号压缩后的输出。 首先借助下面一个简单的例子来阐释算术编码的基本原理。 考虑某条信息中可能出现的字符仅有abc三种,我们要压缩保存的信息为bccb。 在没有开始压缩进程之前,假设对abc三者在信息中的出现概率一无所知(采用的是自适应模型),暂认为三者的出现概率相等各为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。 接着来划分c的区间0.6334-0.6667: +--0.6667 | | Pc=3/6| | +--0.6501 | Pb=2/6| | +--0.6390 Pa=1/6| +--0.6334 输入最后一个字符b,因为是最后一个字符,不用再做进一步的划分了,上一步中得到的b的区间为0.6390-0.6501,最后在这个区间内随便选择一个容易变成二进制的数,例如0.64,将它变成二进制0.1010001111,去掉前面没有太多意义的0和小数点,可以输出1010001111,这就是信息被压缩后的结果,由此完成了一次最简单的算术压缩过程。 如何解压缩呢? 那就更简单了。 解压缩之前仍然假定三个字符的概率相等。 解压缩时面对的是二进制流1010001111,先在前面加上0和小数点把它变成小数0.1010001111,也就是十进制0.64。 这时我们发现0.64在分布图中落入字符b的区间内,立即输出字符b,并得出三个字符新的概率分布。 类似压缩时采用的方法,我们按照新的概率分布划分字符b的区间。 在新的划分中,我们发现0.64落入了字符c的区间,我们可以输出字符c。 同理,我们可以继续输出所有的字符,完成全部解压缩过程。 2.小数存储方法 如果信息内容特别丰富,我们要输出的小数将会很长很长,该如何在内存中表示如此长的小数呢? 其实,没有任何必要在内存中存储要输出的整个小数。 从上面的例子可以知道,在编码的进行中,会不断地得到有关要输出小数的各种信息。 具体地讲,当我们将区间限定在0.6390-0.6501之间时,我们已经知道要输出的小数第一位(十进制)一定是6,那么我们完全可以将6从内存中拿掉,接着在区间0.390-0.501之间继续我们的压缩进程。 内存中始终不会有非常长的小数存在。 使用二进制时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息论 编码 实验 指导书