一、实验目的:
(1)了解信源变长码的编码方法;
(2)掌握香农编码方法;
(3)掌握MATLAB的编程。
二、实验仪器:
Matlab2015a
三、实验原理:
1.将信源符号按概率从大到小顺序排列,
2.按下式计算第i个符号对应的码字的码长
3.计算第i个符号的累加概率
4.将累加概率Pi变换成二进制小数,取小数点后li位数作为第i个符号的码字。
四、实验步骤:
1.先利用Matlab编写函数;
2.再根据函数将实验要求生成实验结果;
3.根据实验内容填写实验报告;
五、实验内容及数据整理:
用Matlab软件编程实现Shannon编码
六、实验结果及讨论
clc;clear;close all
%% 数据输入
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
第二种方法:
clc;clear;close all
m=input('Enter the no.of message ensembles:'); %输入概率
z=[];
h=0;
l=0;
display('Enter the probabilities in descending order:') %按降序输入概率
for i=1:m
fprintf('Ensemble%d\n',i); %总体均值
p(i)=input('');
end
%Finding each alpha values 找到每个值
a(1)=0;
for j=2:m;
a(j)=a(j-1)+p(j-1);
end
fprintf('\n Alpha Matrix');
display(a);
%Finding each code length
for i=1:m
n(i)=ceil(-1*(log2(p(i))));
end
fprintf('\n Code length matrix');
display(n);
%Computing each code
for i=1:m
int=a(i);
for j=1:n(i)
frac=int*2
c=floor(frac);
frac=frac-c;
z=[z c];
int=frac;
end
fprintf('Codeword %d',i);
display(z);
z=[];
end
%Computing Avg.Code Length & Entropy
fprintf('Avg.Code Length');
for i=1:m
x=p(i)*n(i);
l=l+x;
x=p(i)*log2(1/p(i));
h=h+x;
end
display(l);
fprintf('Entropy');
display(h);
%Computing Efficiency
fprintf('Efficiency');
display(100*h/l);
fprintf('Redundancy');
display(100-(100*h/l));