编程实现算术编码算法
中国地质大学计算机学院信息安全专业
信息论实验报告
实验三 算术编码
实验内容
编程实现算术编码算法
二、实验环境
计算机
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;
}
输入信源符号个数,信源概率分布,还有需要编码的符号序列,
根据