香农编码的MATLAB实现

香农编码的MATLAB实现
香农编码的MATLAB实现

香农编码的MATLAB实现

指导教师:张坤(讲师)

专业:信息与计算科学(08级)

成员:张深海(组长)

陈子姣

赵静

范亚茹

实验目的:

用香农编码法编成二进制变长码,写出编码过程的Matlab程序。

实验内容:

香农编码方法:

p?p?...?p;)将信源消息符号按其出现的概率大小依次排列为(1n12?lb(p)?k??lb(p)?1k;为)确定满足下列不等式的整数码长(2iiiii?1?i)?p(aP个消息的累加概率)(3为了编成唯一可译码,计算第;ki1k?P变换成二进制数;(4)将累加概率i kP二进制数的小数点后位即为该消息符号的二进制码字。(5)取ii实验步骤:

(1)用p = fliplr(p)语句对p进行从大到小的排序;

用for循环计算第i个消息的累加概率;(2)

调用c = cell(1,n) ,(3)将码字存在元胞数组中;

二进制转换;)(4得到该消息符号的二进制码字。(5)

实验结果:

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

相关主题
相关文档
最新文档