一种基于条件概率的哈夫曼解码的方法
技术领域
本发明涉及一种解码方法,特别涉及一种基于条件概率的哈夫曼解码的方法。
背景技术
在数据压缩领域哈夫曼算法应用得非常广泛,特别是各种音频和视频的编解码算法中都应用到这种算法。哈夫曼算法是一种根据待压缩数据中各元素出现的概率进行编码和解码的算法,能无损压缩数据所占用的空间。编码过程举例如下。
待压缩数据:AABCABAADACB
不压缩情况下编码如下:00-A,01-B,10-C,11-D
不压缩情况下表示为:00 00 01 10 00 01 00 00 11 00 10 01
设各元素出现概率为:P(A)=0.6,P(B)=0.25,P(C)=0.15,P(D)=0.05
编码表为:1-A,01-B,001-C,000-D
压缩后码流为:11 01 001 1 01 1 1 000 1 001 01
不压缩存储该数据需要24个字符,压缩后只需要21个字符,减少了3个字符的空间。各元素出现概率是一个先验数据,一般是根据待压缩数据的特性推算得出,或者对大量待压缩数据进行统计得出。
解码是编码的逆过程,方法是重复在码流中查找编码表中的码字,再还原为码字对应的信息,最后依次组合为待压缩数据。上述例子的压缩码流解码过程如下:
压缩码流为:1 1 01 001 1 01 1 1 000 1 001 01
解码后数据:A A B C A B A A D A C B
在音频和视频的编解码算法中的熵编码环节一般采用哈夫曼算法进行处理。编码过程将之前环节生成的中间数据按编码表转换为对应的码字,再按照一定的格式生成最终的码流。解码过程首先在码流中依次查找编码表中的码字,转换为对应的中间结果,再由后续环节进行处理。实际应用中的编码表一般都有几百个码字,根据各元素出现的概率制定。可见,哈夫曼解码过程实际上是一个包含大量查表操作的匹配过程,减少匹配所需的查表次数就能加快哈夫曼解码的速度。以下描述了哈夫曼解码中查表匹配的常见解决方案。
(1)、顺序查找法。从编码表中依次取出码字,根据该码字的长度取码流首部相同位数的二进制序列进行比较,如果相同则匹配成功,否则取下一个码字重复上述过程。顺序查找法的效率较低,对于具有几百个码字的码表,每次一般需要几十次以上的比较,优点是节省码表所占用的空间。
(2)、优化的顺序查找法。在解码前首先对编码表进行重排,按照各码字出现的概率从大到小排列,然后在顺序查找法中使用整理后的编码表。出现概率大的码字只需较少的比较次数就能查找成功,总体查表次数有所降低,速度比原始的顺序查找法有所提高。
(3)、索引查找法。对码表中所***字按照前若干位分类,形成若干个相对较小的子编码表和一个索引表。解码时首先取码流的前若干位,根据索引表比较得到该码字所属的子编码表,然后在该子编码表中进行顺序查找。由于各子编码表中码字数量较少,本方法减少了查表次数。
现有普遍使用的哈夫曼解码算法主要利用编码表体现的码字出现的概率,查表次数都比较多。由于各码字出现的概率体现的是该码字出现的独立概率,实际上前后出现的两个码字往往具有一定的条件概率关系,充分利用这种关系可以减少查表操作的次数,提高哈夫曼解码算法的速度。
发明内容
本发明的目的在于提供一种基于条件概率的哈夫曼解码的方法,从而能达到显著减少查表次数,大大提高解码速度。
为了实现上述目的,本发明提供的一种基于条件概率的哈夫曼解码的方法,包括以下步骤:
1)、获得待压缩数据中各个码字出现的条件概率,构成各码字的条件概率表;
2)、在码字概率从大到小排列中选择前50%的码字各自作为前一码字分别构建相应的子编码表,该子编码表是由所述前一码字中对应条件概率表中条件概率值大于0.1的码字及其索引值构成;
3)、对各码字进行查表匹配,根据前一码字和步骤2)的子编码表的存在与否,对应选择子编码表或待压缩数据的原编码表为当前码表,并按顺序找到匹配码字,得到相关信息完成解码。
本发明所述步骤1)的条件概率为前一码字出现特定码字后,当前位置出现某个码字的概率。
本发明所述步骤2)的索引值为对应码字在待压缩数据的原编码表的位置值,用于查找该码字在原编码表中的所有相关信息。
本发明所述步骤2)的条件概率值大于0.1的码字按其出现在特定前一码字后的概率大小排列组成子编码表。
本发明所述步骤3)的查表匹配过程包括:
1)、判定上一个码字是否为空,如果为空的就选择原编码表为当前码表,否则选择所述的子编码表为当前码表;
2)、检查所述的子编码表是否存在,如果存在则在当前码表中顺序查找匹配的码字,否则选择原编码表为当前码表再顺序查找匹配的码字;
3)、检查能否找到匹配码字,如果找到匹配码字就设置上一码字为当前匹配码字,并根据对应索引值杂原编码表中得到相关信息,如果没找到匹配码字就对当前码表进行原码表判断处理;
4)判断当前码表是否为原码表,如果不为原始码则继续在原编码表里顺序查找匹配的码字并得到相关信息,如果当前码表为原始码或在原编码表里找不到匹配码字则报错结束。
对比顺序查找法,本发明能显著减少查表次数,明显提高解码速度;对比索引查找法的简单根据码字前若干位进行分类索引,本发明由于利用了码字出现的条件概率构造多个子编码表,常见码字能更快完成匹配过程,减少查表次数,总体上提高了解码速度。
附图说明
图1为本发明的统计码字条件概率的流程示意图;
图2为本发明利用条件概率的哈夫曼查表流程示意图。
具体实施方式
本发明基于条件概率的哈夫曼解码的方法主要包括以下三个部分:
一、构造条件概率表
所述的条件概率为前一码字出现特定码字后,当前位置出现某个码字的概率,如B码字的条件概率P(A|B)是指在码字A后出现码字B的概率。可利用现有的哈夫曼解码算法,通过大量的实际解码过程统计各个码字的条件概率,如图1所示,为统计码字条件概率的流程示意图。根据图1算法可得到关于码子的多个条目,每个条目表示前一码字为X时当前码字为Y的出现次数,表示为p(X,Y),X和Y可以是码表中的任一码字。令T(X)为前一码字为X时当前码字出现的所***字的次数总和,则T(X)=p(X,A)+p(X,B)+p(X,C)+p(X,D),X可以是码表中的任一码字,A/B/C/D代表码表中的所***字,如有其他码字还需继续求和。条件概率P(X|Y)=p(X,Y)/T(X),X和Y可以是码表中的任一码字。
得到各个码字的条件概率后构造如表1所示的码字条件概率表。
|
码字A |
码字B |
码字C |
码字D |
... |
码字A |
P(A|A) |
P(B|A) |
P(C|A) |
P(D|A) |
... |
码字B |
P(A|B) |
P(B|B) |
P(C|B) |
P(D|B) |
... |
码字C |
P(A|C) |
P(B|C) |
P(C|C) |
P(D|C) |
... |
码字D |
P(A|D) |
P(B|D) |
P(C|D) |
P(D|D) |
... |
... |
... |
... |
... |
... |
... |
表1码字条件概率表
二、构造新的编码表集
在码字概率从大到小排列中选择前50%的若干个码字,根据条件概率表(表1)构造相应的子编码表。假设码字A和码字C出现概率位于大小排列的前50%内,同时,P(A|B)>P(A|C)>P(A|A)>P(A|D),P(C|A)>P(C|C)>P(C|B)>P(C|D),则按条件概率从大到小构造两张子码表如下表2和表3。索引值Sx是指码字X在原编码表中的位置值,用于查找该码字在原编码表中的所有相关信息。
受限于哈夫曼解码装置的存储容量,对所***字都分别构造一张子码表将占用大量的存储资源。根据存储容量的限制和码字出现的概率,对于在码字概率从大到小排列中后50%的的码字可不构造子编码表,如码字D在码字概率大小排列中处于后50%的位置,则不构造作为前一字码的子编码表;对于条件概率值小于0.1的码字可不编入相应的子编码表,如表2和表3都没有编入码字D。所有子编码表和原编码表构成新的编码表集。
表2子编码表A
表3子编码表C
三、利用条件概率的哈夫曼查表
如图2所示,为本发明利用条件概率的哈夫曼查表流程示意图。其查表匹配过程包括:
1)、判定上一个码字是否为空,如果为空的就选择原编码表为当前码表,否则选择所述的子编码表为当前码表;
2)、检查所述的子编码表是否存在,如果存在则在当前码表中顺序查找匹配的码字,否则选择原编码表为当前码表再顺序查找匹配的码字;
3)、检查能否找到匹配码字,如果找到匹配码字就设置上一码字为当前匹配码字,并根据对应索引值杂原编码表中得到相关信息,如果没找到匹配码字就对当前码表进行原码表判断处理;
4)判断当前码表是否为原码表,如果不为原始码则继续在原编码表里顺序查找匹配的码字并得到相关信息,如果当前码表为原始码或在原编码表里找不到匹配码字则报错结束。
完成上述一次匹配过程后,不断重复上过程即可完成所有的解码操作。如编码后码流为1 1 01 001 1 01 1 1 000 1 001 01,设原编码表中各码字相关信息排列顺序为A B C D,编码表为:1-A,01-B,001-C,000-D。对于第一个码字,上一码字为空,直接使用原编码表进行顺序查找,在第1个位置就找到码字A,索引值就是1,根据索引值得到码字相关信息。对于第二个码字,上一码字为A,使用子码表A进行顺序查找,在子码表中找到A的索引值Sa为1,根据索引值到原编码表中第1个位置可找到码字A的相关信息。对于第四个码字C,上一码字为B,子码表不存在,选择原编码表作为当前码表进行顺序查找,余下过程与第一个码字相同。对于第九个码字D,上一码字为A,选择子码表A进行顺序查找,该子码表中并没有编入码字D,匹配码字不存在,选择原编码表作为当前码表再查找一次,在第4个位置找到匹配码字,得到相关信息。
由于常见的码字都编入各子编码表,各子编码表的码字数量不会很多,大部分查表过程都可以在子编码表中完成匹配,只有某些不常见的码字才需要在码字较多的原编码表中查找。可见大部分码字经过较少的查找次数即可完成匹配,总体查找次数将明显低于顺序查找法。