100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 图像压缩编码码matlab实现——算术编码

图像压缩编码码matlab实现——算术编码

时间:2018-07-12 12:28:05

相关推荐

图像压缩编码码matlab实现——算术编码

clear all

clc

format long;

symbol = ['abcd'];

pr = [0.1 0.4 0.2 0.3];

seqin = ['cadacdb'];

codeword = arencode(symbol, pr, seqin)

seqout = ardecode(symbol, pr, codeword, 7)

function symseq = ardecode(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 = [];

symseq = [];

for i = 1 : symlen,

index = max(find(low_range <= codeword));

codeword = codeword - low_range(index);

%duo to numerical error, sometimes the encoded number

%will be slightly smaller than the current lower bound.

%If this happens, a correction is required.

if abs(codeword - pr(index)) < 0.01 * prmin,

index = index + 1;

codeword = 0;

end

symseq = [symseq symbol(index)];

codeword = codeword/pr(index);

if abs(codeword) < 0.01 * prmin,

i = symlen + 1; %break the for loop immediately

end

end

function arcode = arencode(symbol, pr, seqin)

%算术编码

%输出:码串

%输入:symbol:字符行向量

% pr:字符出现概率

% seqin:待编码字符串

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

sbidx = zeros(size(seqin));

for i = 1: length(seqin),

sbidx(i) = find(symbol == seqin(i));

end

low = 0; high = 1;

for i = 1: length(seqin),

range = high - low;

high = low + range * high_range(sbidx(i));

low = low + range * low_range(sbidx(i));

end

arcode = low;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。