一、实验内容
试用MATLAB编制算术编码算法实现程序。
二、实验过程
2.1 算术编码实现原理
算术编码的算法思想如下:
(1)对一组信源符号按照符号的概率从大到小排序,将[0,1)设为当前分析区间。按信源符号的概率序列在当前分析区间划分比例间隔。
(2)检索“输入消息序列”,锁定当前消息符号(初次检索的话就是第一个消息符号)。找到当前符号在当前分析区间的比例间隔,将此间隔作为新的当前分析区间。并把当前分析区间的起点(即左端点)指示的数“补加”到编码输出数里。当前消息符号指针后移。
(3)仍然按照信源符号的概率序列在当前分析区间划分比例间隔。然后重复第二步。直到“输入消息序列”检索完毕为止。
(4)最后的编码输出数就是编码好的数据。
解码是编码的逆过程,知道了编码过程后,解码过程的操作过程也就清晰了。解码时,通过判断哪一个符号能拥有我们已编码的消息落在的空间来找出消息中的上界。在编码的逆过程中,逐渐循环操作下去,便得到消息的准确译码。
2.2 算术编译码流程图
2.3 算术编译码源程序
clear all;
clc;
in='00000011111010101'; %输入码字
pr=[0.5 0.5]; %各字符出现的概率
temp=[0.0 0.5 1.0];
orignal=temp;
n=length(in);
%编码
for i=1:n
width=temp(3)-temp(1);
w=temp(1);
switch in(i)
case '0'
m=1;
case '1'
m=2;
end
temp(1)=w+orignal(m)*width;
temp(3)=w+orignal(m+1)*width;
left=temp(1);
right=temp(3);
fprintf('left=%.6f',left);
fprintf(' ');
fprintf('right=%.6f\n',right);
end
encode=(temp(1)+temp(3))/2
%解码
decode=['0'];
for i=1:n
fprintf('tmp=%.6f\n',encode);
if(encode>=orignal(1)& encode<orignal(2))
decode(i)='0';
t=1;
elseif(encode>=orignal(2)& encode<orignal(3))
decode(i)='1';
t=2;
end
encode=(encode-orignal(t));
encode=encode/pr(t);
end
decode
三、实验结果
3.1 编码过程及结果
3.1 译码过程及结果
从结果图中可以看出:“00000011111010101”在0、1出现概率各为0.5的情况下,编码后为0.0153,译码后的结果与前面相符,可知此算术编译码正确。
四、总结与展望
本次实验我学会运用MATLAB实现信息论与编码中的算术编译码,通过前期课程的学习,掌握了算术编码的原理及整体过程。实验实现的过程又让我再次回顾了理论知识,也让我更加的理解算术编码的核心思想,就是不断地确定区间、不断地缩小上下限的过程。后续在科研中,若有用到这方面的知识,我会立即回忆起在这门课中学到的知识,回顾实验中的探索过程,并继续深入研究下去。