信息论课程设计

  • 格式:doc
  • 大小:313.50 KB
  • 文档页数:19

下载文档原格式

  / 19
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子科技大学电子工程学院信息论课程设计报告课程名称:信息编码与加密

课程设计报告

学生姓名:农瀚学号:2014020908021 指导教师:李万春

一、课程设计名称:编程实现霍夫曼、费诺、香农编码

二、课设原理:

1)霍夫曼编码:霍夫曼编码的平均码长最短,是最佳编码。编码步骤如下:

(1)将信源符号按概率大小排序;

(2)对概率最小的两个符号求其概率之和,同时给两幅

号分别赋予码元0和1;

(3)将概率之和当做一个新符号的概率。与剩下的概率一起,形成一个缩减信源,再重复上述步骤,直到概率和为1为止;(4)按上述步骤实际上构成了一个码树,从根到端点经过的树枝即为码字。

2)费诺编码:

编码步骤如下:

(1)将信源概率从大到小排序;

(2)将信源符号分成两组,使两组信源符号的概率之和近似相等,并给两组信源符号分别赋0和1;

(3)再把各个小组的信源符号细分为两组并赋码元,方法与第一次分组相同;

(4)如此一直下去,直到每一个小组只含一个信源符号为止;(5)由此可构造成一个码树,所有终端节点上的码字组成费诺码。

3)香农编码:

编码方法如下:

⑴将信源消息符号按其出现的概率大小依次排列

p(u1)≥p(u2)≥…≥p(un)

⑵确定码长Ki (整数) :

Ki= []——取整

⑶为了编成唯一可译码,计算第i个消息的累加概率

⑷将累加概率Pi变换成二进制数。

⑸取pi二进制数的小数点后Ki位即为该消息符号的二进制数。

三、课设目的:通过编程实现三种方式的编码,掌握三种编

码方式的步骤。

四、课设内容:

三种编码方式的编程思路:

1、霍夫曼编码:(1)对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。)

(2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左

右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。

(3)从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。

(4)重复二和三两步,直到集合F中只有一棵二叉树为止。

2、费诺编码的编程思路:(1)先使用冒泡法对信源概率概率排序;(2)依次将按排好序的符号概率进行近似1:1分成两大组;

(3)对各组赋予一个二进制码元“0”和“1”;

(4)输出符号,符号概率及编码。

3、香农编码:

(1)对于一个给定的符号列表,制定了概率相应的列表或频率计数,使每个符号的相对发生频率是已知。

(2)排序根据频率的符号列表,最常出现的符号在左边,最少出现的符号在右边。

(3)清单分为两部分,使左边部分的总频率和尽可能接近右边部分的总频率和。

(4)该列表的左半边分配二进制数字0,右半边是分配的数字1。这意味着,在第一半符号代都是将所有从0开始,第二半的代码都从1开始。

(5)对左、右半部分递归应用步骤3和4,细分群体,并添加位的代码,直到每个符号已成为一个相应的代码树的叶。

五、器材(设备、元器件):

计算机、visual studio2017社区版

六、设计代码:见附录

九、实验数据及结果

根据上述实验程序得到的实验数据及结果如下:霍夫曼编码:

费诺编码:

香农编码:

十、结论

完成了20个非等概随机信源的霍夫曼、费诺和香农编码,并给出了编码效率和码字。

十一、总结及心得体会

通过这次课程设计,我掌握了三种编码方式的步骤,并能够利用编程实现编码,提高了自己的编程水平和对该知识点的掌握程度。

附录代码:

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。

//

/*******霍夫曼编码*************/

#include"stdafx.h"

#include

#include

#include

#include

#include

#include

using namespace std;

#define SourNum 20

#define MAXBIT 100

#define MaxValue 10000

#define MAXLEAF 30

#define MAXNODE MAXLEAF*2 -1

double Sp[SourNum];

char coder[100][100];

int bitlong[100];

void ProSource()//产生非等概信源的函数

{

int n = 0;

srand((unsigned)time(0));

double sum = 0;

while (1)

{

Sp[n] = (double)rand() / (RAND_MAX);//产生随机浮点数

sum = sum + Sp[n];

if (sum < 1 && Sp[n] <0.086)

{

n++;

if (n >19)

break;

else continue;

}

else

{

sum = sum - Sp[n];

Sp[n] = 0;

continue;

}

}

Sp[SourNum] = 1 - sum;

}

/*******霍夫曼编码*************/

typedef struct

{

int bit[MAXBIT];

int start;

} HCode;

typedef struct

{

double weight;

double parent;

double lchild;

double rchild;

int last;

} HNodeType;