简述:
香农编码是是采用信源符号的累计概率分布
函数来分配字码的。香农编码是根据香农第一定理直接得出的,指出了平均码长与信息之间的关系,同时也指出了可以通过编码使平均码长达到极限值。香农第一定理是将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。香农编码属于不等长编码
,通常将经常出现的消息变成短码,不经常出现的消息编成长码,从而提高通信效率。 香农编码严格意义上来说不是最佳码,它是采用信源符号的累计概率分布函数来分配码字。
实验需求如下:
输入:信源符号个数q ,每个信源符号的概率分布P从键盘输入
输出:每个信源符号对应的Shannon 编码的码字
以下采用matlab实现:
close;clear;clc
%% 数据输入
i = 1;
strTemp = ['请输入第',num2str(i),'个概率(0退出):'];
p = [];
p(i) = input(strTemp);
while(p(end))
i = i+1;
strTemp = ['请输入第',num2str(i),'个概率(0退出):'];
temp = input(strTemp);
p = [p temp];
end
eps = 1e-5;
if(sum(p)>1.0+eps || sum(p)<1.0-eps)
error('概率和不等于1');
end
%% 初始化
n = length(p)-1; %由于最后一个数字为0
F = zeros(1,n);
logp = zeros(1,n);
L = zeros(1,n);
for i = 2:n
F(i) = F(i-1)+p(i-1);
logp(i-1) = -log2(p(i-1));
L(i-1) = ceil(logp(i-1));
end
logp(n) = -log2(p(n));
L(n) = ceil(logp(n));
%% 编码过程
for i = 1:n
temp1 = L(i);
temp2 = [];
temp3 = F(i);
while(temp1)
temp4 = fix(2*temp3);
temp3 = 2*temp3 - temp4;
temp2 = [temp2 num2str(temp4)];
temp1 = temp1 - 1;
end
fprintf('第%d个的香农编码为:%s\n',i,temp2);
end
运行结果: