中南大学信息论与编码实验2-实验报告.doc
《中南大学信息论与编码实验2-实验报告.doc》由会员分享,可在线阅读,更多相关《中南大学信息论与编码实验2-实验报告.doc(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、优质文本中 南 大 学 -信息论与编码题 目 关于编码的实验 学生姓名 指导教师 学 院 信息科学与工程学院 学 号 专业班级 2015年12月目 录一、 实验目的3二、实验原理3三、实验内容5四、实验要求5五、代码调试结果6六、实验代码8一、实验目的1. 掌握香农码和 Huffman 编码原理和过程。2. 熟悉 matlab 软件的根本操作,练习使用matlab 实现香农码和Huffman编码。3. 熟悉 C/C+语言,练习使用C/C+实现香农码和Huffman 编码。4. 应用 Huffman 编码实现文件的压缩和解压缩。二、 实验原理 香农编码:香农第一定理指出了平均码长与信源之间的关系
2、,同时也指出了可以通过编码使平均码长到达极限值,这是一个很重要的极限定理。如何构造这种码?香农第一定理指出,选择每个码字的长度Ki满足下式 I(xi)KI(xi)+1, 就可以得到这种码。这种编码方法就是香农编码。香农第一定理:设离散无记忆信源为S P=s1 s2 .sq p(s1) p(s2) .p(sq) 熵为H(S),其N 次扩展信源为熵为H(SN)。码符号集X=x1,x2,xr。先对信源S N 进行编码,总可以找到一种编码方法,构成惟一可以码,使S 中每个信源符号所需的平均码长满足:当N时L 是平均码长 是ai 对应的码字长度哈夫曼编码:要完成哈夫曼的编码和解码需要首先建立哈夫曼树,之
3、后对所有字符根据权重进行编码,最后再对文件内容进行编码和解码。首先定义适合哈夫曼树的节点类型,需要定义的有当前节点的字符,当前节点的左子、右子和父亲指针。在建立哈夫曼树之前还需要对出现的字符和权重进行统计和记录,并且定义一个可以筛选出最小权重的函数。初始化树节点之后开始建立哈夫曼树。先在所有可能出现的字符中筛选出当前权重最小的两个字符,将这两个字符分别作为新节点的左子和右子建立一个小的二叉树,并将两个字符的权重之和赋值给新节点,将新二叉树放入筛选字符中,再将筛选过的两个字符从筛选列表中淘汰掉。依次对列表中剩下的字符进行权重最小的筛选,直到根节点如果编码表共有N个字符,那么2*N-1就为最终根节
4、点为止,也就是当筛选列表为空的时候,哈夫曼树即建立完成。对于哈夫曼编码树来说,由于哈夫曼编码是前缀码,所以所有要编码的字符最终都将是这颗树的叶子节点,而其它节点并没有真正的字符意义。即当哈夫曼编码树建立之后,对树的所有叶子节点进行打印可知道是否有字符遗漏或多余。建立哈夫曼编码表。建立编码表时要根据每个出现的字符的权重对建立的哈夫曼树的每个叶子节点进行编码。编码时要从叶子节点出发向根节点进行逆向编码。判断如果当前节点为左子那么对其编码0,如果当前节点为右子那么对其编码1。以此类推进行编码直到根节点为止。此时的编码是逆向的,所以需要将码值逆向存储。依次对每一个叶子节点进行编码操作,即可得到当前哈夫
5、曼树的编码表。对于码值的逆向存储可以使用栈结构,先将一个码的每一步编码存入栈,再在一个码结束后出栈至空。当然也可以定义一个字符型数组,将值从后向前存入数组,再将数组有值局部粘贴到新的数组中进行存储。本次采用了后者,因为个人认为为此一步操作建立栈结构不划算,而且前一个设计也已经熟练掌握了栈的方法,此处进行新的尝试会更好。对文件进行编码。首先需要建立一个原始文件,在文件中输入需要编码的内容。之后将文件翻开,将其中的内容存储到字符串中以便程序编码调用。开始对需要编码的字符进行编码,将字符逐一读取与刚刚建立的编码表中的每个叶子节点代表的字符进行比拟,找出相同的对象,并将当前节点的编码打印到屏幕,并将编
6、码存入到新建的密码文件当中。对文件进行解码。先翻开密码文件,将之前编码后得到的密文内容存储到字符串中以便解码调用。开始对密文的字符串进行解码,树索引从根节点开始走,当密文中的当前字符是0的时候,那么索引走向左子节点;当是1的时候,那么走向右子节点。以此类推,一直走到叶子节点为止,那么当前叶子节点所代表的字符即为前一段密文的解码结果,。再对下一个字符依次从根节点开始解码,如此循环对每一段密文进行解码直到解码结束。将解码打印到屏幕,并将解码结果存入到新的解码文件当中。在解码之前,还应该先确认之前是否建立了哈夫曼树并且是否构建了编码表。不过由于本次将a到z都进行了编码,所以此步省略了,因为编码表是唯
7、一的。需要的时候可以在Encoder 函数中先进行判定。将编码和解码写在了一起,可以在运行时进行选择调用。三、实验内容1.使用matlab 实现香农码和Huffman 编码,并自己设计测试案例。2.使用CC+实现香农码和Huffman 编码,并自己设计测试案例。3.可以用任何开发工具和开发语言,尝试实现Huffman 编码应用在数据文件的压缩和解压缩中,并自己设计测试案例。四、实验要求1. 提前预习实验,认真阅读实验原理以及相应的参考书。2. 认真高效的完成实验,实验中服从实验室管理人员以及实验指导老师的管理。3. 认真撰写实验报告,内容可以自己编排,可以考虑包括以下一些方面:原理概述、程序设
8、计与算法描述、源程序及注释程序太长可以只选取重要局部、运行输出结果实例、调试和运行程序过程中产生的问题及采取的措施、对实验的讨论分析、总结。五、代码调试结果香农编码:哈夫曼编码:C语言之香农编码:C语言之哈夫曼编码:六、实验代码Matlab实现香农编码:clear;A=input(please input a number:) %提示输入界面A=fliplr(sort(A);%降序排列m,n=size(A);for i=1:n B(i,1)=A(i);%生成B的第1列end%生成B第2列的元素a=sum(B(:,1)/2;for k=1:n-1 if abs(sum(B(1:k,1)-a)=a
9、bs(sum(B(1:k+1,1)-a) break; endendfor i=1:n%生成B第2列的元素 if i=k B(i,2)=0; else B(i,2)=1; endend%生成第一次编码的结果END=B(:,2);END=sym(END);%生成第3列及以后几列的各元素j=3;while (j=0) p=1; while(p=n) x=B(p,j-1); for q=p:n if x=-1 break; else if B(q,j-1)=x y=1; continue; else y=0; break; end end end if y=1 q=q+1; end if q=p|q
10、-p=1 B(p,j)=-1; else if q-p=2 B(p,j)=0; END(p)=char(END(p),0; B(q-1,j)=1; END(q-1)=char(END(q-1),1; else a=sum(B(p:q-1,1)/2; for k=p:q-2 if abs(sum(B(p:k,1)-a)=abs(sum(B(p:k+1,1)-a); break; end end for i=p:q-1 if i=k B(i,j)=0; END(i)=char(END(i),0; else B(i,j)=1; END(i)=char(END(i),1; end end end en
11、d p=q; end C=B(:,j); D=find(C=-1); e,f=size(D); if e=n j=0; else j=j+1; endendBAENDfor i=1:n u,v=size(char(END(i); L(i)=v;endavlen=sum(L.*A)哈夫曼编码:p=input(please input a number:) %提示输入界面 n=length(p); for i=1:n if p(i)0 fprintf(n The sum of the probabilities in huffman can more than 1!n); p=input(plea
12、se input a number:) %如果输入的概率数组总和大于1,那么重新输入概率数组 endq=p; a=zeros(n-1,n); %生成一个n-1 行n 列的数组 for i=1:n-1 q,l=sort(q); %对概率数组q 进行从小至大的排序,并且用l 数组返回一个数组,该数组表示概率数组q 排序前的顺序编号 a(i,:)=l(1:n-i+1),zeros(1,i-1); %由数组l 构建一个矩阵,该矩阵说明概率合并时的顺序,用于后面的编码 q=q(1)+q(2),q(3:n),1; %将排序后的概率数组q 的前两项,即概率最小的两个数加和,得到新的一组概率序列 endfor
13、 i=1:n-1 c(i,1:n*n)=blanks(n*n); %生成一个n-1 行n 列,并且每个元素的的长度为n 的空白数组,c 矩阵用于进行huffman 编码,并且在编码中与a 矩阵有一定的对应关系 endc(n-1,n)=0; %由于a 矩阵的第n-1 行的前两个元素为进行huffman 编码加和运算时所得的最 c(n-1,2*n)=1; %后两个概率,因此其值为0 或1,在编码时设第n-1 行的第一个空白字符为0,第二个空白字符1。 for i=2:n-1 c(n-i,1:n-1)=c(n-i+1,n*(find(a(n-i+1,:)=1)-(n-2):n*(find(a(n-i
14、+1,:)=1); %矩阵c 的第n-i 的第一个元素的n-1 的字符赋值为对应于a 矩阵中第n-i+1 行中值为1 的位置在c 矩阵中的编码值 c(n-i,n)=0; %根据之前的规那么,在分支的第一个元素最后补0 c(n-i,n+1:2*n-1)=c(n-i,1:n-1); %矩阵c 的第n-i 的第二个元素的n-1 的字符与第n-i 行的第一个元素的前n-1 个符号相同,因为其根节点相同 c(n-i,2*n)=1; %根据之前的规那么,在分支的第一个元素最后补1 for j=1:i-1 c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 信息论 编码 实验 报告
限制150内