博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实验十 算术编码
阅读量:3965 次
发布时间:2019-05-24

本文共 1281 字,大约阅读时间需要 4 分钟。

一、实验目的

熟悉算术编码的编、解码过程。

二、实验原理

输入序列的二进制表示加上适当的截短。

三、实验内容

设离散无记忆信源的概率空间为

在这里插入图片描述

信源输出符号序列为在这里插入图片描述

,用程序实现算术编码、解码过程。

四、实验算法步骤

1、计算累计概率Pr[i],另开辟2个存储空间C(存储码字)、A(存储区间长度)

2、对所有信源符号执行以下迭代:

a)C=A*Pr[i],i为当前符号在Pr[]数组所对应的下标;

b)A=A*p[i],i为当前符号在p[]数组所对应的下标;

c)求码字位数cnum=ceil(-lb(A))

d)将C转换为二进制小数,取小数后cnum位,作为码字输出。

3、解码

a)将收到的二进制码字转为十进制,根据累计概率,判断其落在哪个区间,判断码字。

b)执行c=c-Pr[i],i为当前符号在Pr[]数组所对应的下标;

c)c=c/p[i], i为当前符号在p[]数组所对应的下标

d)解码未完成,回到a)。

e)输出解码所得符号序列。

#include
#include
#include
char inStr[100],chSet[20];//输入的字符串和字符集double p[20];//每个字符的概率double Pr[20];//概率区间double info;//信息量大小int strLen;//输入字符串长度int chNum;//字符集中字符个数int biLen;//码字的位数int binary[1000];void compress() {
int i,j; double C=0,A=1; double result; for(i=0; i
=1) {
result-=1; binary[i]=1; } else if(result<1) {
binary[i]=0; } } //倒着输出// if(i>=biLen){
// for(j=i;j>=1;--j){
// binary[j-1]=(binary[j-1]+1)%2;// if(binary[j-1]==1)// break;// }// } for(j=0; j
0; j--) {
newA=A; newC=C; newC += newA*Pr[j-1]; newA *=p[j-1]; if (deResult>=newC) {
C = newC; A = newA; printf("%c ",chSet[j-1]); break; } } }}int main () {
int i,j; printf("请输入字符集的个数:\n"); scanf("%d",&chNum); getchar(); printf("请输入每个字符以及它对应的概率:\n"); for(i=0; i

转载地址:http://ymfki.baihongyu.com/

你可能感兴趣的文章
2010年11月19日
查看>>
2010年11月19日
查看>>
TC35i&nbsp;单片机
查看>>
TC35i&nbsp;单片机
查看>>
AT&nbsp;命令详解
查看>>
AT&nbsp;命令详解
查看>>
AT指令发送PDU中文短信——使用串口…
查看>>
AT指令发送PDU中文短信——使用串口…
查看>>
s3c2440&nbsp;uart
查看>>
指针的使用注意事项(个人体…
查看>>
指针的使用注意事项(个人体…
查看>>
~c++中的指针使用注意事项
查看>>
~c++中的指针使用注意事项
查看>>
函数返回值、引用和指针的区别思考
查看>>
函数返回值、引用和指针的区别思考
查看>>
AT指令中文手册
查看>>
AT指令中文手册
查看>>
module_param&amp;&amp;MODULE_PARM_DESC
查看>>
struct&nbsp;inode&nbsp;和&nbsp;struct&nbsp;file
查看>>
mknod
查看>>