实验四 香农编码
一、实验目的:
掌握香农编码的方法
二、实验内容:
对信源123456,,,,,()0.250.250.020.150.10.05a a a a a a X P X ⎧⎫⎛⎫=⎨⎬ ⎪⎝⎭⎩⎭
进行二进制香农编码。
并计算其平均码长,信源熵,和编码效率。
三、实验步骤
(1)将信源符号按概率从大到小的顺序排列。
(2)用Pa (i )表示第i 个码字的累加概率
(3)确定满足下列不等式的整数K (i ),并令K (i )为第i 个码字的长度
22log ()()1log ()Pa i K i Pa i -≤<-
(4)将Pa (i )用二进制表示,并取小数点后K (i )位最为a (i )的编码
四、实验数据及结果分析
(1)将信源符号按概率从大到小的顺序排列。
P=(0.25 0.25 0.2 0.15 0.1 0.05);
(2)用Pa (i )表示第i 个码字的累加概率。
Pa=(0 0.2500 0.5000 0.7000 0.8500 0.9500)
(3)确定满足下列不等式的整数K (i )。
K=(2 2 3 3 4 5)
(4)将Pa (i )用二进制表示,并取小数点后K (i )位最为a (i )的编码
00
01
100
101
1101
11110
(5)计算其平均码长,信源熵,和编码效率
平均码长 L=2.7
信源熵H=2.4232
编码效率xiaolv=0.89749
五、代码附录
N=input('N='); %输入信源符号的个数
s=0;L=0;H=0;
Pa=zeros(1,6);
for i=1:N
P(i)=input('P=');%输入信源符号概率分布
s=s+P(i);
end
if s~=1
error('不符合概率分布');
end
P=sort(P,'descend');
Pa(1)=0;
for i=2:N
Pa(i)=Pa(i-1)+P(i-1);
end
disp(Pa);
for i=1:N
a=-log2(P(i));
if mod(a,1)==0 %计算第i个码字的长度
K(i)=a;
else
K(i)=fix(a+1);
end
L=L+P(i)*K(i); %计算平均码长
H=H-P(i)*log2(P(i));%计算信源熵
End
xiaolv=H/L; %计算编码效率
for i=1:N
for j=1:K(i)
W(i,j)=fix(Pa(i)*2);
Pa(i)=Pa(i)*2-fix(Pa(i)*2);
fprintf('%d',W(i,j));
end
fprintf('\n');
end
六,实验总结:
通过该实验,掌握了香农编码。
其中对于小数二进制的转换更是有了深刻的
了解。
由编码效率的值可知,其编码效率并不是很高,当不等式
22log ()()1log ()Pa i K i Pa i -≤<-左边的等号成立时,
香农编码有很高的编码效率。