实验二 香农编码的计算与分析
一、[实验目的]
1、理解香农第一定理指出平均码长与信源之间的关系。
2、加深理解香农编码具有的重要理论意义。
3、掌握Shannon 编码的原理。
4、掌握Shannon 编码的方法和步骤。
5、熟悉shannnon 编码的各种效率
二、[实验环境]
windows XP,MATLAB 7
三、[实验原理]
香农第一定理:
设离散无记忆信源为
12 (1)
(2)....()S s s sq
P p s p s p sq ⎡⎤⎡⎤=⎢⎥⎢⎥⎣⎦⎣⎦ 熵为H(S),其N 次扩展信源为 12 (1)
(2)....()N q S p p p q P αααααα⎡⎤⎡⎤=⎢⎥⎢⎥⎣⎦⎣⎦ 熵为H(S N )。
码符号集X=(x1,x2,…,xr )。
先对信源N S 进行编码,总可以
找到一种编码方法,构成惟一可以码,使S 中每个信源符号所需的平均码长满足: 1N L H S H S N N +>≥()()logr logr
当N →∞时 lim ()N r N L H S N
→∞= N L 是平均码长 1
()N
q N i i i L p αλ==∑ i λ是i α对应的码字长度
四、[实验内容]
1、根据实验原理,设计shannon 编码方法,在给定
条件下,实现香农编码并算出编码效率。
2、请自己构造两个信源空间,根据求Shannon 编码结果说明其物理意义。
五、[实验过程]
每个实验项目包括:1)设计思路2)实验中出现的问题及解决方法;
要求:
1)有标准的实验报告 (10分)
2)程序设计和基本算法合理(30分)
3)实验仿真具备合理性(30分)
4)实验分析合理(20分)
5)能清晰的对实验中出现的问题进行分析并提出解决方案(10分)
S
P s1 s2 s3 s4 s5 s6 s7
0.01 0.17 0.19 0.10 0.15 0.18 0.2
=
附录:程序设计与算法描述参考(1))按降序排列概率的函数
%[p,x]=array(P)为按降序排序的函数%
%P为信源的概率矢量,x为概率元素的下标矢量% %P为排序后返回的信源的概率矢量%
%x为排序后返回的概率元素的下标矢量%
%******************************%
function[p,x]=array(P)
n=length(P);
X=1:n;
P=[P;X];
for i=1:n
max=P(1,i);
maxN=i;
MAX=P(:,i);
for j=i:n
if(max<P(1,j))
MAX=P(:,j);
max=P(1,j);
maxN=j;
end
end
if (maxN>1)
if (i<n)
for k=(maxN-1):-1:i
P(:,k+1)=P(:,k);
end
end
end
P(:,i)=MAX;
end
p=P(1,:);
x=P(2,:);
(2)Shannon编码算法
% shannon编码生成器%
% 函数说明:%
% [W,L,q]=shannon(p) 为Shannon编码函数%
% p 为信源的概率矢量,W为编码返回的码字%
% L 为编码返回的平均码字长度,q 为编码概率%
% ******************************************************* %
function [W,L,q] =shannon(p)
% 提示错误信息%
if (length(find(p<=0)) ~=0)
error('Not a prob.vector.negative component'); % 判断是否符合概率分布条件end
% 1) 排序
if (abs(sum(p)-1)>10e-10)
error('Not a ponent do not add up to 1') %判断是否符合概率和为1
end
[p,x]=array(p);
% 2) 计算代码组长度l
l=ceil(-log2(p));
% 3) 计算累加概率P
P(1)=0;
n=length(p);
for i=2:n
P(i)=P(i-1)+p(i-1);
end
% 4) 求得二进制代码组W
% a) 将十进制数转为二进制数
for i=1:n
for j=1:l(i)
temp(i,j)=floor(P(i)*2);
P(i)=P(i)*2-temp(i,j);
end
end
% b) 给W赋ASCII码值,用于显示二进制代码组W for i=1:n
for j=1:l(i)
if (temp(i,j)==0)
W(i,j)=48;
else
W(i,j)=49;
end
end
end
L=sum(p.*l); % 计算平均码字长度
H=entropy1(p,2); % 计算信源熵
q=H/L; % 计算编码效率
for i=1:n
B{i}=x(i);
end
% [n,m]=size(W);
% TEMP=32*ones(n,6);
% W=[W,TEMP];
% W=W';
% [n,m]=size(W);
% W=reshape(W,1,n*m);
% W=sprintf('%s',W);
[m,n]=size(W);
TEMP=blanks(m);
W=[W,TEMP',TEMP',TEMP'];
[m,n]=size(W);
W=reshape(W',1,m*n);
s0='很好!输入正确,编码结果如下:';
s1='Shannon编码所得码字W:';
s2='Shannon编码平均码字长度L:';
s3='Shannon编码的编码效率q:';
disp(s0);
disp(s1),disp(B),disp(W); disp(s2),disp(L);
disp(s3),disp(q);。