之前,记得在介绍CABAC的熵编码时候,有一个环节涉及到了算术编码,本篇就带大家看看算术编码是肿么一回事。
简介
算术编码是一种无损的数据压缩方法,也是熵编码的一种方法。与其他熵编码比较而言,其他熵编码通常是把输入的消息区分为符号,然后对每个符号进行编码,而算术编码是呢是根据输入消息中不同符号出现的概率,把整个输入的消息最终编码为1个数,一个介于0和1之间的小数。有没有想知道是肿么编码的呢。接下来已一个简单的栗子来说明喽。
准备工作
现在假设有字符序列 aabcda,且P(a) = 0.2,P(b) = 0.1, P(c) = 0.4,P(d) = 0.3,分别代表a,b,c,d在整个序列中出现的概率分别是20%,10%,%40,30%,四者加起来正好为1哦。且4个符号出现的概率将[0,1]区间分割为 [0,0.2),[0.2,0.3),[0.3,0.7),[0.7,1)。
编码过程
首先字符序列中出现了a,P(a) = 0.2,所以落在了区间[0,0.2);
接下来出现的还是a,P(a) = 0.2,但当前的区间已经变为【0,0.2】,(0.2 - 0) P(a) = 0.04,此时,区间边落在了【0,0.04】;
继续,序列中出现了b,P(b) = 0.1,当前区间为【0,0.04】,(0.04 - 0) P(b) = 0.004,此时,区间落在了【0,0.004】;
序列中出现c,P(c) = 0.4,当前区间为【0,0.004】,(0.004 - 0) P(c) = 0.0016,新的区间落在【0,0.0016】;
序列中出现了d,P(d) = 0.3,当前区间为【0, 0.0016】,(0.0016 - 0) P(d) = 0.00048,新的区间落在【0,0.00048】;
序列中出现了a,P(a) = 0.2,当前区间为【0,0.00048】,(0.00048 - 0) * P(a) = 0.000096,区间落在【0,0.000096】。
好了,到此,整个序列中的符号经过算术编码得到一个相对较小的区间,二进制编码最终在最后得到的区间之内,选取任意一个数作为编码的结果。此处我们就选则0.000086作为最终的结果吧。这样,我们的算术编码是不是也清晰了呢,希望对大家有用哦!
原文地址:http://blog.51cto.com/7335580/2070048