费诺编码的MATLAB语言实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《信息处理与编码》结课大作业
学号:
班级:
姓名:
成绩:
费诺编码的MATLAB语言实现
1.前言:
无失真的信源编码定理既是存在性定理又是构造性定理,即它给出了构造新源编码的原理性方法,使构造出的码其平均码长与信源统计特性相匹配。
2.正文:
费诺编码也是一种常见的信源编码方法。将信源消息(符号)按其出现的概率由小到大依次排列;将依次排列好的信源符号按概率值分为两大组,使两个组的概率和近于相同,并对各组分别赋于一个二进制码元”0”和”1”;将每一大组的信源符号再进一步分成两组,使划分后的两组的概率和近于相同,并又分别赋予一个二进制符号”0”和”1”;如此重复,直至每个小组只剩下一个信源符号为止;信源符号所对应的码字即为费诺码.
编码如下:
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);
end
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
if i<=k
B(i,2)=0;
else
B(i,2)=1;
end
end
END=B(:,2)';
END=sym(END);
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)
3.总结:
经过本次大作业,充分学习了编码理论这门课,并进一步了解编码的知识,掌握了编码原理的同时也提高了编码认识,为以后的学习中出现的可能问题做好了准备。