#part of project
1.编解码大致过程--编码一个符号
对于给定符号s,将其编为某一区间内的一个值。将一个可写为b的w次幂的整数R作为初始区间大小,即初始区间范围。设初始区间为[L,H],则R=H-L+1。另外还需要准备的量有:所有符号的总计频度T,符号S的频度fs,符号S的累计频度Fs。注:累计频度为所有符号值小于S的其他符号的频度之和。计算公式:
例:现有由四个符号组成的信息,符号分别为A,B,C,D,先对D编码:
①编码前初始化:所有符号初始的频度都为1,初始区间范围R=,设b=10,w=2,即R=100,区间[0,99]。根据区间映射公式(如下),可计算得到各个符号的相关信息如下表:
若对符号D编码,即取符号D映射区间的一个值V即可,假设取V=80,该值属于[75,99]。V可以分解V=8*即8*
,此时可以仅输出8作为符号D的编码值。
②解码:解码前的初始化必须与编码前的初始化完全一致,即初始频度、区间范围必须一致。仅输入例子中编码得到的8,根据下表可推断出符号累积频度,根据累计频度可估计出对应符号。
输入8,对应V为80,计算出频度为3.2,估为3,对应符号为D。
2.编解码大致过程--编码两个符号
当编码一个符号后的映射区间足够大,可以对这个区间进行继续划分进而编码下一个符号。相应的,当编码符号过多时,为了有足够大的映射区间应加大初始化时的区间范围。
例:编码符号DC:
设初始w=3,初始区间范围R=1000,映射区间的计算结果如下:
***初始时所有符号的频度都设为1,输入一个符号,计算了这个符号的映射区间后需将该符号的频度加1.在编码第一个符号时使用的是初始区间,编码第二个符号时需要使用的是第一个符号的映射区间***。在当前的例子中,最后可以输出850(区间850~900内),省略后为85,即DC的编码结果就是85。 在编码的时候,没必要将每个符号的映射区间都计算出来。只需要计算当前输入符号的映射区间即可。
3.正规化
以上是理论层面,实际上,每次编码后映射区间都会在上一次的基础上压缩,极限情况下会导致映射区间范围趋向0。解决方法是对映射区间正规化,即每次区间满足一定条件时,将一些不必要的数字从区间中移出,并对区间进行一次扩展。
区间大小本身是有范围的,设为[Rmin(计算),Rmax(计算
)]。设b=10,w=3,则Rmin=100,Rmax=1000。假设有一个区间[1319314,1320105],我们可以将这个区间分为三个部分:
第一部分都是13,即完全相同的高位数字,后续细分区间中该部分数字也不会发生变化,故称为不变数字,用c表示;第二部分19,20,仅差1,这两个数字可以用公式(d + 1) * bn - 1 - 1和(d + 1) * bn - 1来表示。我们称d为延迟数字,称n为延迟长度。在这个例子里:d = 1,n = 2。
当n = 0时d = 0。当出现延迟数字时,即:n ≠ 0,表明区间的上沿和下沿靠的很近。如果区间的上下沿靠的过近,即R偏小,会严重的影响运算精度。所以此时,也需要将延迟数字移出区间。但是,当出现延迟数字时,我们通常无法知道区间的变化是趋向d还是趋向d + 1。所以延迟数字暂时不能输出。当区间的变化趋势可以确定时,再输出延迟数字。
区间的第3个部分,是两个长度为w的数字。该部分可以作为映射区间,用于下一次编码。
根据上面的描述我们可以发现,不变数字c和延迟数字d都是可以移出区间的。那么我们可以确定的一个移出数字x,x可以由下述公式进行计算。x = c * bn + (d + 1) * bn - 1,现在我们可以将区间[L,H]转换为c,(d,n),[L”,H”]的形式。其中的数学关系如下所示。
根据上面的公式,我们可以将区间[1319314,1320105]转换为13(不变数字c),(1,2)(延迟数字,延迟长度),[-686,105](根据公式计算得到的L'' H'')的形式。这样,我们就可以使用一个较小的区间[L”,H”]来模拟无限区间[L,H]上的运算。每当区间满足条件时,就将数字从区间中移出。现在我们仍就对数据“DCBDDDAADCB”进行压缩,不过这次将使用正规化。压缩前设Rmax = 1000,Rmin = 100,初始区间范围R = Rmax。编码时映射区间的变化,以及正规化操作如表所示。
(正规化的映射区间并不是逐步变小的)
正规化的操作只有在R ≤ Rmin时进行。每编码完一个符号,都要检查是否需要进行正规化操作。正规化的时候要先检查是否有延迟数字,然后再检查是否有不变数字。
总结几个要点:
初始区间大小满足基的整数次幂;
区间映射,编码区间跟随映射区间;
编解码前的初始化必须一致,解码根据估算的频度估计得到对应符号;
当区间大小不满足范围时需要对当前区间正规化,移出一些不变数字、延迟数字(输入至码流中),再对区间进行扩展;;每编完一个符号都要检查是否需要正规化。