- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算术编码用c语言实现
算术编码用c语言实现?(2010-07-07 23:43:59)转载标签:?杂谈描述:在source1.dat文件中有100个数据,其中,0的概率为1/8,1的概率为7/8.用算术编码进行压缩。程序如下://============================================================================// Name????????: suanshcoding.cpp// Author??????: 朗月清风// Version?????:1.0// Copyright???: All rights Reserved by 2010// Description : 从source1.dat文件中读取信息,即100个0、1码,完成算术编码,并给//???????????????出了译码及验证。// Department??:upc//============================================================================#includestdio.h#includemath.h#define max 100void main(){?FILE *fp;?int i=0;?int n;?long double high;//上限?long double low;//下限?long double d;//间距?long double buf[max]; //大数组,暂存读取的数据?long double decode[max]; //存解码后的结果?int code[55];??//编码结果?long double temp;?long double hx;//总信息量?long double tp;//从区间取数?long double x=0.0; //存恢复的小数?long double line;//解码时判断准线//?char ch;??if((fp=fopen(f:\\source1.dat,r))==NULL)?{??printf(open erro!\n);??//exit(0);?}?else?{?while (!feof(fp))?{??fscanf(fp,%lf,temp);??buf[i]=temp;????//?printf(%d--%lf\n,i,buf[i]);??i++;?}?}?//for(i=0;imax;i++)?//?printf(%1f\n,buf[i]);?double p0=1.0/8;//0的概率?double p1=7.0/8; //1的概率?low=0.0;?high=1.0;?d=1.0;?for(i=0;imax;i++)?{??if(buf[i]==1.0)??{???low+=d*p0;???d=high-low;??}??else if(buf[i]==0.0)??{???high=low+d*p0;???d=high-low;??}?}?hx=max*(1.0/8*log(8)/log(2)+7.0/8*log(8.0/7)/log(2));?// 计算总共传递的信息?printf(总共传递的信息量%f\n,hx);?n=(int)hx+1;?//需编码位数?printf(至少需要%d位编码\n,n);?printf(下限是:%.17f下限是:%.17f\n,low,high);tp=(low+high)/2.0;//取区间的中点编码printf(\n选取的小数为:%.17f\n,tp);?for(int j=0;jn;j++)?{??tp=tp*2;??if(tp1.0)??{???tp=tp-1;???code[j]=1;??}??else???code[j]=0;?}?printf(编码为:\n);//输出编码?for(i=0;in;i++)?{??printf(%d,code[i]);??x+=code[i]*pow(2,(-i-1));?}??printf(\n恢复的小数为:%.17f,x);??if((xlow)(xhigh))//判断恢复的是否成功???printf(\n恢复的小数仍在允许区间,成功!\n);?low=0.0;?high=1.0;?d=1.0;?line=1.0/8;?for(i=0;imax;i++)?{??if(xline)??{???decode[i]=1.0;???low+=d*p0;??}??else??{???decode[i]=0.0;???high=low+d*p0;??//?d=high-low;??}??d=high-low;??line=low+d*p0;?}?printf(原始输入数据:\n);?fo
文档评论(0)