教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 行业资料 >

算术编解码实验报告

来源:网络收集 时间:2026-08-12
导读: 一、实验目的 1.进一步学习C++语言概念和熟悉VC 编程环境。 2.学习算术编码基本流程, 学会调试算术编码程序。 3. 根据给出资料,自学自适应0 阶算术编、解码方法。 二、实验要求: (1)实验前编写源程序、准备测试数据。 (2)在Turbo C下完成程序的编辑

一、实验目的

1.进一步学习C++语言概念和熟悉VC 编程环境。

2.学习算术编码基本流程, 学会调试算术编码程序。

3. 根据给出资料,自学自适应0 阶算术编、解码方法。

二、实验要求:

(1)实验前编写源程序、准备测试数据。

(2)在Turbo C下完成程序的编辑、编译、运行,获得程序结果。如果结果有误,应找出原因,并设法更正之。

三、实验内容

编程实现任给n个概率和为1的随机分布字符,对任意排列的字符序列进行算术编码,计算平均码长。得到编码结果并进行解码

#include<iostream.h>

#include"math.h" //定义所需要用到的变量及数组

char S[100], A[10];

float P[10],f[10],gFs;

//编码程序

void bianma(int a,int h)

{ int i,j;

float fr;

float ps=1;

float Fs=0;

float Sp[100],b[100],F[100]; //以待编码的个数和字符个数为循环周期,将待编码的字符所对应的概率存入到Fs中

for(i=0;i<h;i++)

{ for(j=0;j<a;j++)

{ if(S[i]==A[j])

{ Sp[i]=P[j];

fr=f[j];//将划分好的[0,1)区间的对应点赋值给fr

}

}

Fs=Fs+ps*fr;//从选择的子区间中继续进行下一轮的分割。不断的进行这个过程, 直到所有符号编码完毕。

ps*=Sp[i]; //求Ps

}

cout<<"Fs="<<Fs<<endl;//显示最终的算术编码

gFs=Fs;

float l=log(1/ps)/log(2);//计算算术编码的码字长度l

if(l>(int)l)l=(int)l+1;

else l=int(l); //将Fs转换成二进制的形式

int d[20];

int m=0;

while(l>m)

{ Fs=2*Fs;

if(Fs>1)

{ Fs=Fs-1;

d[m]=1;

}

else if(Fs<1)d[m]=0;

else {d[m]=1;break;

}

m++;

}

int z=m;//解决有关算术编码的进位问题,给二进制数加1

if(m>=l)

{ while(1)

{ d[m-1]=(d[m-1]+1)%2;//最后位加1

if(d[m-1]==1)break;

else m--;

}

}

cout<<"s=";

for(int e=0;e<z;e++)

cout<<d[e];

cout<<endl;

}

//解码程序

void jiema(int a,int h)

{ int i,j;

float Ft,Pt;

float Fs=0,Ps=1;

for(i=0;i<h;i++)//以编码个数和符号个数为循环周期,对其进行解码

{ for(int j=a-1;j>-1;j--)

{ Ft=Fs;

Pt=Ps;

Ft+=Pt*f[j];//对进行逆编码

Pt*=P[j];

if(gFs>=Ft)//对其进行判断,并且将值存入到数组A中

{ Fs=Ft;

Ps=Pt;

cout<<A[j];

break;

}

}

}

cout<<endl;

}

void main()

{ cout<<"输入所要编码的符号的个数,并按回车跳转:"<<endl;

int a,i,h=0;

cin>>a;

cout<<"请输入符号及其相对应的概率值,并按回车跳转:"<<endl;

for(i=0;i<a;i++)

{ char x;

float y;

cin>>x;

A[i]=x;//将字符依次存入数组A中

cin>>y;

P[i]=y;//将字符所对应的概率依次存入到数组P中

}

for(i=1;i<a;i++)

{ f[0]=0;

f[i]=f[i-1]+P[i-1];//将要编码的数据映射到一个位于[0,1)的实数区间中

}

cout<<"请输入所要编码的符号序列,并以*结尾:"<<endl;

while(1)//这个while语句的作用是将要编码的字符存入到数组S中

{ char ss;

cin>>ss;

if(ss=='*')break;//在以“*”为结尾的时候结束存储

S[h++]=ss;

}

cout<<"输入的字符经过算术编码之后为:"<<endl;

bianma(a,h);

cout<<"由上述所对应的解码为:"<<endl;

jiema(a,h);

}

四、实验数据记录及分析

实验取a、b、c、d四个字符,概率分别为0.4、0.3、0.2、0.1;对字符序列abcdadb进行算术编码。

得到编码结果为:0100010000111010

平均码长为0.266502

五、实验心得体会

通过本次试验,我进一步学习了C++语言概念和熟悉VC 编程环境。学会了算术编码基本流程, 基本能够调试算术编码程序。对信息论相关知识有了进一步的认识。

…… 此处隐藏:177字,全部文档内容请下载后查看。喜欢就下载吧 ……
算术编解码实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/2274416.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)