当前位置:首页 > 香农费诺埃利斯编码的MATLAB语言实现
《信息处理与编码》结课大作业
学号:班级:姓名:成绩:
香农—费诺—埃利斯码的MATLAB语言实现
1. 编码原理:香农—费诺—埃利斯码不是分组码,它根据信源符号的积累概率分配码字,不是最佳码,但它的编码和译码效率都很高。步骤1、求修正累计概率。2、转换成二进制小数形式。3、求码长。4、截取码字。 2. 编码如下:
clc; clear;
A=[0.4,0.3,0.1,0.09,0.07,0.04]; 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 q==p|q-p==1 B(p,j)=-1; else
if q-p==2 B(p,j)=0;
END(p)=[char(END(p)),'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)
运行结果如图1所示:
图1 运行结果
3.码表
如表1所示:
表1 香农—费诺—埃利斯码码表
符号 U1 U2 U3 U4 U5 U6 概率 0.4 0.1 0.3 0.09 0.07 0.04 F(u1) 0.4 0.5 0.8 0.89 0.96 1.0 F 0.2 0.45 0.65 0.845 0.925 0.98 二进制F 0.1 0.10 0.110 0.1110 0.11110 0.11111 码长 1 2 3 4 5 5 码字 0 10 110 1110 11110 11111 试验总结:
经过本次作业,不仅对费诺编码理论及其重点内容进行了复习,掌握了费诺编码原理的同时也锻炼了编程水平,同时也对matlab的程序设计及一些只是进行了稳固,对信息编码有了更深的了解并产生了浓厚的兴趣, 为以后的学习中出现的可能问题做好了准备,锻炼了自己的动手能力和设计能力,掌握了一种科技
工具,丰富了自己的学习生活。
共分享92篇相关文档