一种基于上下文的快速哈夫曼解码方法

文档序号:7510311阅读:238来源:国知局
专利名称:一种基于上下文的快速哈夫曼解码方法
技术领域
本发明涉及编解码技术领域,尤其涉及一种通过查表进行哈夫曼解码的方法。
背景技术
哈夫曼编码是一种变长的无损数据压缩方法,广泛应用于语音,音频,视频,文本和数据等多媒体压缩领域,在MPEG(Moving Picture ExpertsGroup)、AVS(数字视音频编解码技术标准化工作组)、AC(Audio Coding)系列和H.26x(ITU-T视频编码标准)等音视频编码标准中,哈夫曼编码广泛被采用。哈夫曼编码利用了信号源符号的概率分布来确定符号编码的信息量,对于出现概率高的符号,采用短的码字来描述;对于出现概率低的符号,采用长的码字来描述。通过变长编码来消除信息之间的冗余,来实现对信号无损压缩的目的。
目前常见的哈夫曼解码方法有线性搜索法、直接查表法、二进制搜索法和分步查表法。其中线性搜索法效率和二进制搜索法的效率较低,不适合实时性要求高的场合;直接查表法效率稍高,但是内存开销较大;分步查表法是二进制搜索法和直接查表法的折衷;但是效率还不是很高。
在哈夫曼查表过程中,可以根据前面的搜索结果来进行下面的搜索查表,得到解码的结果,来使每一次的运算都为最终的结果做出贡献,从而最大程度地减少计算的复杂度,同时减少缓冲区的开销,这就是本专利中所提出的基于上下文的快速码字搜索算法。

发明内容
本发明提出了一种基于上下文的快速哈夫曼解码方法,每次搜索都对最终的搜索结果做出实质的贡献,最大限度的减少了运算的复杂度。
为了达到上述目的,本发明提供了一种基于上下文的快速哈夫曼解码方法,包含以下步骤步骤1、哈夫曼码表的重新构造;步骤1.1、根据哈夫曼码表中码值的大小,按照从小到大的顺序进行排序,将排序后获得的新码值表存储在表Table_val中;步骤1.2、将从原来哈夫曼码值表映射到新码值表Table_val的映射关系存储到表Table_Index中;步骤1.3、按照表Table_Index中映射关系,将原哈夫曼码表中的码长表映射到表Table_len中;此时的表Table_val,Table_len和Table_Index就是步骤1构造成的新哈夫曼码表;步骤2、基于步骤1中所构造的新哈夫曼码表进行基于上下文的快速码字搜索方法步骤2.1、首先从比特流中取出1个比特位,并把读取的值赋值给val变量val=unpack(1);bitCnt=1;m=0;unpack(1)函数表示从码流中提取出一个比特位;bitCnt用来存储从比特流中提取的比特位数;m用来存储前一次在码表中搜索到的位置索引;val用来存储当前读取出bitCnt个比特位数后的值;步骤2.2、不断地从比特流中提取比特数赋值j=1;步骤2.3、若j<Maxbits,进行步骤2.4;其中,Maxbits是从码流中最大提取比特的位数;若j>=Maxbits,说明Maxbits设置错误,退出程序,校正Maxbits值;步骤2.4、查找val变量的当前值在哈夫曼码值表Table_val中的位置,该查找方法是基于上一次的查找结果m基础上的单调递增值,满足下面的关系Table_val[m-1]<val<=Table_val[m]m>0val<=Table_val
m=0]]>步骤2.4.1、对码值表中的值进行逐个取值;
步骤2.4.2、判断当前值val是否小于等于表Table_val中的一个值Table_val[i],其中,i<Size,Size表示码表的大小;若是,更新变量后进行步骤2.5,若否,返回步骤2.4.1继续取值;步骤2.6、变量赋值n=(m+Rg);k=m;其中,Rg表示的是哈夫曼码值表中具有相同码值最多的个数;步骤2.7、判断当前值val和所对应的比特数bitCnt是否是要解码步骤2.7.1、判断当前从码流中共读取的位数bitCnt是否等于Table_len[k],其中,k≤n,如果是,进行步骤2.7.2;如果否,进行步骤2.7.3;步骤2.7.2、Table_Index[k]和bitCnt即为解码得到的信息,结束运算;步骤2.7.3、将k的值加1k=k+1;步骤2.7.4、判断val的值是否不等于Table_val[k],如果是,进行步骤2.8。
步骤2.8、将val值向左平移1位,val=val<<1;从比特流中读取一位unpack(1),并将结果累加到val值上,val=val+unpack(1);所提取的比特数增加1,bitCnt=bitCnt+1;则j++,返回进行步骤2.3;本发明提出了一种基于上下文的快速哈夫曼解码方法,通过构造码表的结构,将码表构造成具有基于码值成规律性分布,然后利用构造后的码表来实现对比特流解码,在比特流解码过程中,采用基于上次的搜索结果作为本次搜索的起始位置,然后进行本次搜索来使码表中的每次搜索都对最终的搜索结果做出实质的贡献,来最大限度的减少运算的复杂度。


图1是本发明提供的一种基于上下文的快速哈夫曼解码方法中步骤2的步骤流程图。
具体实施例方式
以下根据图1,具体说明本发明的较佳实施方式如图1所示,本发明提供了一种基于上下文的快速哈夫曼解码方法,包含以下步骤
步骤1、哈夫曼码表的重新构造;步骤1.1、根据哈夫曼码表中码值的大小,按照从小到大的顺序进行排序,将排序后获得的新码值表存储在表Table_val中;步骤1.2、将从原来哈夫曼码值表映射到新码值表Table_val的映射关系存储到表Table_Index中;步骤1.3、按照表Table_Index中映射关系,将原哈夫曼码表中的码长表映射到表Table_len中;此时的表Table_val,Table_len和Table_Index就是步骤1构造成的新哈夫曼码表;步骤2、基于步骤1中所构造的新哈夫曼码表进行基于上下文的快速码字搜索方法步骤2.1、首先从比特流中取出1个比特位,并把读取的值赋值给val变量val=unpack(1);bitCnt=1;m=0;unpack(1)函数表示从码流中提取出一个比特位;bitCnt用来存储从比特流中提取的比特位数;m用来存储前一次在码表中搜索到的位置索引;val用来存储当前读取出bitCnt个比特位数后的值;步骤2.2、不断地从比特流中提取比特数赋值j=1;步骤2.3、若j<Maxbits,进行步骤2.4;其中,Maxbits是从码流中最大提取比特的位数;若j>=Maxbits,说明Maxbits设置错误,退出程序,校正Maxbits值;步骤2.4、查找val变量的当前值在哈夫曼码值表Table_val中的位置,该查找方法是基于上一次的查找结果m基础上的单调递增值,满足下面的关系Table_val[m-1]<val<=Table_val[m]m>0val<=Table_val
m=0]]>步骤2.4.1、赋值i=m;若i<Size,进行步骤2.4.2;Size表示码表的大小;若i>=Size,说明Size设置错误,退出程序,校正Size值;
步骤2.4.2、判断当前值val是否小于等于表Table_val中的一个值Table_val[i],若是,将索引i值存储到变量m中,并且跳出步骤2.4,进行步骤2.5;若否,则i++,返回步骤2.4.1;步骤2.5、判断当前值val是否等于Table_val[m],若是,进行步骤2.6,若否,进行步骤2.8;步骤2.6、变量赋值n=(m+Rg);k=m;其中,Rg表示的是哈夫曼码值表中具有相同码值最多的个数;步骤2.7、判断当前值val和所对应的比特数bitCnt是否是要解码步骤2.7.1、判断当前从码率中共读取的位数bitCnt是否等于Table_len[k],如果是,Table_Index[k]和bitCnt即为解码得到的信息,结束运算;如果否,进行步骤2.7.2;步骤2.7.2、将k的值加1;判断val的值是否不等于Table_val[k],如果是,进行步骤2.8,如果否,判断k的值是否小于等于n,若是,返回进行步骤2.7.1;若否,说明传输的码流出错,结束解码过程运算。
步骤2.8、将val值向左平移1位,val=val<<1;从比特流中读取一位unpack(1),并将结果累加到val值上,val=val+unpack(1);所提取的比特数增加1,bitCnt=bitCnt+1;则j++,返回进行步骤2.3。
以下根据一具体例子来说明本发明设原来的哈夫曼码表如下所示Table[16]={1,0,7,26,1,110,24,222,2,446,108,894,25,1790,109,1791};Len[16]={1,3,4,6,3,8,6,9,3,10,8,11,6,12,8,12};其中Table是码值表,Len是码长表。
根据本发明提供的一种基于上下文的快速哈夫曼解码方法,查找二进制数“001”解码出的信息,包含以下步骤步骤1、哈夫曼码表的重新构造;步骤1.1、根据哈夫曼码表Table中码值的大小,按照从小到大的顺序进行排序,得到Table_val[16]=
;步骤1.2、将从原来哈夫曼码值表Table映射到新码值表Table_val的映射关系存储到表Table_Index中Table_Idx[16]=[2,1,5,9,3,7,13,4,11,15,6,8,10,12,14,16];步骤1.3、按照表Table_Index中映射关系,将原哈夫曼码表中的码长表Len映射到表Table_len中Table_len[16]=[3,1,3,3,4,6,6,6,8,8,8,9,10,11,12,12];此时的表Table_val,Table_len和Table_Index就是步骤1构造成的新哈夫曼码表;步骤2、基于步骤1中所构造的新哈夫曼码表进行基于上下文的快速码字搜索方法步骤2.1、首先从比特流中取出1个比特位0,并把读取的值赋值给val变量val=unpack(1)=0;bitCnt=1;m=0;步骤2.2、j=1;步骤2.3、Maxbits=32;j<Maxbits,进行步骤2.4;步骤2.4、查找val变量的当前值在哈夫曼码值表Table_val中的位置;步骤2.4.1、赋值i=m=0;Size=16;i<Size,进行步骤2.4.2;步骤2.4.2、val=0;Table_val[i]=Table_val
=0;所以val小于等于Table_val[i],将索引i值存储到变量m中,即m=i=0;并且跳出步骤2.4,进行步骤2.5;步骤2.5、val=0;Table_val[m]=Table_val
=0;所以val等于Table_val[m];进行步骤2.6;步骤2.6、变量赋值n=(m+Rg);k=m;其中,Rg=2;
所以n=2;k=m=0;步骤2.7、判断当前值val和所对应的比特数bitCnt是否可以解码步骤2.7.1、bitCnt=1;Table_len[k]=Table_len
=3;所以bitCnt不等于Table_len[k];进行步骤2.7.2;步骤2.7.2、将k的值加1k=k+1=1;此时val=0;Table_val[k]=Table_val[1]=1;所以val不等于Table_val[k],跳出步骤2.7,进行步骤2.8;步骤2.8、将val值向左平移1位,val=val<<1=0;从比特流中读取一位unpack(1)值为0,并将结果累加到val值上,val=val+unpack(1)=0;所提取的比特数增加1,bitCnt=bitCnt+1=2;j++,返回进行步骤2.3;步骤2.3、此时j=2,Maxbits=32;j<Maxbits,进入步骤2.4进行第二次循环;步骤2.4、查找val变量的当前值在哈夫曼码值表Table_val中的位置;步骤2.4.1、此时i=m=0;Size=16;i<Size,进行第一次循环;步骤2.4.2、val=0;Table_val[i]=Table_val
=0;所以val小于等于Table_val[i];将索引i值存储到变量m中,即m=i=0;并且跳出步骤2.4,进行步骤2.5;步骤2.5、val=0;Table_val[m]=Table_val
=0;所以val等于Table_val[m];进行步骤2.6;步骤2.6、变量赋值n=(m+Rg);k=m;其中,Rg=2;所以n=2;k=m=0;步骤2.7、判断当前值val和所对应的比特数bitCnt是否可以解码步骤2.7.1、bitCnt=2;Table_len[k]=Table_len
=3;所以bitCnt不等于Table_len[k];进行步骤2.7.2;步骤2.7.3、将k的值加1k=k+1=1;此时val=0;Table_val[k]=Table_val[1]=1;所以val不等于Table_val[k],跳出步骤2.7,进行步骤2.8;步骤2.8、将val值向左平移1位,val=val<<1=0;从比特流中读取一位unpack(1)值为1,并将结果累加到val值上,val=val+unpack(1)=1;所提取的比特数增加1,bitCnt=bitCnt+1=3;j++,返回进行步骤2.3;步骤2.3、此时j=3,Maxbits=32;j<Maxbits,进入步骤2.4进行第三次循环;步骤2.4、查找val变量的当前值在哈夫曼码值表Table_val中的位置;步骤2.4.1、此时i=m=0;Size=16;i<Size,进行第一次循环;步骤2.4.2、val=1;Table_val[i]=Table_val
=0;所以val不小于等于Table_val[i];返回步骤2.4.2;步骤2.4.1、此时i=i+1=1;Size=16;i<Size,进行第二次循环;步骤2.4.2、val=1;Table_val[i]=Table_val[1]=1;所以val小于等于Table_val[i];将索引i值存储到变量m中,即m=i=1;并且跳出步骤2.4,进行步骤2.5;步骤2.5、val=1;Table_val[m]=Table_val[1]=1;所以val等于Table_val[m];进行步骤2.6;步骤2.6、变量赋值n=(m+Rg);k=m;其中,Rg=2;所以n=3;k=m=1;步骤2.7、判断当前值val和所对应的比特数bitCnt是否可以解码步骤2.7.1、bitCnt=3;Table_len[k]=Table_len[1]=1;所以bitCnt不等于Table_len[k];进行步骤2.7.2;步骤2.7.2、将k的值加1k=k+1=2;此时val=1;Table_val[k]=Table_val[2]=1;所以val等于Table_val[k],k=2,n=3;所以k<n,返回进行步骤2.7.1;步骤2.7.1、bitCnt=3;Table_len[k]=Table_len[2]=3;所以bitCnt等于Table_len[k];Table_Index[k]和bitCnt即为解码得到的信息,结束运算;如果采用原来的二进制查表法,查找二进制数“001”解码出的信息值,利用表Table和Len来得到“001”解码出的值,共需要进行逻辑判断的次数为80;现在采用本发明,要解出“001”对应的信息,得到相同的结果,共需要进行逻辑判断的次数为24次。
通过比较可以看出,采用本发明中所提出的方法来进行解码,相对于采用二进制查表法,只需要原来运算量的30%就可以获得同原来方法同样的解码效果。
权利要求
1.一种基于上下文的快速哈夫曼解码方法,其特征在于,包含以下步骤步骤1、哈夫曼码表的重新构造;步骤2、基于步骤1中所构造的新哈夫曼码表进行基于上下文的快速码字搜索方法。
2.如权利要求1所述的基于上下文的快速哈夫曼解码方法,其特征在于,所述的步骤1包含以下步骤步骤1.1、根据哈夫曼码表中码值的大小,按照顺序进行排序,将排序后获得的新码值表存储在表Table_val中;步骤1.2、将从原来哈夫曼码值表映射到新码值表Table_val的映射关系存储到表Table_Index中;步骤1.3、按照表Table_Index中映射关系,将原哈夫曼码表中的码长表映射到表Table_len中;此时的表Table_val,Table_len和Table_Index就是步骤1构造成的新哈夫曼码表。
3.如权利要求1所述的基于上下文的快速哈夫曼解码方法,其特征在于,所述的权利要求2包含以下步骤步骤2.1、首先从比特流中取出1个比特位,并把读取的值赋值给val变量val=unpack(1);bitCnt=1;m=0;unpack(1)函数表示从码流中提取出一个比特位;bitCnt用来存储从比特流中提取的比特位数;m用来存储前一次在码表中搜索到的位置索引;val用来存储当前读取出bitCnt个比特位数后的值;步骤2.2、不断地从比特流中提取比特数赋值j=1;步骤2.3、若j<Maxbits,进行步骤2.4;若j>=Maxbits,说明Maxbits设置错误,退出解码过程,校正Maxbits值。其中,Maxbits是从码流中最大提取比特的位数;步骤2.4、查找val变量的当前值在哈夫曼码值表Table_val中的位置,该查找方法是基于上一次的查找结果m基础上的单调递增值,满足下面的关系Table_val[m-1]<val<=Table_val[m]m>0val<=Table_val
m=0]]>步骤2.5、判断当前值val是否等于Table_val[m],若是,进行步骤2.6,若否,进行步骤2.8;步骤2.6、变量赋值n=(m+Rg);k=m;其中,Rg表示的是哈夫曼码值表中具有相同码值最多的个数;步骤2.7、判断当前值val和所对应的比特数bitCnt是否是要解码;步骤2.8、将val值向左平移1位,val=val<<1;从比特流中读取一位unpack(1),并将结果累加到val值上,val=val+unpack(1);所提取的比特数增加1,bitCnt=bitCnt+1;则j++,返回进行步骤2.3。
4.如权利要求3所述的基于上下文的快速哈夫曼解码方法,其特征在于,所述的步骤2.4包含以下步骤步骤2.4.1、对码值表中的值进行逐个取值;步骤2.4.2、判断当前值val是否小于等于表Table_val中的一个值Table_val[i],其中,i<Size,Size表示码表的大小;若是,更新变量后进行步骤2.5,若否,返回步骤2.4.1继续取值。
5.如权利要求3所述的基于上下文的快速哈夫曼解码方法,其特征在于,所述的步骤2.7包含以下步骤步骤2.7.1、判断当前从码流中共读取的位数bitCnt是否等于Table_len[k],其中,k≤n,如果是,Table_Index[k]和bitCnt即为解码得到的信息,结束运算;如果否,进行步骤2.7.2;步骤2.7.2、判断val的值是否不等于Table_val[k+1],如果是,进行步骤2.8。
6.如权利要求2所述的基于上下文的快速哈夫曼解码方法,其特征在于,所述的步骤1.1中,哈夫曼码表中码值按照从小到大、或者从大到小的顺序进行排序。
全文摘要
本发明提出了一种基于上下文的快速哈夫曼解码方法,通过构造码表的结构,将码表构造成基于码值成规律性分布,然后利用构造后的码表来实现对比特流解码,在比特流解码过程中,采用基于上次的搜索结果作为本次搜索的起始位置,然后进行本次搜索来使码表中的每次搜索都对最终的搜索结果做出实质的贡献,来最大限度的减少运算的复杂度。
文档编号H03M7/40GK101051846SQ20071004044
公开日2007年10月10日 申请日期2007年5月9日 优先权日2007年5月9日
发明者谭建国 申请人:上海广电(集团)有限公司中央研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1