信息论与编码--费诺编码与哈弗曼编码比较

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

信源编码的比较

——哈弗曼编码与费诺编码

姓名:

班级:

学号:

一、实验目的:

1、实现常用的信源编码方案,以加深对编码理论的理解,促进对本课程所学知识的理解和把握。

2、课程实验主要为设计性实验,要求掌握Matlab使用方法。

3、通过信源编译码,理解信源编码的主要目的,掌握信源编码的方法和手段,掌握费诺编码和霍夫曼编码方法

二、实验设备:

装有matlab的计算机

三、实验原理:

信源编码主要可分为无失真信源编码和限失真信源编码。无失真信源编码主要适用于离散信源或数字信号,如文本、表格及工程图纸等信源,它们要求进行无失真地数据压缩,要求完全能够无失真地可逆恢复。

香农码、费诺码、哈夫曼码都考虑了信源的统计特性,使经常出现的信源符号对应较短的码字,使信源的平均码长缩短,从而实现了对信源的压缩。

费诺码比较适合于对分组概率相等或接近的信源编码。

哈夫曼码对信源的统计特性没有特殊要求,编码效率比较高,对编码设备的要求也比较简单,因此综合性能优于香农码和费诺码。(1)费诺码属于概率匹配编码,编码过程如下:

1、将信源发出的N个消息符号按其概率的递减次序依次排列。

2、将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予一个二进制代码符号“0”和“1”(编m进制码就分成m组)。

3、将每一个大组的信源符号进一步再分成两组,使划分后的两个组的概率和近于相同,并又分别赋予两组一个二进制符号“0”和“1”

4、如此重复,直至每组值只剩下一个信源符号为止

5、信源符号所对应的码符号序列即为费诺码

(2)霍夫曼编码过程:

1、将信源发出的N个消息符号按其概率的递减次序依次排列。

2、取概率最小的两个符号分别配以0和1两个码元,并将这两个符号的概率相加作为一个新概率,与未分配码元的符号重新按概率排队

3、对重排后的两个概率最小符号重复步骤2

4、不断重复上述过程,直到最后两个符号配以0和1为止

5、重最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。

四、实验内容:

1、哈弗曼编码

对如下信源进行哈弗曼编码,并计算编码效率。

X s1 s2 s3 s4 s5 s6 s7

P 0.09 0.18 0.23 0.17 0.1 0.07 0.16

(1)计算信源的信息熵,并对信源概率进行排序

(2)把概率最小的两个数相加合成一个概率,把这个合成概率与其他概率进行组合成新概率,再将最小的两个概率相加,直到只剩下两个概率,再反过来逐步向前编码,每一次有二个分支各赋予一个二进制码,大的赋值为1,小的赋值为0;

(3)向前返回得到各个信源符号所对应的码元序列,即相应的码字。

(4)计算码字平均码长,得出编码效率。

(5)实验程序:

1.哈弗曼编码

clear all;

p=[0.09 0.18 0.23 0.17 0.10 0.07 0.16];

l=0;

H=0;

N=length(p);

for i=1:N

H=H+(- p(i)*log2(p(i)));

end

fprintf('信源信息熵:\n');

disp(H)

for i=1:N-1

for j=i+1:N

if p(i)

m=p(j);

p(j)=p(i);

p(i)=m;

end

end

end

Q=p;

m=zeros(N-1,N);

for i=1:N-1

[Q,l]=sort(Q);

m(i,:)=[l(1:N-i+1),zeros(1,i-1)];

Q=[Q(1)+Q(2),Q(3:N),1];

end

for i=1:N-1

c(i,:)=blanks(N*N);

end

c(N-1,N)='0';

c(N-1,2*N)='1';

for i=2:N-1

c(N-i,1:N-1)=c(N-i+1,N*(find(m(N-i+1,:)==1))-(N-2):N*(find(m(N-i+1,:) ==1)));

c(N-i,N)='0';

c(N-i,N+1:2*N-1)=c(N-i,1:N-1);

c(N-i,2*N)='1';

for j=1:i-1

c(N-i,(j+1)*N+1:(j+2)*N)=c(N-i+1,N*(find(m(N-i+1,:)==j+1)-1)+1:N*find (m(N-i+1,:)==j+1));

end

end

for i=1:N

h(i,1:N)=c(1,N*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*N);

ll(i)=length(find(abs(h(i,:))~=32));

end

l=sum(p.*ll);

n=H/l;

fprintf('编码的码字:\n');

disp(h)

fprintf('平均码长:\n');

disp(l)

fprintf('编码效率:\n');

disp(n)

(6)实验结果:

2、费诺编码:

(1)对与哈弗曼编码的相同信源进行排序

(2)将信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号。依次下去,直至每一个小组只剩下一个信源符号为止

(3)由前向后向前返回得到各个信源符号所对应的码元序列,即相应的码字。

(4)计算平均码长,得到编码效率。

(5)实验程序:

Main函数:

clear all;

N=input('N=');

s=0;l=0;H=0;

相关文档
最新文档