4.4 算术编码
- 格式:ppt
- 大小:705.50 KB
- 文档页数:40


算术编码 + 统计模型 = 数据压缩 - 第一部分:算术编码
作者:Mark Nelson
现在通用的大多数数据压缩方法都属于两大阵营之一:基于字典的方案和统计方法。 在小系统世界中,基于字典的数据压缩技术此时似乎更加流行。不过,通过将算术编码与强大的模型技术结合在一起,数据压缩的统计方法可以真正达到更好的性能。这篇分成两部分的文章讨论了如何用几个不同的模型方法与算术编码组合以达到一些重大的压缩率。本文的第一部分详细说明算术编码是如何工作的。第二部分说明如何开发一些可以使用算术编码的有效模型以生成高性能压缩程序。
钟爱的术语
数据压缩通常通过从输入“文本”获取“符号”、处理它们,并将“代码”写入到压缩后的文件来进行运作。对于本文来说,符号通常是字节,但是他们很可能只是像素、80 位的浮点数或者 EBCDIC 字符。数据压缩方案需要能够将已压缩的文件转换回到与输入文本的一样的拷贝才是有效的。如果已压缩的文件比输入文本更小,那么不必说,它也是有用的。
基于字典的压缩系统通过用固定长度码来代替输入文本中的一组符号来进行运作。字典技术的一个众所周知的例子是 LZW 数据压缩。(请参见 DDJ 的 89 年第 10 期中的“LZW 数据压缩”一文)。LZW 通过通常从 9 到 16 位大小范围的码来取代本来无限长的字符串来进行运作。
数据压缩的统计方法采取一种完全不同的方法。它们通过一次编码多个符号来运作。将符号编码到可变长的输出码中。输出码的长度根据符号的概率或者频率进行变化。低概率的符号用较多的位进行编码,并且高概率符号用较少的位进行编码。
实践中,统计和字典方法之间的分界线并不总是那么清晰。一些方案并不能明显地归为某一个阵营或者另一个,并且总是有一些使用来自两种技术特性的混合方案。不过,在本文中讨论的方法使用算术编码来实现纯粹的统计压缩方案。
霍夫曼(Huffman)编码:退役的冠军
算术编码原理
早在1948年,⾹农就提出将信源符号依其出现的概率降序排序,⽤符号序列累计概率的⼆进值作为对芯源的编码,并从理论上论证了它的优越性。1960年, Peter Elias发现⽆需排序,只要编、解码端使⽤相同的符号顺序即可,提出了算术编码的概念。Elias没有公布他的发现,因为他知道算术编码在数学上虽然成 ⽴,但不可能在实际中实现。1976年,R. Pasco和J. Rissanen分别⽤定长的寄存器实现了有限精度的算术编码。1979年Rissanen和G. G. Langdon⼀起将算术编码系统化,并于1981年实现了⼆进制编码。1987年Witten等⼈发表了⼀个实⽤的算术编码程序,即CACM87(后⽤ 于ITU-T的H.263视频压缩标准)。同期,IBM公司发表了著名的Q-编码器(后⽤于JPEG和JBIG图像压缩标准)。从此,算术编码迅速得到了 ⼴泛的注意。
算术编码的基本原理是将编码的消息表⽰成实数0和1之间的⼀个间隔(Interval),消息越长,编码表⽰它的间隔就越⼩,表⽰这⼀间隔所需的⼆进制位就越多。
算术编码⽤到两个基本的参数:符号的概率和它的编码间隔。信源符号的概率决定压缩编码的效率,也决定编码过程中信源符号的间隔,⽽这些间隔包含在0到1之间。编码过程中的间隔决定了符号压缩后的输出。
给定事件序列的算术编码步骤如下:
(1)编码器在开始时将“当前间隔” [ L, H) 设置为[0,1)。
(2)对每⼀事件,编码器按步骤(a)和(b)进⾏处理
(a)编码器将“当前间隔”分为⼦间隔,每⼀个事件⼀个。
(b)⼀个⼦间隔的⼤⼩与下⼀个将出现的事件的概率成⽐例,编码器选择⼦间隔对应于下⼀个确切发⽣的事件相对应,并使它成为新的“当前间隔”。
(3)最后输出的“当前间隔”的下边界就是该给定事件序列的算术编码。
设Low和High分别表⽰“当前间隔”的下边界和上边界,CodeRange为编码间隔的长度,LowRange(symbol)和HighRange(symbol)分别代表为了事件symbol分配的初始间隔下边界和上边界。上述过程的实现可⽤伪代码描述如下:set Low to 0
- 1 - 算术编码例题
算术编码(arithmeticcoding)是在数学和计算机科学领域中使用的一种无损数据压缩算法,它可以有效把数据字节压缩,从而节省存储和传输空间。算术编码被用来压缩音频、视频、图像、文字等多种形式的数据,可以有效提高传送数据的速度,使通信更加高效。
算术编码的工作原理很简单,首先,它将可能的信息字符用一系列概率分布的概率表示出来,然后通过这些概率表示的字符来压缩数据。这个过程称为“编码”,将压缩后的数据变成可读的形式叫作“解码”。
例如,在一个字符编码中,如果字母A有20%的概率,字母B有30%的概率,字母C有50%的概率,那么算术编码系统就会将20%的概率转换成0.1,30%的概率转换成0.2,50%的概率转换成0.3。这样,数据就可以在这种编码中由概率表示,从而降低存储空间和通信空间。
算术编码也被用于数字信号的处理,其中的概率表示被称为“熵编码”(entropy coding)。熵编码是一种非常高效的数字信号处理算法,不仅仅是压缩数据,而且可以从数据中提取有用的信息。例如,压缩后的数字影像可以被保存在文件中,并且可以使用熵编码方法来提取有用的信息。
此外,算术编码还可以用于语音识别,这种技术能够识别发音人的语音,并将其转换为文本。算术编码可以大大缩短识别语音的时间,同时也可以比较准确地将语音转换为文本。 - 2 - 算术编码具有非常广泛的应用,已发展到了比较高的水平,被用于不同的数据处理和通信领域,为现代数据处理和通信技术提供了非常重要的支持。但是,由于它复杂的算法,处理过程中有可能出现错误,所以在使用算术编码进行数据处理和通信时,有必要做好算法错误的预防措施。
综上所述,算术编码是一种非常有用的信息处理方法,它可以有效把数据字节压缩,节省存储和传输空间,同时可以使通信更加高效。它的应用不只是在字符编码和数字信号处理,它还可以用于语音识别,让语音转换为文本的过程更快更准确。算术编码既支持现代数据处理和通信技术发展又提供了有用的信息,所以它被越来越多地使用。
算术编码(Arithmeticcoding)的实现
算术编码例题:
假设信源信号有{A, B, C, D}四个,他们的概率分别为{0.1, 0.4, 0.2, 0.3},如果我们要对CADACDB这个信号进⾏编码,那么应该怎样进⾏呢?
准备⼯作完成之后,我们便可以开始进⾏编码了。
那么我们⾸先读⼊信号:C——因为C在最初始的间隔中是[0.5, 0.7),所以读⼊C之后我们的编码间隔就变成[0.5, 0.7)了;
紧接着,我们读⼊的是A,A在初始区间内是占整个区间的前10%,因此对应这个上来也是需要占这个编码间隔的前10%,因此编码区间
变为:[0.5, 0.52)了;
再然后是D,因为D占整个区间的70% ~ 100%,所以也是占⽤这个编码区间的70% ~ 100%,操作后的编码区间为[0.514, 0.52)
……
直到最后将信号量全部读出。
最后,我们将这个操作过程绘制成为⼀张表:
解码例题:
假设信源信号有{A, B, C, D}四个,他们的概率分别为{0.1, 0.4, 0.2, 0.3},当我们得到的编码是0.5143876的时候,问原始的信号
串(7位)是怎样的?
准备⼯作完成之后,我们现在开始解码:
我们发现,待解码的数据0.5143876在[0.5, 0.7)内,因此,我们解出的第⼀个码值为C
同理,我们继续计算0.5143876处于[0.5, 0.7)的第⼀个10%内因此解出的第⼆个码值为A ……
这个过程持续直到执⾏七次全部执⾏完为⽌。
那么以上的过程我们同样可以列表表⽰:
作业:对任⼀概率序列,实现算术编码,码长不少于16位,不能固定概率,语⾔⾃选。
基于Python实现:
from collections import Counter #统计列表出现次数最多的元素
import numpy as np
print("Enter a Sequence\n")
inputstr = input()
print (inputstr + "\n")