Matlab-算术编码

信息论的第三个作业……终于是完完全全自己写的代码了!留下了不学无术的泪水QAQ

%算术编码程序
%输入:信源u、信源分布p、需要进行编码的序列s
%输入备注:输入格式:a=[0 1]  p = [1/4 3/4] s = [1 0 1 1 1]
%输出:该序列的算术编码S
%输出备注:以序列所在区间的左端点值作为所求序列的码字

%输入备注:如果信源符号是字符型,输入方式为:a = 'ab';  s = 'bbbababb';
%其实符号是数字可以写成数组也可以写成字符类型,matlab都支持运算,如:a = '01' s = '1101'
%序列比较长的时候写成字符类型比较方便

function [S] = suanshu(a,p,s)
%设置初始值,序列为空,左端点为0,右端点为1,长度为1
Slow(1)=0;
Shigh(1)=1;
range=Shigh(1)-Slow(1);

%计算信源符号的数目和所需要编码的序列长度
n = length(a);
m = length(s);

%计算信源a中每个元素对应的左右端点low high
low(1) = 0;
for i = 1:n
    if i == 1
        high(i) = p(i);
    else
        low(i) = p(i-1) + low(i-1);
        high(i) = low(i) + p(i);
    end
end
%开始遍历所要编码序列中的每个元素
for i = 1:m
    %寻找与当前元素相等的信源符号,把索引放入num中
    num = find(a==s(i));
    %开始计算添加新符号后的序列左右端点newSlow和newShigh
    Slow(i+1) = Slow(i) + range*low(num);
    Shigh(i+1) = Slow(i) + range*high(num);
    range = Shigh(i+1) - Slow(i+1);
end
%最后以序列所在区间的左端点值作为所求序列的码字
%即输出最后计算得到的Slow(m+1)
S = Slow(m+1);

运行结果示例:

>> a = '01'

a =

01

>> p = [1/8 7/8]

p =

    0.1250    0.8750

>> s = '11111110111110'

s =

11111110111110

>> suanshu(a,p,s)

ans =

    0.6312

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值