用MATLAB实现费诺编码

一、简述

《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能, 提高实践技能,培养独立分析问题、解决问题及实际应用的能力。
通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法。

二、费诺编码的分析与实现

(一)设计原理

1.编码原理
早期的数据压缩来自于人们对概率的了解。当对文字信息进行编码时,如果出现概率较高的字幕赋予较短的编码,为出现概率较低的字母赋予较长的编码,平均编码长度就能缩短不少。著名的Morse 电码就是一个范例。信息论之父CE Shannon曾指出,任何信息都存在冗余,冗余大小与信息中每个符号出现概率(不确定性)有关。他所提出的无失真信源编码定理奠定了数据压缩的理论基础。数据压缩的目的就是要消除冗余,信息论是运用概率论与数理统计的方法研究信息、信源熵、通信系统、数据传输、密码学、数据压缩等问题的应用数学学科。 从DVD到个人电脑,从卫星通信到文件,在我们今天的生活中,信息几乎在每个领域都扮演者重要角色。工程师克劳德香农于1948年奠定了信息论的基础,他指出了通信的极限。基于这一理论产生了数据压缩技术、纠错技术等各个应用技术,这些技术提高了数据传输和存储的效率。信息论将信息的传递作为一种统计现象来考虑,给出了估算通信信道容量的方法。信息传输和信息压缩是信息论研究中的两大领域。这两个方面又由信息传输定理、信源-信道隔离定理相互联系。当然,信息论的重大应用远不止于此。DNA是一种信息存储物质,正事信息论帮助人们解开了生物基因组密码之谜。简单地说信息论包含了生命、宇宙乃至一切。
信息论对现代社会的影响是多方面的。首先,在理论研究方面,信息论所处的地位已远远超出了香农当年所界定的“通信的数学理论”的范畴,得到了不断的扩充和发展,出现了语义信息、语法信息与语用信息等研究与信息的意义有关的学科,以及面向智能研究的全信息理论。如今,信息已成为与物质、能量并列的宇宙中的三个基本要素,世间万物的发展变化可归结为物质、能量和信息的传递和转化过程。另一方面,在科学和技术高度发展的今天,信息的概念也被渗透到许多不同的学科和领域,深入到了社会生活的各个方面,成为可与相对论和量子力学并驾齐驱的新一-代边缘交叉学科的重要组成部分。特别是以信息论、控制论、和系统论为代表的“老三论”以及以普利高津的耗散结构理论,哈肯的协同学和托姆的突变论或艾根的超循环理论为代表的“新三论”的出现,标志着一-代新的边缘交叉学科的兴起。它们的形成和发展对现代科学的研究具有重要的方法论_上的指导意义。

2.信源编码原理
由于信源符号之间存在分布不均匀和相关性,是的信源存在冗余度,信源编码的主要任务就是减少冗余,提高编码效率。具体说,就是针对仙缘输出符号序列的统计特性,寻找–定的方法把信源输出符号序列变换为最短码字序列的方法。信源编码的基本途径有两个:使序列中的各个符号尽可能的相互独立,及解除相关性;使编码中各个符号出现的概率尽可能地相等,即概率均匀化。
信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理,前者是可逆编码的基础。可逆是指当信源符号转换成代码后,可从代码无失真的恢复原信源符号。当己知信源符号的概率特性时,可计算它的符号熵,这边是每个信源符号所载有的信息量。编码定理不但证明了必定存在一种编码方法,可使代码的平均长度可任意接近但不低于符号熵,而且还阐明达到这木匾的途径,就是使概率与码长匹配。无失真编码或可逆编码只适用与离散信源。对于连续信源,编成代码后就无法无失真地恢复原来的连续值,因为后者的取值可有无限多个。此时只能根据率失真编码定理在失真受限制的情况下进行限失真编码。信源编码定理出现后,编码定理趋于合理化。关于离散信源编码,从无失真编码定理出发。
若要所编的码是惟一-可译码.不但要求编码时不同的信源符号变换成不同的码字,而且必须要求任意有限长的信源序列所对应的码符号序列各不相同,即要求码的任意有限长N次扩展码都是非奇异码。因为只有任意有限长的信源序列
所对应的码符号序列各不相同,才能把该码符号序列惟一地分割成一个个对应的信源符号,从而实现惟一一的译码。

3.费诺编码原理
费诺编码就是通过使编码中各个句号出现的概率大致相等,实现概率均匀化,从而减少冗余度,提高编码效率。凡是能载荷一定的信息量, 且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。在编N进制码时首先将信源消息符号按其出现的额概率–次又小到大排列开来,并将排列好的心愿符号按概率值分N大组,使N组的概率之和近似相同,并对各组赋予一个N进制码元0、…N-1。
之再针对每一个大组内的心愿符号做如上处理,即再分为概率相同的N组,赋予N进制码元。如此重复,直到每组只剩下一个心愿符号为止。此时每个信源符号所对应的码字即为费诺码。针对同一个心愿, 费诺码比香农码平均码长小,消息出书速率大,编码效率高。费诺编码是一种信源编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率大,编码效率高。但它属于概率匹配编码它不是最佳的编码方法。

4.费诺编码特点
费诺编码是一-种信源编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率大,编码效率高。但它属于概率匹配编码它不是最佳的编码方法。
费诺编码属于概率匹配编码,具有如下特点:
(1)概率大,则分解次数少;概率小则分解次数多,这符合最佳编码原则。
(2)码字集合是唯一-的。.
(3)分解之后先得码字后得码长。.

(二)设计步骤

1.费诺码编码步骤
(1)将信源消息符号按其出现的概率大小依次排列: p2p…2pn。
(2)将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一一个_二进制码元“0”和“1”。
(3)将每–大组的信源符号再分成两组,使划分后的两个组的概率之和近似相同,并对各组赋予一一个二进制符号“0”和“1”。
(4)如此重复,直至每个组只剩下一一个信源符号为止。
(5)信源符号所对应的码子即为费诺码.

三、用MATLAB实现费诺编码

MATLAB程序代码:

fprintf(’-------通信1702班魏照举--------\n’);
fprintf(’-------费诺编码程序--------\n’);
fprintf(’-------201721112051--------\n’);
A=[0.4,0.3,0.1,0.09,0.05,0.03,0.02,0.01];
A=fliplr(sort(A));%降序排列
[m,n]=size(A);
for i=1:n
B(i,1)=A(i);%生成B的第1列
end
%生成B第2列的元素
a=sum(B(:,1))/2;
for k=1:n-1
if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a)
break;
end
end
for i=1:n%生成B第2列的元素
if i<=k
B(i,2)=0;
else
B(i,2)=1;
end
end
%生成第一次编码的结果
END=B(:,2)’;
END=sym(END);
%生成第3列及以后几列的各元素
j=3;
while (j~=0)
p=1;
while(p<=n)
x=B(p,j-1);
for q=p:n
if x==-1
break;
else
if B(q,j-1)x
y=1;
continue;
else
y=0;
break;
end
end
end
if y
1
q=q+1;
end
if qp|q-p1
B(p,j)=-1;
else
if q-p2
B(p,j)=0;
END§=[char(END§),‘0’];
B(q-1,j)=1;
END(q-1)=[char(END(q-1)),‘1’];
else
a=sum(B(p:q-1,1))/2;
for k=p:q-2
if abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1,1))-a);
break;
end
end
for i=p:q-1
if i<=k
B(i,j)=0;
END(i)=[char(END(i)),‘0’];
else
B(i,j)=1;
END(i)=[char(END(i)),‘1’];
end
end
end
end
p=q;
end
C=B(:,j);
D=find(C
-1);
[e,f]=size(D);
if e==n
j=0;
else
j=j+1;
end
end
B
A
END
for i=1:n
[u,v]=size(char(END(i)));
L(i)=v;
end
avlen=sum(L.*A)
H=-sum(A.*log2(A))%输出信息熵
p=H/avlen %输出编码效率

四、实验结果结果图:

用MATLAB实现费诺编码_第1张图片
用MATLAB实现费诺编码_第2张图片

你可能感兴趣的:(matlab)