香农编码的MATLAB实现 下载本文

香农编码的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