Matlab Shannon编码实验

一、实验目的:

(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));

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值