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