信息论与编码课设C语言版,信息论与编码实验.doc

信息论与编码实验.doc

数据库系统课程设计数据库系统课程设计 学生姓名 马 进 孝 学 号 20101000479 班 号 116102-02 指导教师 黄 鹰 中国地质大学(武汉)信息工程学院中国地质大学(武汉)信息工程学院 2012/5/15 年年 2 月月 25 日日 实验实验一一 Huffman 编码(编码(2 学时)学时) 一、实验目的 1复习C程序基本编写方法,熟悉VC 编程环境。 2会用VC 调试Huffman 编码程序。 二、实验内容 1复习C代码基本语法(结构体、树等数据结构定义) 2根据Huffman 编码源代码,学习算法实现流程,培养自己动手能力,在 C编译器下按步调试跟踪算法。 三、实验仪器、设备 1计算机系统最低配置 256M 内存、P4 CPU。 2C 编程软件 Visual C 7.0 (Microsoft Visual Studio 2003) Visual C 8.0 (Microsoft Visual Studio 2005) 四、实验原理 1 Huffman 编码原理 将信源符号按概率从大到小的顺序排列,令 px1 px2 pxn 给两个概率最小的信源符号pxn-1和pxn各分配一个码位“0”和“1”,将这 两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率, 结果得到一个只包含n1个信源符号的新信源。称为信源的第一次缩减信源, 用S1表示。 将缩减信源S1的符号仍按概率从大到小顺序排列,重复步骤2,得到只含 n2个符号的缩减信源S2。 重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号的概 率之和必为1。然后从最后一级缩减信源开始,依编码路径向前返回,就得到各 信源符号所对应的码字。 2Huffman 树的编码原理 步骤1 将各个符号及其出现频率分别作为不同的小二叉树(目前每棵树只 有根节点) 步骤2 在步骤1中得到的树林里找出频率值最小的两棵树,将他们分别作 为左、右子树连成一棵大一些的二叉树,该二叉树的频率值设为两棵子树频率值 之和。 步骤3对上面得到的树林重复步骤2的做法,直到所有符号都连入树中为止。 五、实验步骤 1VC 环境下,建一个C控制台应用程序,并把源代码考到该程序目录 下。 2项目文件中含有一个预编译头文件,一个主函数入口文件和Huffman 编 码算法文件。 3在入口文件中,输入任一个离散信源进行编码调试。 4设置好程序断点,仔细分析Huffman 树每步的建立过程。 5输出离散信源中每个符号的Huffman 编码,并与手工运算的结果进行比 较。 六、实验报告要求 1 按照实验一附 3 中实验报告样式书写本次实验报告。 2 总结 C语言学习心得,并结合Huffman 编码实验总结自己的得失, 指出今后自己要练习改进之处。根据自己实验情况,对本实验写出建议。 七、实验注意事项 1指针数据结构定义 typedef struct unsigned long weight; int parent, lchild, rchild; HTNode, *HuffmanTree; typedef char HuffmanCode; 指向存放数组指针的数组即二维数组 2二叉树生成操作放在数组中(节点n 和数组大小m 关系为m2*n-1)。 每次在树中找到两颗最小子树,其函数为SelectHuffmanTree HT, int n, int *s1, int *s2,实际实现的是在数组中找到最小两个元素。另外注意C的数组起始索引 是0,Matlab 起始索引是1;程序中为了方便从1 开始索引数组,HT0.weight 的大小设为0 xffffffffL。为了输出二进制Huffman 码,程序最后对每个符号进行 深度优先搜索,得到该符号的二进制字符,然后进行字符串拷贝,直到最后输出。 3 哈夫曼是一种编码手段。也就是说保证将来的编码是最小长度的,最终生 成最小的哈夫曼编码树,又称哈夫曼最小树。 它的原理是将一段文本中出现的字符按出现的频率决定其编码。然后按其最终的 编码生成一段明文。知道了这个原理,编码还是很简单的。 首先,要实现字符的频度表。也就是说,这 18 个字符中出现次数最多的一个记作 01,然后按其出现的频率,分别生成最小树就可以了保证哈夫曼最小树的生成 至于树的生成,可以先生成一个双链表,分别表示左子树,数据,右子树。 include include using namespace std; typedef struct TreeNode char c; int w; int parent; int right; int left; int tag; char * code; Node; void FindNode * tree, int n, int whiletree m1.tag 0; m2 m1; whiletree m2.tag 0; forint i m2 1; i n Node * tree new Node2 * n - 1; forint i 0; i treei.ctreei.w; treei.tag 0; Huffmantree, n;建立 Huffman 树 HuffmanCodingtree, n;调用 Huffman 编码函数 return 0; 2 )后,再除以一个多项式,最后所得到的余数既是CRC 码。求CRC 码所采用 实验实验二二 CRC 校验码编码实验(校验码编码实验(2 学时)学时) 一、实验目的 1学习CRC 编码基本流程, 学会调试循环冗余校验码编码程序。 2掌握CRC 校验码的编码原理,重点掌握按字节(Byte)编码方法。 二、实验内容 1根据实验原理掌握CRC 校验码编码/解码基本流程。 2在C编译器下能够调试编码算法每一个步骤,重点掌握按字节编码的 过程。 三、实验仪器、设备 1计算机系统最低配置 256M 内存、P4 CPU。 2C 编程软件 Visual C 7.0 (Microsoft Visual Studio 2003) Visual C 8.0 (Microsoft Visual Studio 2005) 四、实验原理 1 CRC 校验码介绍 CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的k 位二 进制码序列,以一定的规则产生一个校验用的监督码(CRC 码)r 位,并附在 信息后边,构成一个新的二进制码序列数共 kr 位,最后发送出去。在接收端, 则根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。 16 位的CRC 码产生的规则是先将要发送的二进制序列数左移16 位(乘以 16 模2 加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是 逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运 算是一样,符合同样的规律。接收方将接收到的二进制序列数(包括信息码和 CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输 有误。 2按位计算CRC 一个二进制序列数可以表示为 求此二进制序列数的CRC 码时,先乘以216后(左移16位),再除以多项式GX , 所得的余数就是所要求的 CRC 码。 可以设 其中 Q n X 为整数, R n X 为 16 位二进制余数,将上式代入前式得 再设 其中 Qn-1X 为整数, Rn-1X 为 16 位二进制余数,继续代入前式,多次迭代 得到 根据 CRC 的定义,很显然,十六位二进制数 R0X 即是要求的 CRC 码。 3按字节计算CRC 对于一个二进制序列数可以按字节表示为下式,其中BnX 为一个字节共8 位 求此二进制序列数的CRC码时,先乘以216后(左移16位),再除以多项式GX, 所得的余数即是所要求的CRC 码。 可以设 其中QnX 为整数, RnX 为16位二进制余数,将上式代入前式得 由于 其中RnH8X 是RnX的高八位, RnL8X是RnX的低八位,代入前式得到 显然,十六位二进制数R0X即是要求的CRC码。 五、实验步骤 项目文件建立步骤同实验二,下面列出对给定字符串 CRC 校验主要步骤 步骤 1从主函数入口输入一个字符串,并且确定按字节32 位CRC 校验编 码,编码多项式采用CCITT 标准形式多项式。 步骤 2调用编码函数,依次读入字符串每个自己,进行模2 除法运算。 步骤 3将原来字符串左移32 位,将除法最后的余式追加到字符串的后32 位中去,得到该字符串CRC 校验编码结果。 步骤 4如果要解码,首先确认编码多项式,然后将接收字符串除以编码多 项式。如果能够整除,说明字符串在传输或存储中没有发生错误;否则,表明字 符串在传输或存储中产生错误,导致CRC 校验失败。 六、实验报告要求 1 按照实验一附 3 中实验报告样式提交本次实验报告。 2 要求写出 CRC 校验编码学习心得,最好是能够结合硬件设计谈一下校验编 码的设计体会。根据自己实验情况,写出自己的做实验中遇到的具体问题,对本 实验提出建议。 七、实验注意事项 1几个重要概念在实验前一定搞清楚 1) 模 2 加减法 异或(XOR)。 2) 多项式的表示方法。 3) CRC 校验的基本理论 a 可以参考前面文中的推导。 b 自己通过一个除法运算推导。 4) 常用的两种方法 a Bit 长度运算 b Byte 长度运算(可以将字节除法余式表保存下来,通过查表,计算 比较快) 2. 程序设计时注意内容 1) 注意检查字节输入顺序与多项式的关系 a 高字节前,低字节后,采用通常理论推导公式编写程序。 b 低字节前,高字节后,采用向右移位方式。(这是数据通信中常用方 式,多项式采用反转多项式,添加余式时注意低位在前,高位在后) 2) 注意寄存器初始值选择 CCITT 和CRC32 如果用在通信中,常采用初始值为0 xffff 或0 xffffffffL,可 以开始纠正数字通信中几个bit 连续为0 的情况。为保持其输出和采用初始值为 0 xffff 或0 xffffffffL 一致,最后CRC 校验值要与0 xffff 或0 xffffffffL 进行异或运 算(XOR)得到最终CRC 校验码。 CRC 校验码实验要求编写出 CRC 码的编码和解码程序。 1实验框架CRC 编码信道传输CRC 解码。 2CRC 编码将原始数据按照既定的生成多项式进行编码; 2信道传输中实现模拟信道,某些位数据随机发生差错; 3CRC 解码要能准确判断是否有差错,无差错要恢复出原始数据。 设计感言设计感言 这次课程设计历时二个星期多左右,通过课程设计,发现自己的很多不足, 自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能 力还急需提高。大学里一年的相处还赶不上这十来天的实习,我感觉我和同学们 之间的距离更加近了。 对我而言,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止 境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰 的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设 计必将成为我人生旅途上一个非常美好的回忆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值