香农编码实验报告
姓名:徐以刚 学号:20094034 专业班级:信计09.1 学院:理信学院
一 、实验目的
1. 了解香农编码的基本原理及其特点;
2. 熟悉掌握香农编码的方法和步骤;
3. 掌握C 语言或者Matlab 编写香农编码的程序。
二、实验要求
对于给定的信源的概率分布,按照香农编码的方法进行计算机实现.
三、实验原理
给定某个信源符号的概率分布,通过以下的步骤进行香农编码
1.信源符号按概率从大到小排列
2. 对信源符号求累加概率,表达式: G i =G i-1+p(x i )
3. 求自信息量,确定码字长度。
自信息量I(x i )=-log(p(x i ));码字长度取大于等
于自信息量的最小整数。
4. 将累加概率用二进制表示,并取小数点后码字的长度的码 。
四、实验内容
离散无记忆信源符号S 的概率分布:
S
1S 2S 3S 4S 5S 6S 7S
P(S) = 0.20 0.19 0.18 0.17 0.15 0.10 0.01
对离散无记忆信源分布S 进行香农编码
1.画出程序设计的流程图
2.写出程序代码,
N=input('N='); %输入信源符号的个数
s=0;
l=0;
H=0;
for i=1:N
p(i)=input('p='); %输入信源符号概率分布矢量,p(i)<1
s=s+p(i)
H=H+(-p(i)*log2(p(i)));I(i)=-log2(p(i)); %计算信源信息熵end
if abs(s-1)>0,
error('不符合概率分布')
end
for i=1:N-1
for j=i+1:N
if p(i)<p(j)
m=p(j);
p(j)=p(i);
p(i)=m;
end
end
end %按概率分布大小对信源排序
a=-log2(p(i));
if mod(a,1)==0
w=a;
else
w=fix(a+1);
end %计算各信源符号的码长
l=l+p(i)*w; %计算平均码长end
l=l;
n=H/l; %计算编码效率P(1)=0
for i=2:N
P(i)=0;
for j=1:i-1
P(i)=P(i)+p(j);
end
end %计算累加概率for i=1:N
for j=1:w
W(i,j)=fix(P(i)*2);
P(i)=P(i)*2-fix(P(i)*2);
end %将累加概率转化为L(i)位二进制码字 disp(W) %显示码字
disp(l) %显示平均码长
disp(n) %显示编码效率
disp(I) %显示自信息量
3.写出在调试过程中出现的问题 ,
问题1:自信量程序不会编写
问题2:累加概率时注意P(1)=0
问题3:程序运行时要依次输入各个符号概率
4.对实验的结果进行分析
由程序运行结果,得
2.3219 2.3959 2.4739 2.5564 2.7370
3.3219 6.6439
所以我们得到每个信源符号的自信息量为
1() 2.3219I s = 2() 2.3959I s = 3() 2.4739I s = 4() 2.5564I s = 5() 2.7370I s = 6() 3.3219I s = 7() 6.6439
I s = 根据公式log ()log ()1i i i p s l p s -≤≤-+,我们得到每个信源符号的码长为
13l = 23l = 33l = 43l = 53l = 64l = 77l =
由程序运行结果,
0 0 0 0 0 0 0
0 0 1 1 0 0 1
0 1 1 0 0 0 1
1 0 0 1 0 0 0
1 0 1 1 1 1 0
1 1 1 0 0 0 1
1 1 1 1 1 1 0
我们得到每个信源符号的为i G 对应的二进制数为:
10.0000000G = 20.0011001G = 30.0110001G = 40.1001000G = 50.1011110G = 60.1110001G = 70.1111110G =
所以我们得到每个信源符号的码字为:
1:000
s
2:001
s
3:011
s
4:100
s
5:101
s
6:1110
s
7:1111110
s
平均码长为:3.14
编码效率为:0.8308
五、实验结论与心得
通过此次实验,我更加理解求香农编码的原理及步骤,掌握了运用MATLAB软件求某个符号信源的香农编码程序算法,加强了我对matlab程序的学习,进一步提高了我的编程能力。