信息论课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学电子工程学院信息论课程设计报告
<
课程名称:信息编码与加密
,
课程设计报告
学生姓名:农瀚学号:20 指导教师:李万春
一、课程设计名称:编程实现霍夫曼、费诺、香农编码
二、课设原理:
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个非等概随机信源的霍夫曼、费诺和香农编码,并给出了编码效率和码字。
十一、总结及心得体会
通过这次课程设计,我掌握了三种编码方式的步骤,并能够利用编程实现编码,提高了自己的编程水平和对该知识点的掌握程度。
附录代码:
;
eight = 0;
HuffNode[i].parent = -1;
HuffNode[i].lchild = -1;
HuffNode[i].rchild = -1;
}
for (i = 0; i < n; i++)
{
HuffNode[i].weight = Sp[i];
…
}
for (i = 0; i < n - 1; i++)
{
m1 = m2 = MaxValue;
x1 = x2 = 0;
for (j = 0; j < n + i; j++)
{
if (HuffNode[j].weight < m1 && HuffNode[j].parent == -1)
#
{
m2 = m1;
x2 = x1;
m1 = HuffNode[j].weight;
x1 = j;
}
else if (HuffNode[j].weight < m2 && HuffNode[j].parent == -1)
{
m2 = HuffNode[j].weight;
x2 = j;
/
}
}
HuffNode[x1].parent = n + i;
HuffNode[x2].parent = n + i;
HuffNode[n + i].weight = HuffNode[x1].weight + HuffNode[x2].weight;
HuffNode[n + i].lchild = x1;
HuffNode[n + i].rchild = x2;
}
}
double CodEffi()arent;
!
while (p != -1)
{
if (HuffNode[p].lchild == c)
[] = 0;
else