给定字符概率的算术编码(matlab)

clear all
format long
symbol='abcd';
pr=[0.1 0.4 0.2 0.3];
seqin='cadacdb';
codeword=arenc(symbol,pr,seqin);
seqout=ardec(symbol,pr,codeword,7);

function symseq=ardec(symbol,pr,codeword,symlen)
%给定字符概率的算术编码
%输出:symse:字符串
%输入:symbol:由字符串组成的行向量
%pr:字符出现的概率
%codeword:码字
%symlen:待解码的字符串长度
format long
high_range=[];
for k=1:length(pr)
    high_range=[high_range sum(pr(1:k))];
end
low_range = [0 high_range(1:length(pr)-1)];
prmin=min(pr);
symseq=[];
for i=1:symlen;
    idx=find(low_range<=codeword, 1, 'last' );
    codeword=codeword-low_range(idx);
    if abs(codeword-pr(idx))<0.01*prmin
        idx=idx+1;
        codeword=0;
    end
    symseq=[symseq symbol(idx)];
    codeword=codeword/pr(idx);
if abs(codeword)<0.01*prmin
i=symlen+1;
    end
end


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值