复习一下算术编码

41 篇文章 0 订阅

原理

基本原理是将被编码的数据序列表示成0到1之间的一个间隔(也就是一个小数范围),该间隔的位置与输入数据的概率分布有关,信息越长,编码表示的间隔就越小,因而表示这一间隔所需要的二进制位数就越多。

算术编码的步骤

算术编码是从整个符号序列出发,采用递推式连续编码的方法,解码时,根据该区间判断信源哥哥符号出现的顺序和类型。

下面以一个多符号的算术编码为例来分析算术编码的步骤。

概率表

符号

概率

概率区间

A

0.1

0,0.1

B

0.3

0.1,0.4

C

0.2

0.4,0.6

D

0.15

0.6,0.75

E

0.25

0.75,1

假设要编码ABBCD

编码过程

读入A,区间为[0,0.1]

读入B,区间为S = (L' - S') * R1 + S'; L = (L' - S') * R2 + S' = [S, L] = [(0.1 - 0) * 0.1 + 0, (0.1 - 0) * 0.4 + 0] = [0.01, 0.04]

读入B,区间为[(0.04 - 0.01) * 0.1 + 0.01, (0.04 - 0.01) * 0.4 + 0.01] = [0.013, 0.022]

读入C,区间为[(0.022 - 0.013) * 0.4 + 0.013, (0.022 - 0.013) * 0.6 + 0.013] = [0.0166, 0.0184]

读入D,区间为[(0.0184 - 0.0166) * 0.6 + 0.0166, (0.0184 - 0.0166) * 0.75 + 0.0166] = [0.01768, 0.01795]

最终取一个数字:0.01769

解码过程

0.01769 在范围[0, 0.1] 因此第一个符号式A

0.01769在[0,0.1]什么范围区间?先放大 0.1769, [0, 1] 明显是[0.1, 0.4]区间,因此第二个符号是B

按照编码的时候调整区间,区间为S = (L' - S') * R1 + S'; L = (L' - S') * R2 + S' = [S, L] = [(0.1 - 0) * 0.1 + 0, (0.1 - 0) * 0.4 + 0] = [0.01, 0.04]

0.01769在[0.01, 0.04]什么范围区间?放大。0.1769,[0.1, 0.4] 也是在[0.1, 0.4]区间。因为A的区间是[0.1, 0.11] B的区间是 [0.11, 0.22] 因此第三个符号也是B

按照编码的时候调整区间,[(0.04 - 0.01) * 0.01 + 0.01, (0.04 - 0.01) * 0.4 + 0.01] = [0.013, 0.022]

0.01769在区间 [0.013, 0.022]什么范围?放大,0.1769, [0.13, 0.22] = 0.1769 ~ 0.013 + 0.09 * 0.5 0.5落在区间范围C上面,因此这个字符是C

按照编码的时候调整区间,[(0.022 - 0.013) * 0..4 + 0.013, (0.022 - 0.013) * 0.6 + 0.013] = [0.0166, 0.0184]

0.01769在区间[0.0166, 0.0184] 什么范围呢?答案是[0.6, 0.75] 因此解码符号是D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值