信息论与编码实验2-实验报告.doc

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
信息论与编码实验2-实验报告

PAGE PAGE 1 中 南 大 学 信息论与编码 题 目 关于编码的实验 学生姓名 杨家骏 指导教师 赵颖 学 院 信息科学与工程学院 学 号 0909101123 专业班级 电子信息1002班 2012年12月 目 录 实验目的……………………………………3 二、实验原理……………………………………3 三、实验内容……………………………………5 四、实验要求……………………………………5 五、代码调试结果………………………………6 六、实验代码……………………………………8 一、实验目的 1. 掌握香农码和 Huffman 编码原理和过程。 2. 熟悉 matlab 软件的基本操作,练习使用matlab 实现香农码和Huffman 编码。 3. 熟悉 C/C++语言,练习使用C/C++实现香农码和Huffman 编码。 4. 应用 Huffman 编码实现文件的压缩和解压缩。 实验原理 香农编码:香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使平均码长达到极限值,这是一个很重要的极限定理。如何构造这种码?香农第一定理指出,选择每个码字的长度Ki满足下式 I(xi)≤K﹤I(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 对应的码字长度 哈夫曼编码:要完成哈夫曼的编码和解码需要首先建立哈夫曼树,之后对所有字符根据权重进行编码,最后再对文件内容进行编码和解码。 首先定义适合哈夫曼树的节点类型,需要定义的有当前节点的字符,当前节点的左子、右子和父亲指针。在建立哈夫曼树之前还需要对出现的字符和权重进行统计和记录,并且定义一个可以筛选出最小权重的函数。 初始化树节点之后开始建立哈夫曼树。先在所有可能出现的字符中筛选出当前权重最小的两个字符,将这两个字符分别作为新节点的左子和右子建立一个小的二叉树,并将两个字符的权重之和赋值给新节点,将新二叉树放入筛选字符中,再将筛选过的两个字符从筛选列表中淘汰掉。依次对列表中剩下的字符进行权重最小的筛选,直到根节点(如果编码表共有N个字符,则2*N-1就为最终根节点)为止,也就是当筛选列表为空的时候,哈夫曼树即建立完成。 对于哈夫曼编码树来说,由于哈夫曼编码是前缀码,所以所有要编码的字符最终都将是这颗树的叶子节点,而其它节点并没有真正的字符意义。即当哈夫曼编码树建立之后,对树的所有叶子节点进行打印可知道是否有字符遗漏或多余。 建立哈夫曼编码表。 建立编码表时要根据每个出现的字符的权重对建立的哈夫曼树的每个叶子节点进行编码。编码时要从叶子节点出发向根节点进行逆向编码。判断如果当前节点为左子则对其编码‘0’,如果当前节点为右子则对其编码‘1’。以此类推进行编码直到根节点为止。此时的编码是逆向的,所以需要将码值逆向存储。依次对每一个叶子节点进行编码操作,即可得到当前哈夫曼树的编码表。 对于码值的逆向存储可以使用栈结构,先将一个码的每一步编码存入栈,再在一个码结束后出栈至空。当然也可以定义一个字符型数组,将值从后向前存入数组,再将数组有值部分粘贴到新的数组中进行存储。本次采用了后者,因为个人认为为此一步操作建立栈结构不划算,而且前一个设计也已经熟练掌握了栈的方法,此处进行新的尝试会更好。 对文件进行编码。 首先需要建立一个原始文件,在文件中输入需要编码的内容。之后将文件打开,将其中的内容存储到字符串中以便程序编码调用。开始对需要编码的字符进行编码,将字符逐一读取与刚刚建立的编码表中的每个叶子节点代表的字符进行比较,找出相同的对象,并将当前节点的编码打印到屏幕,并将编码存入到新建的密码文件当中。 对文件进行解码。 先打开密码文件,将之前编码后得到的密文内容存储到字符串中以便解码调用。开始对密文的字符串进行解码,树索引从根节点开始走,当密文中的当前字符是‘0’的时候,则索引走向左子节点;当是‘1’的时候,则走向右子节点。以此类推,一直走到叶子节点为止,则当前叶子节点所代表的字符即为前一段密文的解码结果,。再对下一个字符依次从根节点开始解码,如此循环对

文档评论(0)

小教资源库 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档