专利名称:一种基于非完备码表解析码长的哈夫曼解码方法
技术领域:
本发明涉及一种哈夫曼解码方法,尤其涉及一种基于非完备码表快速解析码长的
哈夫曼解码方法。
背景技术:
哈夫曼算法是一种根据待压縮数据中各元素出现的概率进行编码和解码的算法, 能无损的压縮数据所占用的空间。图1是一个哈夫曼码字生成树的例子,以其码字为叶子, 码字所属层数为级别数。 解析哈夫曼码时,先确定要解析的码流的首个码字长度,将其取出,用哈夫曼编码 提供的符号表就可以找到这个码字所对应的数据元素。除去码流里的首个码字,将剩余的 码流按上述方法逐一解析,即可完成哈夫曼的解码过程。由于哈夫曼编码是变长编码,在整 个解码过程中,必须解决的一个问题是确定哈夫曼码字的长度,以下描述了哈夫曼解码中 码字长度解析的常见解决方案 1、级别比较解析法。基于哈夫曼码字生成树建立一个叶子检索表来指示最近下一 级存在哈夫曼码字的级别(等同码字长度),并将同一级上最小码字作为前缀位,其余位补 O,扩充到最大码长长度。以哈夫曼前缀码所在级别为索引,以这个扩充码为索引值,建一 张各级最小哈夫曼码字为前缀的定长码字检索表。在哈夫曼码码长解析时,按叶子检索表 O级检索下一级别,并以这个下一级别检索定长码字检索表里的码字,取出最大码长长度的 码流数值与之比较,如果这个码流数值不小于定长码字检索表里的码字,叶子检索表的当 前级别用下一级别替换,并用这个新的当前级别检索下一级存在叶子的级别,然后用这个 新的下一级级别检索定长码字检索表里的码字,用码流数值与之比较,直到码流数值小于 定长码字检索表里的码字,此时叶子检索表里当前级别和码流里存在的码字长度相同。
2、完备码表解析法。基于码流中所包含的所有哈夫曼码字生成树的叶子码字,建 立一张完备码长码表。这个完备码长码表的每项索引以哈夫曼码字为前缀、按一定规则扩 展到最大码长长度,其索引值为相应的哈夫曼前缀码码长。对于当前待解析的哈夫曼码流, 按照其待解析码字所属的哈夫曼码字生成树,在定长码字完备码长码表中检索到与这个哈 夫曼码字生成树相对应的码表部分。以最大码字长度截取当前待解析的哈夫曼码流,并将 这个截取出的码流数值作为索引,在当前码流哈夫曼码字生成树对应的码长码表部分检 索,检索到的当前码长码表值即为当前待解析码流中首个码字码长。 得到码长后提取首个码字,在当前哈夫曼码字生成树所对应的符号表中即可解析 到当前码字所对应的数据。从码流中除去已解析的部分,在剩余码流中继续逐个操作,即可 完成所有哈夫曼码的解析。 现有普遍使用的哈夫曼解码算法虽然利用了编码表体现的码字出现的概率,并基 于哈夫曼码生成树各级叶子的存在性对检索算法进行了优化,但对于绝大部分码字,码长 均需要多次才能确定,在总的解码算法中耗时比例较大;基于完备码表解析码长虽然提高 了码长解析速度,但是对于嵌入式系统的硬件存储要求而言,其空间复杂度增加太大,难以满足要求。 在音频、视频领域,基于哈夫曼数据压縮的编码、解码算法在嵌入式系统中应用非 常广泛。在哈夫曼算法中,码字以变长二进制前缀码表示,为了解析一个哈夫曼码字,必须 先解析哈夫曼码字的字长,传统的码长解析算法不是速度过慢就是码表数据量过大,如何 在不增加码表数据量的同时减少码长解析的时间,这对于哈夫曼解码有很重要的意义。
发明内容
本发明目的在于提供一种基于非完备码表解析码长的哈夫曼解码方法,该方法可 以大大减少码表占用的储存空间和加快解码速度。 本发明的目的可以通过以下方案实现一种基于非完备码表的哈夫曼解码方法, 步骤包括 1、按级别比较解析法,构建所有用于级别比较解析的码表,包括叶子检索表和各 级哈夫曼最小码字为前缀的定长码字检索表; 2、确定非完备码表临界码长L :从最小码长和最大码长之间选择一个值L,作为构 建非完备码表的临界码长; 3、基于码流中所包含的所有哈夫曼码字生成树的不超过临界码长L比特的叶子 码字,再构建一个以哈夫曼码字为前缀的L比特非完备码表; 4、按照当前码流中待解析部分所属的哈夫曼码字生成树,读取最大码长长度的码 流数值,以这个码流数值为索引,按照当前待解析码流所属的哈夫曼码字生成树,在对应的 以各级哈夫曼最小码字为前缀的定长码字检索表里检索级别(码长)为(L+l)的码字;
5、比较码流数值与刚检索到的(L+l)级的定长码字,若码流数值小于刚检索到的 码字,以码流数值的前L比特为新的索引,在对应的非完备码长码表部分检索,检索到的值 即为当前码流待解析部分首个码字码长;反之,以旧的码流数值作为比较对象,按照级别比 较解析法,解析其对应的L级之后的首个码字长度; 6、根据已解析的码长,在当前码流中提取其码字,基于码字对应的符号表,查取其 对应符号值,即可完成码流中首个码字的解析; 7、从当前码流中剔除已经解析的码字,将剩余码流重复步骤4、5、6,即可完成所有 哈夫曼码的解码。 所述的非完备码长码表以码流包含的每个哈夫曼码字生成树为单位,按相同的方 式逐一构建;对于每棵哈夫曼码字生成树,以不超过L比特的哈夫曼码字为前缀,其余位由 全0到全1扩展到L比特长度,建立非完备码长码表的索引;索引指向的值为哈夫曼前缀码 码长。 所述的每个哈夫曼码字生成树对应的码长码表部分构建过程首先,按照对应的 哈夫曼码字生成树,构建L比特长度的各个比特位为全O到全1的索引,并将所有索引值 (即码长码表值)初始化为0 ;以哈夫曼生成树的所有不超过L比特叶子码子为前缀,将剩 余码字位以全0到全1填充到L比特长度,将所有同哈夫曼码字前缀的扩充码的码长码表 值以对应哈夫曼前缀码的长度赋值。 本发明可以大大减少存储空间和加快了检测速度。例如当最大码长为N( —般为
416)时,级别比较解析法的码长解析时间复杂度为o(l>, x/ )—其中Pi为码长为i的码
字的统计概率,每个描述符对应的码长码表空间复杂度为N ;完备码表码长解析时间复杂 度为O(l),对应每个描叙符的完备码长码表空间复杂度为(2~N);对比于这两种技术,非完
备码表码长解析法的时间复杂度为0(1+^P, XZ'),接近于完备码表马场时间解析复杂度,
其对应的每个描述符的空间复杂度为(2'8+N),按普通码长16计算,其空间复杂度只有完 备码表解析法的i ,极大地节省了存取空间。
图1是现有技术中的哈夫曼码字生成树; 图2是本发明的单个哈夫曼码字生成树对应的非完备码长码表生成流程示意图;
图3是本发明的码长解析流程示意图。
具体实施例方式
先构建一个基于级别比较解析法的用于检索定长码字的码表;按现有技术中的级 别比较解析法,构建所有用于级别比较解析的码表,包括叶子检索表和各级哈夫曼最小码 字为前缀的定长码字检索表; 再构建一个以哈夫曼码字为前缀的L比特非完备码表基于码流中所包含的所有 哈夫曼码字生成树的不超过L比特的叶子码字,建立一张非完备码长码表,L为构建非完备 码表的临界码长,从最小码长和最大码长之间选择,对于最大码长为16位的码表,推荐使 用8作为临界码长L。这个非完备码长码表的每项索引以不超过L比特的哈夫曼码字为前 缀、其余由全0到全1扩展到L比特长度,其索引值为相应的哈夫曼前缀码码长。在这个非 完备码长码表的构建过程中,以码流包含的每个哈夫曼码字生成树为单位,按相同的方式 逐一构建。 每个哈夫曼码字生成树对应的码长码表部分构建过程如下,首先,按照对应的哈 夫曼码字生成树,构建L比特长度的各个比特位为全O到全1的索引,并将所有索引值(即 码长码表值)初始化为0 ;以哈夫曼生成树的所有不超过L比特叶子码子为前缀,将剩余码 字位以全0到全1填充到L比特长度,将所有同哈夫曼码字前缀的扩充码的码长码表值以 对应哈夫曼前缀码的长度赋值。 图2是选用8比特非完备码长码表构建过程中单个哈夫曼码字生成树对应部分的
处理,其中当前级别、当前叶子数和当前码字在当前级别中的位序均从o起始。具体步骤如
下 1、初始化将所有码长设为0,并设置当前级别为1 ; 2、计算当前级别叶子总数;然后设置当前级别当前叶子位序位0 ; 3、以叶子位序对应码字为前缀码,补0到L位,计算其扩充码字总数;然后设置当
前叶子当前码字位序位O; 4、以扩充码字加其位序位索引,索引值为当前级别值;
5、比较扩充码字位序是否小于当前码字总数,如果结果返回是,则扩充码字位序
加1并返回步骤4 ;如果结果返回否,则进行下一步; 6、将前缀码加1作为下一个前缀码,比较当前叶子位序是否小于级别总叶子数,
如果结果返回是,则当前叶子位序加1并返回步骤3 ;如果结果返回否,则进行下一步; 7、检测当前码字级别是否不大于L,如果结果返回是,则返回步骤2 ;如果结果返 回否,则码表生成完毕并结束。 构建上述两个码表后,然后解析码长,按照当前码流待解析部分所属的哈夫曼码 字生成树,读取其最大码长长度的码流数值,以这个码流数值为索引,在对应的各级哈夫曼 码最小码字前缀定长码字检索表里检索级别(码长)为L+1的码字。 比较码流数值与刚检索到的码字,若码流数值小于刚检索到的码字,以码流数值 的前L比特为新的索引,在与当前码流待解析部分所属的哈夫曼码字生成树对应的非完备 码长码表部分检索,检索到的值即为当前码流待解析部分首个码字码长;反之,以旧的码流 数值作为比较对象,按照级别比较解析法,从对应的哈夫曼码字生成树的L级之后检索当 前码流中待解析的首个码字长度。从当前码流中提取刚解析到的码长码流,在当前码字所 属哈夫曼码字生成树对应的符号表中即可查出其对应的数据。 从当前码流剔除已经解析的码字,将剩余码流按上述方法解析,即可完成所有哈 夫曼码的解码。 具体解码流程如图3所示,首先提取当前比特流最大码长比特A和定长码字表中 级别为L+l的码字B,并比较A、 B的大小。如果A小于B则取A的前L比特数作为索引在 对应的非完备码表部分检索,码长为索引值,并结束解码。如果A不小于B,则在叶子检索表 中检索哈夫曼码字数第L级之后存在码字的下一级级别;在定长码表检索当下一级别对应 的码字C。如果A不小于C,则以下一级别代替当前级别,在叶子检索表中检索存在码字的 下一级别,并返回重新检索码字C ;如果A小于C,则码长为当前级别值,并结束解码。
权利要求
一种基于非完备码表解析码长的哈夫曼解码方法,其特征在于,步骤包括(a)、按级别比较解析法,构建所有用于级别比较解析的码表,包括叶子检索表和各级哈夫曼最小码字为前缀的定长码字检索表;(b)、确定非完备码表临界码长L从最小码长和最大码长之间选择一个值L,作为构建非完备码表的临界码长;(c)、基于码流中所包含的所有哈夫曼码字生成树的不超过临界码长L比特的叶子码字,再构建一个以哈夫曼码字为前缀的L比特非完备码表;(d)、按照当前码流中待解析部分所属的哈夫曼码字生成树,读取最大码长长度的码流数值,以这个码流数值为索引,按照当前待解析码流所属的哈夫曼码字生成树,在对应的以各级哈夫曼最小码字为前缀的定长码字检索表里检索级别(码长)为(L+1)的码字;(e)、比较码流数值与刚检索到的(L+1)级的定长码字,若码流数值小于刚检索到的码字,以码流数值的前L比特为新的索引,在对应的非完备码长码表部分检索,检索到的值即为当前码流待解析部分首个码字码长;反之,以旧的码流数值作为比较对象,按照级别比较解析法,解析其对应的L级之后的首个码字长度;(f)、根据已解析的码长,在当前码流中提取其码字,基于码字对应的符号表,查取其对应符号值,即可完成码流中首个码字的解析;(g)、从当前码流中剔除已经解析的码字,将剩余码流重复步骤d、e、f,即可完成所有哈夫曼码的解码。
2. 根据权利要求1所述的一种基于非完备码表解析码长的哈夫曼解码方法,其特征在 于,所述的非完备码长码表以码流包含的每个哈夫曼码字生成树为单位,按相同的方式逐 一构建;对于每棵哈夫曼码字生成树,以不超过L比特的哈夫曼码字为前缀,其余位由全0 到全1扩展到L比特长度,建立非完备码长码表的索引;索引指向的值为哈夫曼前缀码码 长。
3. 根据权利要求1所述的一种基于非完备码表解析码长的哈夫曼解码方法,其特征在 于,所述的每个哈夫曼码字生成树对应的码长码表部分构建过程首先,按照对应的哈夫曼 码字生成树,构建L比特长度的各个比特位为全O到全1的索引,并将所有索引值(即码长 码表值)初始化为0 ;以哈夫曼生成树的所有不超过L比特叶子码子为前缀,将剩余码字位 以全0到全1填充到L比特长度,将所有同哈夫曼码字前缀的扩充码的码长码表值以对应 哈夫曼前缀码的长度赋值。
全文摘要
本发明公开了一种基于非完备码表解析码长的哈夫曼解码方法,步骤包括构建所有用于级别比较解析的码表;确定非完备码表临界码长L;再构建L比特非完备码表;读取最大码长长度的码流数值,在对应的以各级哈夫曼最小码字为前缀的定长码字检索表里检索级别为(L+1)的码字;解析L级之后的首个码字长度;查取其对应符号值,完成码流中首个码字的解析;从当前码流中剔除已经解析的码字,重复上述步骤完成所有哈夫曼码的解码。本发明可以大大减少存储空间和加快了检测速度;当最大码长为16时,其空间复杂度只有完备码表解析法的,极大地节省了存取空间。
文档编号H03M7/42GK101729076SQ20081021856
公开日2010年6月9日 申请日期2008年10月22日 优先权日2008年10月22日
发明者叶广明, 胡胜发, 苏丹, 裴少芳 申请人:安凯(广州)软件技术有限公司