当前位置:文档之家› 信息论与编码实验书

信息论与编码实验书

信息论与编码实验报告班级:姓名:学号:实验一 绘制二进熵函数曲线(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 px x XP 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轴输入标题信源熵。

实验二:香农编码软件实现(2个学时)1、实验目的(1)了解香农编码的基本原理及其特点;(2)熟悉掌握香农编码的方法和步骤;(3)掌握C语言或者Matlab编写香农编码的程序。

2、实验报告要求(1)简要总结香农编码的基本原理与特点(2)写出香农编码的基骤,画出实本步现香农编码的程序流程图(3)实现香农编码的Matlab或者C源程序3、实验内容(1)根据香农编码的方法和步骤,用香农编码编写程序(2)用编写的源程序验证书中例题的正确性。

4.实验总结A.香农编码步骤:a.按信源概率从大到小排序b.求概率和记为pac.求自信息量,确定码字长度ki,若自信息量为整数,则ki就等自信息量,否则则为大于自信息量最小的一个整数d.对pa进行二进制转换,若二进制的ki位,例如pa=0.25,ki=3;(0.25)=(0.01),那么得码字为010,不足补零B. 香农编码的基本原理与特点香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使平均码长达到极限值。

C.实验心得:通过这次实验我了解了香农编码的基本原理及其特点,明白了香农编码的基骤,对课本的内容有了进一步的了解。

实验三: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)部分伪代码:(二)算法#include <iostream>#include <math.h>#include<conio.h>struct HuffmanNode{char des[20];double p;int flag;int parent;int leftChild;int rightChild;char code[20];};void Init(HuffmanNode huffTree[],int n){for(int i = 0; i < 2 * n - 1 ; i++){if(i < n){printf("请描述第%d个信源符号:",i+1);scanf("%s",huffTree[i].des);printf("\t\t信源概率(0<p<1):");scanf("%lf",&huffTree[i].p);}elsehuffTree[i].p = 0;huffTree[i].parent = 0;huffTree[i].flag = 0;huffTree[i].leftChild = -1;huffTree[i].rightChild = -1;}}void Haffman(HuffmanNode huffTree[],int n){int j;for(int i = 0;i < n-1;i++){int x1, x2;double m1, m2;m1=1;m2=1;for(j=0;j<n+i;j++){if((huffTree[j].p<m1)&&huffTree[j].flag==0) {m1=huffTree[j].p;x1=j;}}huffTree[x1].flag = 1;for(j=0;j<n+i;j++){if(huffTree[j].p<m2&&huffTree[j].flag==0) {m2=huffTree[j].p;x2=j;}}huffTree[x2].flag = 1;huffTree[x1].parent = n+i;huffTree[x2].parent = n+i;huffTree[n+i].p = huffTree[x1].p+huffTree[x2].p;huffTree[n+i].leftChild=x1;huffTree[n+i].rightChild=x2;}}void HaffmanCode(HuffmanNode huffTree[], int n){int parent,child;for(int i = 0; i < n; i++){memset(huffTree[i].code,0,20);child=i;parent = huffTree[i].parent;while(parent!= 0){if(child==huffTree[parent].leftChild)strcat(huffTree[i].code,"1");elsestrcat(huffTree[i].code,"0");child=parent;parent=huffTree[parent].parent;}for (int j=0; j < strlen(huffTree[i].code)/ 2;j++){char temp = huffTree[i].code[j];huffTree[i].code[j]= huffTree[i].code[(strlen(huffTree[i].code) - 1) - j];huffTree[i].code[(strlen(huffTree[i].code) - 1) - j] = temp;}}}double enta(HuffmanNode huffTree[], int n){double k=0,hx=0;for(int i=0;i<n;i++){k+=huffTree[i].p*strlen(huffTree[i].code);hx+=-huffTree[i].p*log(huffTree[i].p)/log(2);}return hx/k;}void main(){printf(">>>>>>>>>>>>>>>>>>>>>>>>>>> Huffman编码程序\a<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");int i,n;printf("输入信源符号个数:");scanf("%d",&n);HuffmanNode *myhuffTree = new HuffmanNode[2*n-1];Init(myhuffTree,n);Haffman(myhuffTree,n);HaffmanCode(myhuffTree, n);system("cls");printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 编码结果\a<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\n");for(i = 0; i < n; i++)printf("信源符号:%20s\t概率=%0.5f\t编码为:%20s\n",myhuffTree[i].des,myhuffTree[i].p,myhuffTree[i].code); printf("\n\t\t编码效率为:%2.3f%%\n",enta(myhuffTree,n)*100);printf("\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<按任意键退出>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");getch();}4、实验报告(1)简要总结Huffman编码的原理与特点(2)写出Huffman编码的基本步骤,画出实现Huffman编码的程序流程图(3)给出Huffman编码的源程序,并给出实验过程中的测试结果(4)总结实验过程遇到的问题及解决方法5.实验心得a.. Huffman编码的基本步骤将信源消息依次排序取两个概率最小的字母分别配以0和1两个码元,并将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。

相关主题