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