一种快速提取比特流哈夫曼解码方法

文档序号:7510310阅读:256来源:国知局
专利名称:一种快速提取比特流哈夫曼解码方法
技术领域
本发明属于采用哈夫曼编解码的多媒体技术领域,尤其涉及一种通过从比特流中快速提取比特位来实现哈夫曼解码的方法。
背景技术
所述的哈夫曼编码是利用信号源符号的概率分布来确定符号编码的信息量,对于出现概率高的符号,采用短的码字来描述;对于出现概率低的符号,采样长的码字来描述。通过变长编码来消除信息之间的冗余,来实现对信号无损压缩的目的。
在现代的多媒体领域,哈夫曼编解码技术得到了广泛的应用,包括应用在MPEG音频编码解码技术中,应用在AVS音频编解码技术中,以及应用在AC系列音频编解码技术中。
在哈夫曼解码过程中,需要从比特流中提取比特位用于在哈夫曼码表中来查找所提取比特位总共对应的值是否等于哈夫曼码表中的某个码值,同时所提取比特位的总数是否等于该码值对应的码长,如果两者都相同,即可以得到解码信息。但是在从比特流中剥离比特位的时候,就需要大量的移位和逻辑运算。
目前常见的哈夫曼解码方法有线性搜索法、直接查表法、二进制搜索法和分步查表法。其中线性搜索法和二进制搜索法的效率较低,不适合实时性要求高的场合;而直接查表法的效率稍高,但是内存开销较大;另外,分步查表法是二进制搜索法和直接查表法的折衷,但是其效率仍不是很高。
本发明提出了一种从比特流中快速剥离比特位数来实现哈夫曼解码的方法,大大的减少由于从比特流中剥离比特位数而导致的大量运算,最终实现可以获得同原来相同的解码结果。

发明内容
本发明要解决的技术问题是,提供一种快速提取比特流哈夫曼解码方法,其通过重新构造哈夫曼码表的结构,将码表构造成基于码长呈规律性分布,再利用构造的码表来实现快速从比特流中剥离出需要解码的位数,从而实现对比特流解码;本发明方法可大大减少由于从比特流中剥离比特位数而导致的大量运算,并可最终获得同原来相同的解码结果,大大提高运行效率。
为了达到上述目的,本发明提供一种快速提取比特流哈夫曼解码方法,其包含以下步骤步骤1、重新构造新的哈夫曼码表的码值表,索引表和码长表;步骤2、基于步骤1中所构造的哈夫曼码表,快速地从比特流中剥离出需要的位数来实现哈夫曼解码。
所述的步骤1具体包含以下步骤步骤1.1、根据哈夫曼码表中原来的码长表Table_len1中的各个码长值的大小,按照顺序重新进行排序,将排序后获得的新码长表存储在表Table_len2中;步骤1.2、将从原来码长表映射到新码长表的映射关系存储到映射表Table_Index中;步骤1.3、按照表Table_Index中的映射关系,将哈夫曼码表中原来的码值表Table_val1对应映射到新的码值表Table_val中;步骤1.4、在码长表Table_len2的基础上,生成新的码长表Table_len。
所述的步骤1.1中,根据哈夫曼码表中原来的码长表Table_len1中的各个码长值的大小,按照从小到大的顺序重新进行排序,得到Table_len2。
所述的步骤1.1中,根据哈夫曼码表中原来的码长表Table_len1中的各个码长值的大小,按照从大到小的顺序重新进行排序,得到Table_len2。
所述的步骤1.4具体包含以下步骤步骤1.4.1、用码长表Table_len2中的最后一个码长值减去排列在其前一个(即最后第二个)的码长值,并将相减所得的结果覆盖存储在最后一个码长值所在的存储空间;步骤1.4.2、用码长表Table_len2中的最后第二个码长值减去排列在其前一个(即最后第三个)的码长值,并将相减所得的结果覆盖存储在最后第二个码长值所在的存储空间;如此类推;
步骤1.4.3、用码长表Table_len2中的第二个码长值减去排列在其前一个(即第一个)的码长值,并将相减所得的结果覆盖存储在第二个码长值所在的存储空间;步骤1.4.4、由于码长表Table_len2中的第一个码长值前面没有数据,故码长表中的第1个码长值保持不变,由此生成新的码长表Table_len。
上述步骤1中重新生成的码值表Table_val,码长表Table_len和映射表Table_Index组成步骤1中所述的新的哈夫曼码表。
所述的步骤2具体包含以下步骤步骤2.1、设置记忆变量m,val和bitCnt的初始值均为0;其中,bitCnt用来存储从比特流中提取的比特位数;m用来记录在码表中上一次搜索到的位置,val用来记录从比特流中提取的bitCnt个比特位对应的值;步骤2.2、获取前一次在码长表中搜索到的位置将记忆变量m赋值给j,即j=m;步骤2.3、从比特流中依次读取相应位比特数据步骤2.3.1、根据码长表中当前Table_len[j]的值,将变量val的值向左移Table_len[j]位后赋值给val,即val=val<<Table_len[j];其中,j=0,1,……,Size-1,Size表示哈夫曼码表中码的个数值;步骤2.3.2、利用函数unpack()依次从左至右从比特流中读取出Table_len[j]位的比特位,将读取获得的比特数据unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j]);其中,unpack(Table_len[j])函数表示从比特流中读取出Table_len[j]个比特位的数据;步骤2.3.3、利用变量bitCnt来记录从比特流中共提取出的比特位数,即bitCnt=bitCnt+Table_len[j];步骤2.4、判断val的值是否等于Table_val[j]的值,若相等,执行步骤2.5;若不相等,执行步骤2.6;步骤2.5、将当前j值对应的映射索引Table_Index[j]作为解码信息返回,同时返回解码信息编码的位数bitCnt的值,结束解码过程;步骤2.6、依次循环判断当前Table_Index[j+1]和bitCnt是否为解码获得的信息,该步骤2.6具体包含以下步骤步骤2.6.1、判断码长表Table_len[j+1]的值是否等于0,若Table_len[j+1]=0,执行步骤2.6.3;若码长表Table_len[j+1]≠0,执行步骤2.6.2;其中,j+1=1,……,Size-1,Size表示哈夫曼码表中码的个数值;步骤2.6.2、记录在码长表中当前搜索到的位置将当前j+1的值赋值给记忆变量m,即m=j+1,然后循环返回执行步骤2.2;步骤2.6.3、判断val的值是否等于码值表Table_val[j+1]的值;如果相等,执行步骤2.6.4;如果不相等,则循环返回执行步骤2.6.1,判断哈夫曼映射表中下一个Table_Index[j+1](即此时令j+1=(j+1)+1),和bitCnt是否为解码获得的信息;步骤2.6.4、将当前j+1值对应的映射索引Table_Index[j+1]作为解码信息返回,同时返回解码信息编码的位数bitCnt的值,结束解码过程。
本发明提供的快速提取比特流哈夫曼解码方法,其通过重新构造哈夫曼码表的结构,将码表构造成具有规律性分布,再利用构造的码表来实现快速从比特流中剥离出需要解码的位数,从而实现对比特流解码。本发明方法可大大减少由于从比特流中剥离比特位数而导致的大量运算,并可最终获得同原来相同的解码结果,大大提高运行效率。


图1是本发明步骤2中快速从比特流中剥离出需要的位数进行哈夫曼解码的流程图。
具体实施例方式
以下根据图1,具体说明本发明的一种较佳实施方式本发明提供一种快速提取比特流哈夫曼解码方法,其包含以下步骤步骤1、重新构造新的哈夫曼码表的码值表,索引表和码长表;步骤2、基于步骤1中所构造的哈夫曼码表,快速地从比特流中剥离出需要的位数来实现哈夫曼解码。
所述的步骤1具体包含以下步骤步骤1.1、根据哈夫曼码表中原来的码长表Table_len1中的各个码长值的大小,按照顺序重新进行排序,将排序后获得的新码长表存储在表Table_len2中;步骤1.2、将从原来码长表映射到新码长表的映射关系存储到映射表Table_Index中;步骤1.3、按照表Table_Index中的映射关系,将哈夫曼码表中原来的码值表Table_val1对应映射到新的码值表Table_val中;步骤1.4、在码长表Table_len2的基础上,生成新的码长表Table_len。
所述的步骤1.1中,根据哈夫曼码表中原来的码长表Table_len1中的各个码长值的大小,按照从小到大的顺序重新进行排序,得到Table_len2。
所述的步骤1.1中,根据哈夫曼码表中原来的码长表Table_len1中的各个码长值的大小,按照从大到小的顺序重新进行排序,得到Table_len2。
所述的步骤1.4具体包含以下步骤步骤1.4.1、用码长表Table_len2中的最后一个码长值减去排列在其前一个(即最后第二个)的码长值,并将相减所得的结果覆盖存储在最后一个码长值所在的存储空间;步骤1.4.2、用码长表Table_len2中的最后第二个码长值减去排列在其前一个(即最后第三个)的码长值,并将相减所得的结果覆盖存储在最后第二个码长值所在的存储空间;如此类推;步骤1.4.3、用码长表Table_len2中的第二个码长值减去排列在其前一个(即第一个)的码长值,并将相减所得的结果覆盖存储在第二个码长值所在的存储空间;步骤1.4.4、由于码长表Table_len2中的第一个码长值前面没有数据,故码长表中的第1个码长值保持不变,由此生成新的码长表Table_len。
上述步骤1中重新生成的码值表Table_val,码长表Table_len和映射表Table_Index组成步骤1中所述的新的哈夫曼码表。
如图1所示,所述的步骤2具体包含以下步骤步骤2.1、设置记忆变量m,val和bitCnt的初始值均为0;其中,bitCnt用来存储从比特流中提取的比特位数;m用来记录在码长表中上一次搜索到的位置,val用来记录从比特流中提取bitCnt个比特位对应的值;步骤2.2、将记忆变量m赋值给循环变量j,即j=m;
步骤2.3、从比特流中依次读取相应位比特数据步骤2.3.1、根据码长表中Table_len[j]的值,将变量val的值向左移Table_len[j]位后赋值给val,即val=val<<Table_len[j];步骤2.3.2、利用函数unpack()依次从左至右从比特流中读取出Table_len[j]位比特位,将读取获得的比特数据unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j]);其中,unpack(Table_len[j])函数表示从比特流中读取出Table_len[j]个比特位的数据;步骤2.3.3、利用变量bitCnt来记录从比特流中共提取出的比特位数,即bitCnt=bitCnt+Table_len[j];步骤2.4、判断val的值是否等于Table_val[j]的值,若相等,执行步骤2.5;若不相等,执行步骤2.6;步骤2.5、将循环变量j对应的映射索引Table_Index[j]作为解码信息返回,同时返回解码信息编码的位数bitCnt的值,结束解码过程;步骤2.6、将当前(j+1)的值赋值给循环变量i,即i=j+1;并判断i值是否小于哈夫曼码表中码的个数值Size,若i<Size,则执行步骤2.6.1,判断当前Table_Index[i]和bitCnt是否为解码获得的信息;若i>=Size,说明Size设置错误,退出解码过程,校对Size值;所述的判断当前Table_Index[i]和bitCnt是否为解码获得的信息的步骤具体包含以下步骤2.6.1、判断码长表Table_len[i]的值是否等于0,若Table_len[i]=0,执行步骤2.6.3;如果码长表Table_len[i]≠0,执行步骤2.6.2;步骤2.6.2、将循环变量i赋值给记忆变量m,即m=i,并判断当前i值是否小于哈夫曼码表中码的个数值Size,若j<Size,则返回循环执行步骤2.2,若j>=Size,则表示传输比特流出错,退出解码过程;步骤2.6.3、判断val的值是否等于码值表Table_val[i]的值;如果相等,执行步骤2.6.4;如果不相等,则对循环变量i的值加1,即i=i+1,并返回执行步骤2.6.1,继续判断哈夫曼映射表中下一个Table_Index[i]和bitCnt是否为解码获得的信息;步骤2.6.4、将循环变量i对应的映射索引Table_Index[i]作为解码信息返回,同时返回解码信息编码的位数bitCnt的值,结束解码过程。
以下通过一具体实施例,详细说明本发明方法的实施过程设原来的哈夫曼码表如下所示Table_val1[16]={1,0,7,26,1,110,24,222,2,446,108,894,25,1790,109,1791},其为原来的哈夫曼码值表;Table_len1[16]={1,3,4,6,3,8,6,9,3,10,8,11,6,12,8,12};其为原来的哈夫曼码长表;其中,哈夫曼码表中码的个数值Size=16。
采用步骤1介绍的方法来重新构成新的哈夫曼码表,即为根据步骤1.1,按照从小到大的顺序,得到Table_len2[16]=[1,3,3,3,4,6,6,6,8,8,8,9,10,11,12,12];根据步骤1.2,得到Table_Index[16]=[1,2,5,9,3,4,7,13,6,11,15,8,10,12,14,16];该表中的各个位置的映射码值分别表示Table_len1表中各个对应位置的码长值在Table_len2表中所处的位置排序号,例如,Table_Index表中的第3个映射码值为5,该码值5表示,在Table_len1表中的第3个码长值4,现在在Table_len2表中处于第5个位置;根据步骤1.3,得到Table_val[16]=[1,0,1,2,7,26,24,25,110,108,109,222,446,894,1790,1791];根据步骤1.4,得到Table_len[16]=[1,2,0,0,1,2,0,0,2,0,0,1,1,1,1,0];上述重新生成的码值表Table_val,码长表Table_len和映射表Table_Index组成新构成的哈夫曼码表。
接着需要得到二进制数“001”解码出的信息,采用本发明的方法,要解码出“001”对应的信息,根据步骤2所述的方法,具体过程为步骤2.1、设置m=0,val=0,bitCnt=0;步骤2.2、令j=m=0;步骤2.3、从比特流中依次读取出相应位比特位信息步骤2.3.1、由于j=0,则Table_len[j]=Table_len
=1,则val=val<<Table_len[j]=0<<1=0;
步骤2.3.2、利用函数unpack()依次从左至右从比特流中依次解码出Table_len[j]位比特位,将解码出的值unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j])=0+unpack(1)=0+0=0;其中,unpack(1)函数表示从“001”比特流中解码出第1个比特位的值,即unpack(1)=0;(第一次比特流提取)步骤2.3.3、利用变量bitCnt来记录从比特流中共提取出的比特位数,即bitCnt=bitCnt+Table_len[j]=0+1=1;步骤2.4、由于val=0,Table_val[j]=Table_val
=1,判断得到val的值不等于Table_val[j]的值(第一次进行逻辑判断),继续执行步骤2.6;步骤2.6、i=j+1=1;并判断得到i<Size(第二次进行逻辑判断),执行步骤2.6.1;步骤2.6.1、由于Table_len[i]=Table_len[1]=2,判断得到Table_len[i]的值不等于0(第三次进行逻辑判断),执行步骤2.6.2;步骤2.6.2、m=i=1;由于Size=16,j=0,判断得到j<Size(第四次进行逻辑判断),返回循环执行步骤2.2;步骤2.2、令j=m=1;步骤2.3、从比特流中依次读取出相应位比特位信息步骤2.3.1、由于j=1,则Table_len[j]=Table_len[1]=2,则val=val<<Table_len[j]=0<<2=0;步骤2.3.2、利用函数unpack()依次从左至右从比特流中依次解码出Table_len[j]位比特位,将解码出的值unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j])=0+unpack(2)=0+1=1;其中,unpack(2)函数表示从“001”比特流中解码出第2和第3这2个比特位的值,即unpack(2)=01=1;(第二次比特流提取)步骤2.3.3、利用变量bitCnt来记录从比特流中共提取出的比特位数,即bitCnt=bitCnt+Table_len[j]=1+2=3;步骤2.4、由于val=1,Table_val[j]=Table_val[1]=0,判断得到val的值不等于Table_val[j]的值(第五次进行逻辑判断),继续执行步骤2.6;步骤2.6、i=j+1=2;并判断得到i<Size(第六次进行逻辑判断),执行步骤2.6.1;
步骤2.6.1、由于Table_len[i]=Table_len[2]=0,判断得到Table_len[i]的值等于0(第七次进行逻辑判断),执行步骤2.6.3;步骤2.6.3、由于val=1,Table_val[i]=Table_val[2]=1,判断得到val的值等于Table_val[i]的值(第八次进行逻辑判断),执行步骤2.6.4;步骤2.6.4、返回解码信息Table_Index[i]=Table_Index[2]=5,并返回解码信息编码的位数bitCnt的值为3,结束解码过程。
由上述实施例可以得到,采用本发明的方法解码出“001”对应的信息,一共只需要进行8次逻辑判断和两次比特流提取。
而如果采用背景技术中所述二进制查表法,查找“001”解码出的信息,利用表Table和Len来得到“001”解码出的信息,共需要进行逻辑判断的次数为80,并需要三次比特流提取。
通过比较可以看出,采用本发明中所提出的算法来进行解码,相对于采用二进制查表法,只需要少于原来运算量的10%就可以获得同原来算法同样的解码效果,大大的减少了运算量。
权利要求
1.一种快速提取比特流哈夫曼解码方法,其特征在于,包含以下步骤步骤1、重新构造新的哈夫曼码表的码值表,索引表和码长表;步骤2、基于步骤1中所构造的新哈夫曼码表,快速从比特流中剥离出需要的位数来实现快速哈夫曼解码。
2.如权利要求1所述的快速提取比特流哈夫曼解码方法,其特征在于,所述的步骤1具体包含以下步骤步骤1.1、根据哈夫曼码表中原来的码长表Table_len1中的各个码长值的大小,按照顺序重新进行排序,将排序后获得的新码长表存储在表Table_len2中;步骤1.2、将从原来码长表映射到新码长表的映射关系存储到映射表Table_Index中;步骤1.3、按照表Table_Index中的映射关系,将哈夫曼码表中原来的码值表Table_val1对应映射到新的码值表Table_val中;步骤1.4、在码长表Table_len2的基础上,生成新的码长表Table_len;所述的码值表Table_val,码长表Table_len和映射表Table_Index组成重新构造后的新的哈夫曼码表。
3.如权利要求2所述的快速提取比特流哈夫曼解码方法,其特征在于,所述的步骤1.1中,根据哈夫曼码表中原来的码长表Table_len1中的各个码长值的大小,按照从小到大的顺序重新进行排序,得到Table_len2。
4.如权利要求2所述的快速提取比特流哈夫曼解码方法,其特征在于,所述的步骤1.1中,根据哈夫曼码表中原来的码长表Table_len1中的各个码长值的大小,按照从大到小的顺序重新进行排序,得到Table_len2。
5.如权利要求2所述的快速提取比特流哈夫曼解码方法,其特征在于,所述的步骤1.4具体包含以下步骤步骤1.4.1、用码长表Table_len2中的最后一个码长值减去排列在其前一个,即最后第二个的码长值,并将相减所得的结果覆盖存储在最后一个码长值所在的存储空间;步骤1.4.2、用码长表Table_len2中的最后第二个码长值减去排列在其前一个,即最后第三个的码长值,并将相减所得的结果覆盖存储在最后第二个码长值所在的存储空间;如此类推;步骤1.4.3、用码长表Table_len2中的第二个码长值减去排列在其前一个,即第一个的码长值,并将相减所得的结果覆盖存储在第二个码长值所在的存储空间;步骤1.4.4、由于码长表Table_len2中的第一个码长值前面没有数据,故码长表中的第1个码长值保持不变,由此生成新的码长表Table_len。
6.如权利要求1所述的快速提取比特流哈夫曼解码方法,其特征在于,所述的步骤2具体包含以下步骤步骤2.1、设置记忆变量m,val和bitCnt的初始值均为0;其中,bitCnt用来存储从比特流中提取的比特位数;m用来记录在码表中上一次搜索到的位置,val用来记录从比特流中提取bitCnt个比特位对应的值;步骤2.2、获取前一次在码长表中搜索到的位置将记忆变量m赋值给j,即j=m;步骤2.3、从比特流中依次读取相应位比特数据步骤2.4、判断val的值是否等于Table_val[j]的值,若相等,执行步骤2.5;若不相等,执行步骤2.6;步骤2.5、将循环变量j对应的映射索引Table_Index[j]作为解码信息返回,同时返回解码信息编码的位数bitCnt的值,结束解码过程;步骤2.6、依次循环判断当前Table_Index[j+1]和bitCnt是否为解码获得的信息。
7.如权利要求6所述的快速提取比特流哈夫曼解码方法,其特征在于,所述的步骤2.3具体包含以下步骤步骤2.3.1、根据码长表中Table_len[j]的值,将变量val的值向左移Table_len[j]位后赋值给val,即val=val<<Table_len[j];其中,j=0,1,……,Size-1,Size表示哈夫曼码表中码的个数值;步骤2.3.2、利用函数unpack()依次从左至右从比特流中解码出Table_len[j]位比特位,将解码出的值unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j]);其中,unpack(Table_len[j])函数表示从比特流中解码出Table_len[j]个比特位的值;步骤2.3.3、利用变量bitCnt来记录从比特流中共提取出的比特位数,即bitCnt=bitCnt+Table_len[j]。
8.如权利要求6所述的快速提取比特流哈夫曼解码方法,其特征在于,所述的步骤2.6具体包含以下步骤步骤2.6.1、判断码长表Table_len[j+1]的值是否等于0,若Table_len[j+1]=0,执行步骤2.6.3;若码长表Table_len[j+1]≠0,执行步骤2.6.2;其中,j+1=1,……,Size-1,Size表示哈夫曼码表中码的个数值;步骤2.6.2、记录在码长表中当前搜索到的位置将当前j+1的值赋值给记忆变量m,即m=j+1,然后循环返回执行步骤2.2;步骤2.6.3、判断val的值是否等于码值表Table_val[j+1]的值;如果相等,执行步骤2.6.4;如果不相等,则循环返回执行步骤2.6.1,判断哈夫曼映射表中下一个Table_Index[j+1]和bitCnt是否为解码获得的信息;步骤2.6.4、将当前j+1值对应的映射索引Table_Index[j+1]作为解码信息返回,同时返回解码信息编码的位数bitCnt的值,结束解码过程。
全文摘要
本发明涉及一种快速提取比特流哈夫曼解码方法,其包含步骤1.重新构造新的哈夫曼码表,将码表构造成基于码长呈规律性分布;步骤2.基于该重新构造的哈夫曼码表,快速地从比特流中剥离出需要的位数,从而实现对比特流解码。本发明提供的快速提取比特流哈夫曼解码方法,可大大减少由于从比特流中剥离比特位数而导致的大量运算,并可最终获得同原来相同的解码结果,大大提高运行效率。
文档编号H03M7/40GK101051845SQ20071004044
公开日2007年10月10日 申请日期2007年5月9日 优先权日2007年5月9日
发明者谭建国 申请人:上海广电(集团)有限公司中央研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1