实验一 绘制二进熵函数曲线(2个学时)一、实验目的:1. 掌握Excel 的数据填充、公式运算和图表制作2. 掌握Matlab 绘图函数3. 掌握、理解熵函数表达式及其性质 二、实验要求:1. 提前预习实验,认真阅读实验原理以及相应的参考书。
2. 在实验报告中给出二进制熵函数曲线图 三、实验原理:1. Excel 的图表功能2. 信源熵的概念及性质()()[]()[]())(1)(1 .log )( .)( 1log 1log )(log )()(10 , 110)(21Q H P H Q P H b nX H a p H p p p p x p x p X H p p p x x X P X ii i λλλλ-+≥-+≤=--+-=-=≤≤⎩⎨⎧⎭⎬⎫-===⎥⎦⎤⎢⎣⎡∑四、实验内容:用Excel 或Matlab 软件制作二进熵函数曲线。
具体步骤如下:1、启动Excel 应用程序。
2、准备一组数据p 。
在Excel 的一个工作表的A 列(或其它列)输入一组p ,取步长为0.01,从0至100产生101个p (利用Excel 填充功能)。
3、取定对数底c ,在B 列计算H(x) ,注意对p=0与p=1两处,在B 列对应位置直接输入0。
Excel 中提供了三种对数函数LN(x),LOG10(x)和LOG(x,c),其中LN(x)是求自然对数,LOG10(x)是求以10为底的对数,LOG(x,c)表示求对数。
选用c=2,则应用函数LOG(x,2)。
在单元格B2中输入公式:=-A2*LOG(A2,2)-(1-A2)*LOG(1-A2,2) 双击B2的填充柄,即可完成H(p)的计算。
4、使用Excel 的图表向导,图表类型选“XY 散点图”,子图表类型选“无数据点平滑散点图”,数据区域用计算出的H(p)数据所在列范围,即$B$1:$B$101。
在“系列”中输入X值(即p值)范围,即$A$1:$A$101。
在X轴输入标题概率,在Y轴输入标题信源熵。
实验步骤:我是使用MATLAB来做的第一个实验,以下是我的代码1.我先编了一个函数,实现对信息熵的求导function h=Hp(p)%熵函数计算,输入是概率p(标量或一维矢量)%输出是h,与p同维度h=zeros(1,length(p));index=find(p>0&p<1);P=p(index);h(index) = -P.*log(P)-(1-P).*log(1-P);end2.然后在命令窗口输入>> p=0:0.00001:1;>> plot(p,Hp(p))3.绘制熵函数图像如下实验二:香农编码软件实现(2个学时)1、实验目的(1)了解香农编码的基本原理及其特点;(2)熟悉掌握香农编码的方法和步骤;(3)掌握C语言或者Matlab编写香农编码的程序。
2、实验报告要求(1)简要总结香农编码的基本原理与特点(2)写出香农编码的基本步骤,画出实现香农编码的程序流程图(3)实现香农编码的Matlab或者C源程序3、实验内容(1)根据香农编码的方法和步骤,用香农编码编写程序(2)用编写的源程序验证书中例题的正确性。
实验步骤:1.我先编了一个命令文件,实现累加概率,码长的求解,如下其中有一句H=xlsread('e:Book1.xlsx','A1:A7'),是老师要求的对一个excel 文件数据的读取,其中数据依次为0.1,0.2,0.1,0.1,0.1,0.3,0.1。
2.下面是一个函数文件,命令文件要对它调用,它的作用是实现编出各自概率的码字,如下:3.结果如下:下面是香农编码的流程图:实验三:Huffman编码软件实现(2个学时)1、实验目的(1)进一步熟悉Huffman编码过程;(2)掌握C语言递归程序的设计和调试技术(或者使用Matlab)。
2、实验要求(1)输入:信源符号个数r、信源的概率分布P;(2)输出:每个信源符号对应的Huffman编码的码字。
3、实验内容(1)算法1、从键盘输入组成信源C的字符个数N;2、从键盘输入信源C和组成信源的字符所对应的概率数组P;3、用Huffman函数来对信源进行二进制编码;先对P按从大到小进行排序,与此同时要把C中相应的字符的位置做相应的调换;用count数组来记录编码:在进行记录编码时是从数组count的最后一个开始存储的,而且,每进行一次编码所记录下来的两个编码'1','0'是按从数组的最后一个元素开始服从count[m-k-j]、count[m-k-j-1],其中k表示编码所进行的次数,j表示每次编码都只有'1','0';最后用函数int()pr来输出编码。
(2)部分伪代码:(一)节点信息结构体struct HuffNode{int weight;//信源符号的概率int parent;int lchild;int rchild;};(二)算法void Huffman(int weight[], int n, HuffNode hn[], HuffCode hc[]){for(i = 0; i != 2*n - 1; ++i) //create Huffman Node,step 1{}for(i = 0; i != n-1; ++i) //create Huffman Node, step 2{for(j = 0; j != n+i; j++){ if(hn[j].weight < min1 && hn[j].parent == 0){}else if(hn[j].weight < min2 && hn[j].parent == 0){}else ;}}在此逆序存储Huffman编码int temp[maxlen];for(i = 0; i != n; ++i){int parent = hn[i].parent;while(hn[child].parent != 0){}4、实验报告(1)简要总结Huffman编码的原理与特点(2)写出Huffman编码的基本步骤,画出实现Huffman编码的程序流程图(3)给出Huffman编码的源程序,并给出实验过程中的测试结果(4)总结实验过程遇到的问题及解决方法实验步骤:1.哈夫曼编码是编码效率最高的编码方式,属于无损压缩编码。
2.下面是在matlab实现哈夫曼编码的代码:结果如下:3.过程中也发现了它的缺点: 哈夫曼码没有错误保护功能,在译码时,如果码串中没有错误,那么就能一个接一个地正确译出代码。
但如果码串中有错误,哪怕仅是 1 位出现错误,不但这个码本身译错,更糟糕的是后面的数据串也会接着被译错,全乱了套,这种现象称为错误传播(error propagation)。
计算机对这种错误也无能为力,说不出错在哪里,更谈不上去纠正。
4.下面是哈夫曼编码的流程图:实验四循环码的编码和译码程序设计一、实验目的:1.通过实验了解循环码的工作原理。
2.了解生成多项式g(x)与编码、译码的关系。
3.了解码距d与纠、检错能力之间的关系。
4.分析(7.3)循环码的纠错能力。
二、实验要求:1、编、译码用上述的计算法程序框图编写。
2、计算出所有的码字集合,可纠错误图样E(x)表和对应的错误伴随式表。
3、考查和分析该码检、纠一、二位错误的能力情况。
4、整理好所有的程序清单,变量名尽量用程序框图所给名称,并作注释。
5、出示软件报告.三、实验设计原理1、循环码编码原理设有一(n,k)循环码,码字C=[Cn-1…CrCr-1…C0],其中r=n-k。
码字多项式为:C(x)= Cn-1xn-1+Cn-2xn-2+…C1x+C0。
码字的生成多项式为:g(x)=gr-1xr-1gr-2xr-2+…+g1x+g0待编码的信息多项式为:m(x)=mK-1xK-1+…+m0xn-k.m(x)=Cn-1xn-1+…+Cn-Kxn-K 对于系统码有:Cn-1=mK-1,Cn-2=mK-2,…Cn-K=Cr=m0设监督多项式为:r(x)=Cr-1Xr-1+…+C1x+C0根据循环码的定义,则有:C(x)=xn-Km(x)+r(x)=q(x).g(x)Xn-Km(x)=q(x).g(x)+r(x)r(x)=Rg(x)[xn-Km(x)]即监督多项式是将多项式xn-Km(x)除以g(x)所得的余式。
编码过程就是如何根据生成多项式完成除法运算求取监督多项式的过程。
设循环码(7.3)码的字多项式为:C(x)=C6x6+C5x5+C4x4+C3x3+C2x2C1x+C0(n=7)生成多项式为: g(x)=x4+x2+x+1信息多项式为: m(x)=m2x2+m1x+m0 (k=3), 设m(x)=x2+x监督多项式为: r(x)= Cr-1Xr-1+…+C1x+C0根据循环码的定义:生成多项式的倍式均是码字,编码实际上是做xn-•km(x)除以g(x)的运算求得r(x)。
编码程序框图见图4.1(a)左,二进制多项式除法示意图见图4.1(b)。
2、译码原理设R(x)为接收码字多项式,E(x)为错误图样多项式,S(x)为伴随式,则根据循环码的性质有:S(x)=Rg(x)[R(x)]=Rg(x)[E(x)]当R(x)=C(x)时,有E(x)=0,S(x)=0当R(x)不等于C(x)时,有E(x)为非0,S(x)为非0(a)编码计算程序框图(b)二进制多项式除法示意图图4.1编码计算程序框图及多项式除法示意图译码过程如下:计算每一种可能被纠的错误图样E(x)的伴随式,Si(x)=Rg(x)[E(x)]本地作数据表存储好。
根据已接收码字多项式R(x),计算相应的伴随式:S(x)=Rg(x)[R(x)]将实际接收码字求出的S(x)与本地存储的各Si(x)相比较,查出两者相等的那个唯一匹配的Si(x),找出并得到相应的错误图样E(x)。
(4) 纠错: C(x)=R(x)+E(x)否则由S(x)找不出唯一匹配的Si(x),则报出错信息,表示出现不可纠错的错误图样,即码元出错的个数超出该循环码的纠错能力。
译码流程图4.2所示:图4.2 译码程序流程图六、完成实验报告(1)简要总结循环码编译码原理与特点(2)写出循环码的基本步骤,画出实现循环码的程序流程图(3)给出循环码的源程序,并给出实验过程中的测试结果(4)总结实验过程遇到的问题及解决方法实验步骤:1.循环码:无权码,每位代码无固定权值,任何相邻的两个码组中,仅有一位代码不同。
2下面是循环码的程序流程图:3.下面是用matlab实现循环码的编译码的程序代码:4.过程中主要是运用对二进除法的理解。