实验五 算术编码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
班级学号姓名实验组别
实验日期室温报告日期成绩
报告内容:(目的和要求、原理、步骤、数据、计算、小结等)
实验名称:实验五算术编码
一、实验目的
1.掌握算数编码原理;
2.学习算术编码基本流程,学会调试算术编码程序;
3.根据给出资料,自学自适应0阶算术编码方法。
二、实验内容
1.利用MATLAB编写程序实现算数编码;
2.对文件符号进行概率统计,生成编码表;
3.对文件进行压缩编码;
3.(选做)对文件进行解压缩,比较原始数据和解压后的数据之间是否有损耗。
三实验仪器、设备
1.计算机-系统最低配置256M内存、P4CPU;
2.MATLAB编程软件。
四、实验原理
算术编码的编码对象是一则消息或一个字符序列,其编码思路是将该消息或字符序列表示成0和1之间的一个间隔(Interval)上的一个浮点小数。在进行算术编码之前,需要对字符序列中每个字符的出现概率进行统计,根据各字符出现概率的大小,将每个字符映射到
[0,1]区间上的某个子区间中。然后,再利用递归算
法,将整个字符序列映射到[0,1]区间上的某个Interval中。在进行编码时,只需从该Interval中任选一个小数,将其转化为二进制数。符号序列越长,编码表示它的Interval的间隔就越小,表示这一间隔所需的二进制位数就越多,编码输出的码字就越长。
五、实验步骤
项目文件建立步骤同实验二,下面列出对给定序列的算术编码步骤:
1.编码器在开始时将“当前间隔”[L,H)设置为[0,1);
2.对每一事件,编码器按步骤(a)和(b)进行处理;
(a)编码器将“当前间隔”分为子间隔,每一个事件一个;
(b)一个子间隔的大小与下一个将出现的事件的概率成比例,编码器选择子间隔对应于下一个确切发生的事件相对应,并使它成为新的“当前间隔”。
3.最后输出的“当前间隔”的下边界就是该给定事件序列的算术编码。
六、实验注意事项
1.编码概论累加分布;
2.编码区间上限和下限迭代算法;
3.自适应模型0阶的编码原理。
七、实验结果
算术编码程序
disp('%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%start%%%%%%%%%%%%%%%%%%%% %%%')
disp('程序限定字符为:a b c d e'); str=input('请输入编码的字符串:');
[j,k]=size(str);
l=0;
r=1;
d=1;
p=[0.20.30.10.150.25];
bm=(a1+a2)/2;
SuansuJiema(bm,k)
end
if YN==2
disp('你选择了不译码。')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%% %%end%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%')
end
解码函数:
function SuansuJiema(bm,num) format long
pa=0.2;pb=0.3;pc=0.1;pd=0.15;pe= 0.25;
i=1;
ym={};
ym{1}(1)=YM(bm);
bm0=bm;
while i>=1&i switch1 case ym{1}(i)=='a' bm0=(bm0-0)/pa; case ym{1}(i)=='b' bm0=(bm0-pa)/pb; case ym{1}(i)=='c' bm0=(bm0-pa-pb)/pc; case ym{1}(i)=='d' bm0=(bm0-pa-pb-pc)/pd; case ym{1}(i)=='e' bm0=(bm0-pa-pb-pc-pd)/pe;end i=i+1; ym{1}(i)=YM(bm0); end disp('%%%%%%%%%%%%%%%%%%%%%%%%%% %jiema_start%%%%%%%%%%%%%%%%%%%% %%%') disp(['译码结果是',ym{1}]) disp('%%%%%%%%%%%%%%%%%%%%%%%%%% %jiema_end%%%%%%%%%%%%%%%%%%%%%% %%%') 函数二: function ym=YM(A) pa=0.2;pb=0.3;pc=0.1;pd=0.15;pe= 0.25; switch1 case0<=A&A ym='a'; case pa<=A&A ym='b'; case pa+pb<=A&A ym='c'; case pa+pb+pc<=A&A case pa+pb+pc+pd<=A&A case A>=1|A<0 disp('该码子为错误编码') end 八、思考题 算术编码的优缺点? 算术编码得到的压缩效果可以最大地减小信息的冗余度且用最少量的符号精确表达原始信息内容;算术编码虽然可以得到最好的压缩 效果但却要消耗也许几十倍的计算时间。