离散信源无失真信源编码Word下载.docx
- 文档编号:20187272
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:10
- 大小:915.93KB
离散信源无失真信源编码Word下载.docx
《离散信源无失真信源编码Word下载.docx》由会员分享,可在线阅读,更多相关《离散信源无失真信源编码Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
六.实验感想------------------------------------------------------------(7)
七.参考资料------------------------------------------------------------(8)
一.报告题目:
二.实践目的:
熟练掌握无失真信源编码的方法;
熟练掌握Huffman编码的平均码长和编码效率的计算方法;
掌握Huffman码的编程实现。
三.实践内容:
设计一个离散信源无失真信源并进行Huffman编码;
利用C或者其他编程语言计算信源Huffman编码的平均码长和编码效率。
1,根据Huffman编码的方法步骤,编写二元Huffman编码的程序;
2,用习题5-13和例5-8验证程序的正确性。
四.实践模块:
1,Huffman编码的基本原理及特点
基本原理:
Huffman编码的原理就是构造一个码树。
Huffman编码是1952年为文本文件而建立,是一种统计编码。
属于无损压缩编码。
Huffman编码的码长是变化的,对于出现频率高的信息,编码的长度较短;
而对于出现频率低的信息,编码长度较长。
这样,处理全部信息的总码长一定小于实际信息的符号长度。
特点:
第一,哈夫曼编码实际上构造了一个码树,码树从最上层的端点开始构造,直到树根结束,最后得到一个横放的码树,因此,编出的码是即时码。
第二,哈夫曼编码采用概率匹配方法来决定各码字的码长,概率大的符号对应于短码,概率小的符号对应于长码,从而使平均码长最小。
第三,每次对概率最小的两个符号求概率之和形成缩减信源时,就构造出两个树枝,由于给两个树枝赋码元时是任意的,因此编出的码字并不惟一。
优点:
(1)有效的信源编码可取得较好的冗余压缩效果。
(2)有效的信源编码可使输出码元概率均匀化。
缺点:
(1)由于编码长度可变。
因此译码时间较长,使得霍夫曼编码的压缩与还原相当费时。
(2)编码长度不统一,硬件实现有难度。
(3)对不同信号源的编码效率不同,当信号源的符号概率为2的负幂次方时,达到100%的编码效率;
若信号源符号的概率相等,则编码效率最低。
(4)由于"
0"
与"
1"
的指定是任意的,故由上述过程编出的最佳码不是唯一的,但其平均码长是一样的,故不影响编码效率与数据压缩性能。
2,Huffman编码的基本步骤
(1)将信源符号按概率从大到小的顺序排列,为方便起见,令p(x1)≥p(x2)≥…≥p(xn)。
(2)对概率最小的两个信源符号求其概率之和,同时给两个符号分别赋予码元“0”和“1”。
将“概率之和”当作一个新符号的概率,与剩下符号的概率一起,形成一个缩减信源,结果得到一个只包含(n-1)个信源符号的新信源,称为信源的第一次缩减信源,用S1表示。
(3)将缩减信源S1的符号仍按概率从大到小的顺序排列,重复步骤2,得到只含(n-2)个符号的缩减信源S2。
(4)重复上述步骤,直至缩减信源只剩下两个符号为止,此时所剩两个符号的概率之和必为1。
(5)按上述步骤实际上构造了一个码树,从树根到端点经过的树枝即为码字。
3,Huffman编码的程序流程图:
压缩源文件
生成压缩代码表
排序并构造Huffman树
统计字符出现概率
程序流程图:
4,实现二元Huffman码编码的源程序:
(见附录)
5,实验效果:
理论分析:
实验结果
由图可见,实验结果一样。
由于例5-8概率有点特殊,考虑到5-13是三进制符号编码,要修改程序。
为方便,所以最后改成用例5-7验证如下
由图可见,结果与理论一致。
证明了程序的正确性。
五,课题讨论
讨论不同的Huffman编码的平均码长如何变化,码字长度偏离平均码长对编码性能的影响:
由于"
的指定是任意的,故编出的最佳码不是唯一的,因此会得到不同的Huffman码,但不会影响码字的长度,故其平均码长是一样的,不影响编码效率与数据压缩性能。
六,实验感想
通过这次课程编码实验,我从中得到很多收获,不仅进一步学会了对于C语言的灵活应用,更接触到了一些以前没有接触过的C语言用法,对于很多概念,例如结构体,二维数组有了更加深入的认识,区分了很多以前一直模糊的概念,对于指针的运用更加熟练,此外,我也提高了自己的算法设计能力,提高了编程应用能力和分析解决问题的能力,对于信息论中的编码在改善通信效率方面发挥的重要作用有了更加直观得到认识。
更重要的是,通过此次编程,让我对Huffman编码有了更加深刻的认识!
七,参考资料
附录C程序
//test.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"
stdafx.h"
#include<
iostream>
math.h>
string>
iomanip>
usingnamespacestd;
chara0;
intn;
stringfinal[20];
intisin(stringstr,chara)
{
inttemp=0;
for(inti=0;
i<
str.length();
i++)
{
if(str[i]==a)temp=1;
}
returntemp;
}
voidbubble(doublep[],stringsign[])//排序
n-1;
for(intj=i+1;
j<
n;
j++)
{
if(p[i]<
p[j])
{
doubletemp=p[i];
p[i]=p[j];
p[j]=temp;
stringm=sign[i];
sign[i]=sign[j];
sign[j]=m;
}
}
voidhuffman(doubletempp[],stringtempstr[])//huffman编码
doublep[20][20];
stringsign[20][20];
sign[0][i]=tempstr[i];
p[0][i]=tempp[i];
//tempp为信源概率
for(i=0;
bubble(p[i],sign[i]);
//sign为信源符号
for(intj=0;
n-2-i;
j++)//概率信源符号的复制
p[i+1][j]=p[i][j];
sign[i+1][j]=sign[i][j];
p[i+1][j]=p[i][j]+p[i][j+1];
//概率相加
sign[i+1][j]=sign[i][j]+sign[i][j+1];
//符号相加
for(j=n-1-i;
p[i+1][j]=0;
//其余概率为0
sign[i+1][j]="
"
;
//其余符号为空
for(i=n-2;
i>
=0;
i--)
{
for(intk=0;
k<
k++)
if(isin(sign[i][n-2-i],sign[0][k][1]))final[k]+="
//统计最后编码结果
if(isin(sign[i][n-1-i],sign[0][k][1]))final[k]+="
cout<
<
endl;
cout<
setw(7)<
sign[j][i];
if(p[j][i]>
0)cout<
setw(6)<
p[j][i];
elsecout<
cout<
信源符号"
概率"
码字"
码长"
sign[0][i]<
p[0][i]<
final[i]<
setw(7)<
final[i].length()<
}
}
voidmain()
{
*************************************************"
哈夫曼编码"
姓名:
张艺成学号:
09142047"
信源符号个数n="
cin>
>
信源符号依次为:
stringstr[20];
cin>
str[i];
doubletempp[20];
信源符号概率依次为:
A:
floatpsum=0.0;
tempp[i];
psum+=tempp[i];
if(psum!
=1)
{cout<
输入有误,请重新输入!
gotoA;
elsecout<
输入正确,计算结果为:
huffman(tempp,str);
doubleH=0.0,k=0.0,Y=0.0;
for(intj=0;
H+=-tempp[j]*log10(tempp[j])/0.301;
k+=tempp[j]*final[j].length();
Y=H/k*100;
信源熵H="
H<
平均码长为:
编码效率为"
Y<
%"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 离散 信源 失真 编码