课程设计费诺编码和自适应算术编码_第1页
课程设计费诺编码和自适应算术编码_第2页
课程设计费诺编码和自适应算术编码_第3页
课程设计费诺编码和自适应算术编码_第4页
课程设计费诺编码和自适应算术编码_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、信息论课程设计 课题名称:四元费诺编码 自适应算术编码 专业班级: 任课教师: 姓 名: 学 号: 完成时间:2012-12四元费诺编码1. 问题描述费诺编码方法属于概率匹配编码。这种编码方法不是最佳的编码方法,但有时也可得到最佳码的性能。设计一个程序对输入的一个字符串实现费诺编码。2. 基本要求书本上大多讲解的二元的费诺编码,但是多元的费诺编码也能实现。请设计程序用以对输入字符串实现4元费诺编码,并且设计译码函数使满足根据编码的结果,输入任意的4进制数字串能够正确唯一的译码,最后计算编码效率。3. 二元费诺编码基本原理首先,将信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,

2、使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号。依次下去,直至每一个小组只剩下一个信源符号为止。这样,信源符号所对应的码符号序列则为编得的码字。译码原理,按照编码的二叉树从树根开始,按译码序列进行逐个的向其叶子结点走,直到找到相应的信源符号为止。之后再把指示标记回调到树根,按照同样的方式进行下一序列的译码到序列结束。如果整个译码序列能够完整的译出则返回成功,否则则返回译码失败。 编码方法:1.将信源消息符号按其出现的概率大小依次排列。2.将依次排列的信源符号按概率值分为两大组,使

3、两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。3.将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。4.如此重复,直至每个组只剩下一个信源符号为止。5.信源符号所对应的码字即为费诺码。 4.费诺编码特点费诺编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率达,编码效率高,但它属于概率匹配编码它不是最佳的编码方法。 5.二元费诺编码思想 费诺编码最困难的是根据信源概率对信源进行分组,本次借鉴了信息编码与加密实践(夏娜 蒋建国 丁志忠 编著)中的二元费诺编码的思想,设定一个中间判断值old为每次分组总概率的一

4、半大小,sum为每次相加的概率和,每次相加后与该段的中间值差得绝对值与old比较,小于其值则分为一组,大于其值则为另一组。递归调用这段程序,直到每个分组只含一个信源结束。6.四元费诺编码流程图开始输入字符窜统计各个字符出现的频率按字符出现的概率大小对符号进行排列调用编码对函数进行编码N字符都已编码完?Y输出编码结果输入要编码的数字串调用译码函数译码输出编码结果结束7.四元费诺编码思想与函数模块划分四元费诺编码主要在二元费诺编码的基础上修改编码函数,即二元费诺编码每次递归分两组,四元费诺编码每次就要分为四组。具体修改方法如下:参数说明递归结束条条件递归函数递归分组8.程序测试与结果9. 总结费诺

5、编码:由实验结果可得,在一般情况下,费诺编码不一定能使短码得到充分利用,尤其当信源符号较多,并有一些符号概率分布很接近时,分两大组的组合就会很多,可能某种分大组的结果,会出现后面小组的概率和相差较远,因而使平均码长增加。所以,费诺码通常不是最佳码。程序:由于时间比较仓促,无法对程序进行美化和进一步的编写窗口化程序,界面比较传统和简陋。自适应算术编码1. 问题描述是图像压缩的主要算法之一。 是一种无损数据压缩方法,也是一种熵编码的方法。和其它熵编码方法不同的地方在于,其他的熵编码方法通常是把输入的消息分割为符号,然后对每个符号进行编码,而算术编码是直接把整个输入的消息编码为一个数,一个满足(0.

6、0n<1.0)的小数n。2. 基本要求请设计程序用以对输入字符串实现自适应的算术编码,其中要有相应的概率调整的过程,并且设计译码函数使满足根据编码的结果,能够正确的译码。3. 算术编码原理 在给定符号集和符号概率的情况下,算术编码可以给出接近最优的编码结果。使用算术编码的压缩算法通常先要对输入符号的概率进行估计,然后再编码。这个估计越准,编码结果就越接近最优的结果。例: 对一个简单的信号源进行观察,得到的统计模型如下:60% 的机会出现符号 中性20% 的机会出现符号 阳性10% 的机会出现符号 阴性10% 的机会出现符号 数据结束符.中性对应的区间是 0, 0.6)阳性对应的区间是 0

7、.6, 0.8)阴性对应的区间是 0.8, 0.9)数据结束符对应的区间是 0.9, 1)当所有的符号都编码完毕,最终得到的结果区间即唯一的确定了已编码的符号序列。任何人使用该区间和使用的模型参数即可以解码重建得到该符号序列。实际上我们并不需要传输最后的结果区间,实际上,我们只需要传输该区间中的一个小数即可。在实用中,只要传输足够的该小数足够的位数(不论几进制),以保证以这些位数开头的所有小数都位于结果区间就可以了。 4. 自适应算术编码自适应算术编码即上述的模型还可以进行自适应的变化,即在某种上下文下出现的概率分布的估计随着每次这种上下文出现时的符号而自适应更新,从而更加符合实际的概率分布。

8、不管编码器使用怎样的模型,解码器也必须使用同样的模型。编码过程的每一步,除了最后一步,都是相同的。编码器通常需要考虑下面三种数据:1. 下一个要编码的符。2. 当前的区间(在编第一个符号之前,这个区间是0,1), 但是之后每次编码区间都会变化3. 编码其将当前的区间分成若干子区间,每个子区间的长度与当前上下文下可能出现的对应符号的概率成正比。当前要编码的符号对应的子区间成为在下一步编码中的初始区间。5.自适应算术编码特点1)不必预先定义概率模型,自适应模式具有独特的优点;2)信源符号概率接近时,建议使用算术编码,这种情况下其效率高于Huffman编码;3)算术编码绕过了用一个特定的代码替代一个

9、输入符号的想法,用一个浮点输出数值代替一个流的输入符号,较长的复杂的消息输出的数值中就需要更多的位数。4)算术编码实现方法复杂一些,但JPEG成员对多幅图像的测试结果表明,算术编码比Huffman编码提高了5%左右的效率,因此在PEG扩展系统中用算术编码取代Huffman编码。6.自适应算法流程图开始初始化概率空间和准备数据输入字符串字符找到相应的概率空间调整字符概率序列调整指针指向下一字符N字符都已编码?Y区间内任选一树转二进制并去相应的有效位输出编码结果结束7. 自适应算术编码编程思想算法主要基于算术编码,其中编码译码都要增加一个概率调整的式子。编程思想如下:(1) 对一组信源符号按照符号

10、的概率排序,将0,1)设为当前分析区间。按信源符号的概率序列在当前分析区间划分比例间隔。(2) 检索“输入消息序列”,锁定当前消息符号(初次检索的话就是第一个消息符号)。找到当前符号在当前分析区间的比例间隔,将此间隔作为新的当前分析区间。并把当前分析区间的起点(即左端点)指示的数“补加”到编码输出数里。当前消息符号指针后移。(3) 根据输如的字符,相应的调整信源的概率序列。(4) 按照新的信源符号的概率序列在当前分析区间划分比例间隔。然后重复第二步。直到“输入消息序列”检索完毕为止。 (5) 最后的编码输出数就是编码好的数据。修改信源概率序列方法:Cnti 为相应信源符号的出现次数,初始化都为

11、1;Sum 为总共的信源符号Proci 为相应信源符号的概率areaBegin 为区间起始概率areaEnd 为区间结束概率8. 程序测试与结果9. 总结自适应算术编码:不必预先定义概率模型,自适应模式具有独特的优点,没有对个输入符号的信息量为整数的限制,随着编码结果的小数随位数的增加,它的精度也随之增高,从信息的角度来说,它所含的信息量也随之增加。信源符号概率接近时编码效率比较好,其效率高于哈夫曼编码。程序:自己在指导书的程序基础上修改了编码译码函数,总体来说还是比较轻松简单的。但是因为时间比较紧,没有足够的时间对程序进行可视化窗口编程和美化,所以程序基于黑白对话框比较简陋;输入字符要手动输

12、入,过程比较繁琐,容易出错,可以在以后增加文件操作和成熟美化等工作,使程序简单实用。附录一:费诺编码源程序/ Fano编括?码?.cpp : 定¨义?控?制?台?应畖用?程ì序ò的?入?口ú点?。/ Fano编码.cpp : 定义控制台应用程序的入口点。/#include "stdafx.h"#include<stdio.h>#include<math.h>#include<string.h>#include<algorithm>using namespace std;typedef s

13、tructchar data;float weight;char code1000;fnode;fnode f50;int num;int forwd,mid,last;int jsq(char*s,int cnt,char str)char *p;int i,j,k=0;int temp257;for(i=0;i<257;i+)tempi=0;for(p=s;*p!='0'p+)temp*p+;for(i=0,j=0;i<=256;i+)if(tempi!=0)j+;strj=i;cntj=tempi;return j;/shuruvoid Input(char

14、receive,int cnt,char str)unsigned int len=0;printf("输入要编码的字符串:");gets(receive);len=strlen(receive);num=jsq(receive,cnt,str);for(int i=1;i<=num;i+)fi-1.data=stri;fi-1.weight=float(cnti)/len;/编码void code(fnode f,double total,int begin,int end)/double sum=0.0,tsum=0.0,temp1old=total/2;doub

15、le sum=0.0,fsum=0.0,msum=0.0,lsum=0.0,temp1=0.0,temp2=0.0,temp3=0.0,old1=total/4,old2=total/4,old3=total/4;/int forwd,mid,last;if(end-begin=0)return;elseif (end-begin=1)strcat(fbegin.code,"0");strcat(fbegin+1.code,"1");return;elseif (end-begin=2)strcat(fbegin.code,"0");

16、strcat(fbegin+1.code,"1");strcat(fbegin+2.code,"2");return;elseif(end-begin=3)strcat(fbegin.code,"0");strcat(fbegin+1.code,"1");strcat(fbegin+2.code,"2");strcat(fbegin+3.code,"3");return;elsefor(int i=begin;i<=end;i+)sum+=fi.weight;temp1

17、=fabs(sum-total/4);if(temp1<=old1)forwd=i;fsum=sum;strcat(fi.code,"0");old1=temp1;else /temp=fabs(sum)/msum=sum-fsum;temp2=fabs(sum-fsum-total/4);if (temp2<=old2)mid=i;msum=sum-fsum;strcat(fi.code,"1");old2=temp2;elsetemp3=fabs(sum-fsum-msum-total/4);if(temp3<=old3)last=

18、i;lsum=sum-fsum-msum;strcat(fi.code,"2");old3=temp3;else strcat(fi.code,"3");/old3=temp3;code(f,fsum,begin,forwd);code(f,msum,forwd+1,mid);code(f,lsum,mid+1,last);code(f,sum-fsum-msum-lsum,last+1,end);/译码void decode(char s)unsigned int i=0;int j=0;char s2100;s20='0'while(

19、i< strlen(s)char temp2;temp0=si;temp1='0'strcat(s2,temp);for(j=0;j<num;j+)/分别与各个编码比较if(strcmp(s2,fj.code)=0)/判断是否匹配printf("%c",fj.data);s20='0'break;i+; /输出结果void print()int i;for(i=0;i<num;i+)/cout<<"符号"<<fi.codeprintf("符号%c概率%f,编码为%sn&q

20、uot;,fi.data,fi.weight,fi.code);/计算编码效率double code_ratio(fnode f50,char receive,int cnt ,char str)double up=0.0,down=0.0,temp=0.0;int i=1,j,len=strlen(receive);for (i;i<=num;i+)temp=cnti/double(len);up-=temp*(log10(temp)/log10(4.0);for (j=0;j<50;j+)if(fj.data=stri)down+=temp*strlen(fj.code);re

21、turn(up/down)*100;/sort 函数的参数bool Myless(const fnode l,const fnode r)return l.weight>r.weight;void main()/int forwd,mid,last;char got1000,s1000='0',receive1000,str1000;/got接收输入的待解码的字符串,s接受解码的结果,receive接受输入的字符串int cnt1000; /str,cnt分别统计字符中的字符和其出现的概率Input(receive,cnt,str);/调用输入函数sort(f,f+num

22、,Myless);/调用排序函数code(f,1.0,0,num-1);/调用编码函数print();/调用输出编码函数printf("上述字符串的费诺编码为");int i=0,j=0;while (receivei!='0')for(j=0;j<num;j+)if (fj.data=receivei)printf("%s",fj.code);break;i+;printf("n编码效率:%f%n",code_ratio(f,receive,cnt,str);printf("请输入四进制码开始的解码:

23、n");gets(got);strcat(s,got);printf("译码结果为:");decode(s);/调用译码函数printf("n");/system("pause");附录二:自适应算术编码/ 自适应算术编码.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include<iostream>#include<string>#include<cmath>using namespace std;double proc = 0.1

24、0, 0.10, 0.10, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1;int cnt=1,1,1,1,1,1,1,1,1,1;double num=10.0;double result, areaBegin, areaEnd;int cord1000,cordLength;char str1000;int strLength = 0;bool readdat()int i;cout<<"*自适应模式*"<<endl;cout<<"请输入字符(09):"<<endl;cin >

25、;> str;while(strstrLength != '0')strLength+;for(i = 0; i < strLength; i+) /输入是否合法if(stri > '9' | stri < '0') return 1;return 0;void encode()cout<<" 编 码 : "int i,l;double w = 0.0, len;areaBegin = 0.0, areaEnd = 1.0;for(i = 0; i < strLength; i+)in

26、t n = stri - '0', k;cntn+;num+;w = 0.0;for(k = 0; k < n; k+)w += prock; /计算所在区间len = areaEnd - areaBegin; /计算新的区间areaEnd = areaBegin + len * (w + prock);areaBegin += len * w;for(l=0;l<=9;l+)/调整信源概率序列procl=cntl/num;result = areaBegin * 0.01 + areaEnd * 0.99; /选择适当的点cordLength = (int(-log10(areaEnd - areaBegin) / log10(2.0) + 1;cout<<"编码位数: "<<cordLength<<endl;cout<<"编码结果:"double temp1 = result;int temp2,j;for(j = 0; j < cordLength; j+) /十进制转换成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论