信息论霍夫曼香农费诺编码.docx
《信息论霍夫曼香农费诺编码.docx》由会员分享,可在线阅读,更多相关《信息论霍夫曼香农费诺编码.docx(9页珍藏版)》请在冰豆网上搜索。
信息论霍夫曼香农费诺编码
信息论霍夫曼、香农-费诺编码
信息论第二次作业
——数据压缩算法的实现
班别:
1307011班
学号:
130********
姓名:
黄丹丹
一、实验目的:
通过该实验,利用香农编码-费诺编码和霍夫曼编码实现图像数据压缩。
matlab7.1
四、实验内容
1、对于给定的信源的概率分布,用香农-费诺编码实现图像压缩
2、对于给定的信源的概率分布,用霍夫曼编码实现图像压缩
五、实验过程
1.香农-费诺编码
编码1
functionc=shannon(p)
%p=[0.20.150.150.10.10.10.10.1]
%shannon(p)
[p,index]=sort(p)
p=fliplr(p)
n=length(p)
pa=0
fori=2:
n
pa(i)=pa(i-1)+p(i-1)
end
k=ceil(-log2(p))
c=cell(1,n)
fori=1:
n
c{i}=”
tmp=pa(i)
forj=1:
k(i)
tmp=tmp*2
iftmp>=1
tmp=tmp-1
c{i(j)='1'
else
c{i}(j)='0'
end
end
end
c=fliplr(c)
c(index)=c
编码2
clc;
clear;
A=[0.4,0.3,0.1,0.09,0.07,0.04];
A=fliplr(sort(A));%降序排列
[m,n]=size(A);
fori=1:
n
B(i,1)=A(i);%生成B的第1列
end
%生成B第2列的元素
a=sum(B(:
1))/2;
fork=1:
n-1
ifabs(sum(B(1:
k,1))-a)<=abs(sum(B(1:
k+1,1))-a)
break;
end
end
fori=1:
n%生成B第2列的元素
ifi<=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);
forq=p:
n
ifx==-1
break;
else
ifB(q,j-1)==x
y=1;
continue;
else
y=0;
break;
end
end
end
ify==1
q=q+1;
end
ifq==p|q-p==1
B(p,j)=-1;
else
ifq-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;
fork=p:
q-2
ifabs(sum(B(p:
k,1))-a)<=abs(sum(B(p:
k+1,1))-a);
break;
end
end
fori=p:
q-1
ifi<=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);
ife==n
j=0;
else
j=j+1;
end
end
B
A
END
fori=1:
n
[u,v]=size(char(END(i)));
L(i)=v;
end
avlen=sum(L.*A)
2. 霍夫曼编码
function c=huffman(p)
n=size(p,2)
ifn==1
c=cell(1,1)
c{1}=''
return
end
[p1,i1]=min(p)
index=[(1:
i1-1),(i1+1:
n)]
p=p(index)
n=n-1
[p2,i2]=min(p)
index2=[(1:
i2-1),(i2+1:
n)]
p=p(index2);
i2=index(i2)
index=index(index2)
p(n)=p1+p2
c=huffman(p)
c{n+1}=strcat(c{n},'1')
c{n}=strcat(c{n},'0')
index=[index,i1,i2]
c(index)=c