香农编码的MATLAB实现
指导教师: 张 坤(讲师)
专业: 信息与计算科学(08级)
成员: 张深海(组长)
陈子姣 赵 静 范亚茹
实验目的:
用香农编码法编成二进制变长码,写出编码过程的Matlab程序。
实验内容:
香农编码方法:
(1) 将信源消息符号按其出现的概率大小依次排列为p1?p2?...?pn; (2) 确定满足下列不等式的整数码长ki为?lb(pi)?ki??lb(pi)?1; (3) 为了编成唯一可译码,计算第i个消息的累加概率Pi?(4) 将累加概率Pi变换成二进制数;
(5) 取Pi二进制数的小数点后ki位即为该消息符号的二进制码字。
?p(a);
kk?1i?1实验步骤:
(1) (2) (3) (4) (5)
用p = fliplr(p)语句对p进行从大到小的排序; 用for循环计算第i个消息的累加概率;
调用c = cell(1,n) , 将码字存在元胞数组中; 二进制转换;
得到该消息符号的二进制码字。
实验结果:
Matlab程序:
function c = shannon(p) [p , index] = sort(p) ; p = fliplr(p) ;%从大到小 n = length(p) ;
pa = 0 ;%累加概率 for i = 2:n
pa(i) = pa(i - 1) + p(i - 1) ; end
k = ceil(-log2(p)) ;%码字长度计算
c = cell(1,n) ;%生成元胞数组,存码字,是cell,跟上一行不一样 for i = 1:n c{i} = '' ;, tmp = pa(i) ; for j = 1:k(i)
tmp = tmp * 2 ;
if tmp >= 1
tmp = tmp - 1 ; c{i}(j) = '1' ; else
c{i}(j) = '0' ; end end end
%交换回原来的顺序 c = fliplr(c) ; c(index) = c ;
实例分析:
已知:信源消息符号出现的概率p=[0.20 0.19 0.18 0.17 0.15 0.10 0.01]
调用上述Matlab程序,得出下面结果:
该消息符号的二进制码字为:000 001 011 100 101 1110 1111110