)));
c(n-i,n)='1';
c( n-i,n+1:2*n-1)=c(n-i,1:n-1); c(n-i,2*n)='0'; for j=1:i-1
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:)==j+1)-1)+1:n*find(a(n-i+1,:)==j+1)); end end
fori=1:n
h(i,1:n)=c(1,n*(find(a(1,:)==i)-1)+1:find(a(1,:)==i)*n); ll(i)=length(find(abs(h(i,:))~=32)); end
Code_length=0; fori=1:n
Code_length=Code_length+p(1,i)*ll(i); End
Efficiency=H/(Code_length); fprintf('\\n 哈夫曼编码:\\n'); disp(h)
fprintf('\\n 平均码长:\\n'); disp(Code_length)
fprintf('\\n 哈夫曼编码效率:\\n'); disp(Efficiency) 14
实验五 算术编码(2学时)
一、实验目的
1.掌握算数编码原理;
2.学习算术编码基本流程 ,学会调试算术编码程序 ; 3.根据给出资料,自学适应 0阶算术编码 方法。 二、实验内容
1. 利用 MATLAB MATLABMATLABMATLABMATLAB编写程序实现算数码; 编写程序实现算数码;
2.对文件符号进行概率统计,生成编码表; 3.对文件进行压缩编码;
3.(选做)对文件进行解压缩,比较原始数据和后的之间是否有损 (选做)对文件进行解压缩,比较原始数据和后的之间是否有损 (选做)对文件进行解压缩,比较原始数据和后的之间是否有损 (选做)对文件进行解压缩,比较原始数据和后的之间是否有损 耗。 三实验仪器、设备
1.计算机-系统最低配置 256M 内存、 P4 CPUP4 CPU P4 CPUP4 CPU; 2.MATLAB MATLABMATLABMATLABMATLAB编程软件。 四、实验原理
算术编码的编码对象是一则消息或一个字符序列,其编码思路是将该消息或字符序列表示成0和1之间的一个间隔(Interval)上的一个浮点小数。在进行算术编码之前,需要对字符序列中每个字符的出现概率进行统计,根据各字符出现概率的大小,将每个字符映射到[0,1]区间上的某个子区间中。然后,再利用递归算法,将整个字符序列映射到[0,1]区间上的某个Interval中。在进行编码时,只需从该Interval中任选一个小数,将其转化为二进制数。
符号序列越长,编码表示它的Interval的间隔就越小,表示这一间隔所需的二进制位数就越多,编码输出的码字就越长。 五、实验步骤
项目文件建立步骤同实验二,下面列出对给定序的算术编码:
1.编码器在开始时将“当前间隔”[L ,H) 设置为 设置为 [0 ,1) ; 2.对每一事件,编码器按步骤( a)和( b)进行处理 ; (a)编码器将“当前间隔”分为子,每一个事件;
(b)一个子间隔的大小与下将出现事件概率成比例,编码器选择 子间 隔对应于下一个确切发生的事件相,并使它成为新“当前子间 隔对应于下一个确切发生的事件相,并使它成为新“当前子间 隔对应于下一个确切发生的事件相,并使它成为新“当前隔”。 隔”。
3.最后输出的“当前间隔”下边界就是该给定事件序列算术编码。 六、实验报告要求
1.按照本节内容后实验报告形式书写; 15
2.算术编码学习心得,特别是根据自适应模型 算术编码学习心得,特别是根据自适应模型 0阶编码,调整概率分布方法。 阶编码,调整概率分布方法。 根据自己实验情况,写出的做中遇到具体问题对本提建 根据自己实验情况,写出的做中遇到具体问题对本提建 根据自己实验情况,写出的做中遇到具体问题对本提建 议。 七、实验注意事项
1. 编码概论累加分布;
2. 编码区间上限和下迭代算法; 3. 自适应模型 0阶的编码原理。
八、思考题
算术编码的优缺点? 附录 1:实验报告样式: 实验报告
班级:姓名:学号:组别:同组人: 课程名称:实验室:实验时间:
(使用实验报告纸的,以上内容可按照实验报告纸格式填写) 实验五算术编码 一、实验目的:
二、实验内容与原理:
三、实验器材(设备、元器件、软件工具、平台): 四、实验步骤: 五、程序流程图:
六、实验数据及结果分析: 七、实验结论: 八、思考题:
九、编程、调试过程中遇到的问题及解决方法:
十、其他:实验总结、心得体会及对本实验方法、手段及过程的改进建议等。 附录二:算术编码程序
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%start%%%%%%%%%%%%%%%%%%%%%%%') disp('程序限定字符为:a b c d e'); str=input('请输入编码的字符串:'); [j,k]=size(str);
l=0; r=1; d=1;
p=[0.2 0.3 0.1 0.15 0.25]; pa=0.2; pb=0.3; 16
pc=0.1; pd=0.15; pe=0.25;
n=length(str); disp('a b c d e') disp(num2str(p)) fori=1:k ifi==1
switchstr(i) case 'a' m=1; a1=0; a2=pa; case 'b' m=2; a1=pa; a2=pa+pb; case 'c' m=3;
a1=pa+pb; a2=pa+pb+pc; case 'd' m=4;
a1=pa+pb+pc; a2=pa+pb+pc+pd; case 'e' m=5;
a1=pa+pb+pc+pd; a2=pa+pb+pc+pd+pe; end
l=a2-a1; end
if (i>=2)&(i<=k) switchstr(i) case 'a' aa=a1;
ab=a1+l*pa;
a1=aa;a2=ab; case 'b' aa=a1+l*pa;
ab=a1+l*(pa+pb); a1=aa; a2=ab; case 'c' 17
aa=a1+l*(pa+pb); ab=a1+l*(pa+pb+pc); a1=aa; a2=ab; case 'd'
aa=a1+l*(pa+pb+pc); ab=a1+l*(pa+pb+pc+pd); a1=aa; a2=ab; case 'e'
aa=a1+l*(pa+pb+pc+pd);
ab=a1+l*(pa+pb+pc+pc+pd+pe); a1=aa; a2=ab; end
l=a2-a1; end
strl=strcat('input',int2str(i),' 编码区间起始值为:'); disp(strl); disp(a1)
strl=strcat('input',int2str(i),' 编码区间的终止值为:'); disp(strl); disp(a2)
strl=strcat('input',int2str(i),' 本程序选择区间中点作为编码是:'); disp(strl);
disp((a1+a2)/2) end
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%code_finish%%%%%%%%%%%%%%%%%') disp('是否要译码,请选择') disp('1、译码') disp('2、不译码?')
disp('说明:输入相应的数字进行选择')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%choice%%%%%%%%%%%%%%%%%%%%%%') YN=input('您选择的是:'); if YN==1
bm=(a1+a2)/2;