1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > c语言编写算术编码 编程实现算术编码算法.doc

c语言编写算术编码 编程实现算术编码算法.doc

时间:2023-10-14 16:36:07

相关推荐

c语言编写算术编码 编程实现算术编码算法.doc

编程实现算术编码算法

中国地质大学计算机学院信息安全专业

信息论实验报告

实验三 算术编码

实验内容

编程实现算术编码算法

二、实验环境

计算机

Windows 2000 或以上

DEVC++

三、实验目的

进一步熟悉算术编码算法;

掌握C语言编程(尤其是数值的进制转换,数值与字符串之间的转换等)

四、实验要求

提前预习实验,认真阅读实验原理。

认真高效的完成实验,实验过程中服从实验室管理人员以及实验指导老师的管理。

认真填写实验报告。

五、实验原理

算术编码是把一个信源表示为实轴上0和1之间的一个区间,信源集合中的每一个元素都用来缩短这个区间。

算法流程

六、参考书

《信息论——基础理论及应用》傅祖芸,电子工业出版社

七、源代码

#include

#include

#include

const double proc[]={0.10,0.10,0.10,0.1,0.1,0.1,0.1,0.1,0.15,0.05};

double result,areaBegin,areaEnd;

int cord[1000],cordLength;

char str[1000];

int strLength=0;

bool readdat()

{

printf("***********固定模式***********\n");

printf("请输入字符串(0-9):\n");

scanf("%s",str);

while(str[strLength]!='\0')

strLength++;

for(int i=0;i

if(str[i]>'9'||str[i]

return 1;

return 0;

}

void encord()

{

printf("编码:");

double w=0.0,len;

areaBegin=0.0,areaEnd=1.0;

for(int i=0;i

{

int n=str[i]-'0',k;

w=0.0;

for(k=0;k

w+=proc[k];

len=areaEnd-areaBegin;

areaEnd=areaBegin+len*(w+proc[k]);

areaBegin+=len*w;

}

result=areaBegin*0.01+areaEnd*0.99;//选择适合的点

cordLength=(int(-log(areaEnd-areaBegin)/log(2)))+1;

printf("编码位数:%d\n",cordLength);

printf("编码结果:");

double temp1=result;

int temp2;

for(int j=0;j

{

temp1*=2;

temp2=int(temp1);

temp1-=temp2;

cord[j]=temp2;

printf("%d",temp2);

}

printf("\n");

}

void decord()

{

printf("译码:\n");

result=0.0;

double wei=0.5;

for(int i=0;i

result+=wei*cord[i];

printf("译码选取的数:%f\n",result);

areaBegin=0.0,areaEnd=1.0;

wei=0.0;

int temp;

double len;

for(int j=0;j

{

temp=0;wei=0.0;len=areaEnd-areaBegin;

while(result-areaBegin>wei*len)

wei+=proc[temp++];

temp--;

areaEnd=areaBegin+wei*len;//计算新的空间

areaBegin=areaBegin+(wei-proc[temp]*len);

printf("%d",temp);

}

printf("\n");

int main()

{

if(readdat())

printf("字符输入错误!!!\n");

else

{

encord();

decord();

}

return 0;

}

输入信源符号个数,信源概率分布,还有需要编码的符号序列,

根据

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。