CN108092670B - 编码方法和装置 - Google Patents
编码方法和装置 Download PDFInfo
- Publication number
- CN108092670B CN108092670B CN201711076208.1A CN201711076208A CN108092670B CN 108092670 B CN108092670 B CN 108092670B CN 201711076208 A CN201711076208 A CN 201711076208A CN 108092670 B CN108092670 B CN 108092670B
- Authority
- CN
- China
- Prior art keywords
- register group
- probability
- coded identification
- layer
- encoded
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- H—ELECTRICITY
- H03—ELECTRONIC CIRCUITRY
- H03M—CODING; DECODING; CODE CONVERSION IN GENERAL
- H03M7/00—Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
- H03M7/30—Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
- H03M7/40—Conversion to or from variable length codes, e.g. Shannon-Fano code, Huffman code, Morse code
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明公开了一种编码方法和装置。其中,该方法包括:根据待编码数据中编码符号出现的频次,对第一寄存器组进行分层,第一寄存器组存储有按预设顺序排列的编码符号的概率;根据第一寄存器组的分层结果对第二寄存器组分层;将第二寄存器组的第n层中的概率与第一寄存器组中第n层的概率由小至大两两相加,并将相加结果写入第二寄存器组的第n+1层,同时,对相加的概率对应的编码符号的编码长度加一;当待编码数据的所有编码符号的概率都上升至最顶层时,得到编码符号对应的编码长度;根据每个编码符号和每个编码符号对应的编码长度对待编码数据编码。本发明解决了现有技术哈夫曼编码计算编码长度时消耗的计算资源较多的技术问题。
Description
技术领域
本发明涉及编码领域,具体而言,涉及一种编码方法和装置。
背景技术
Huffman编码是一种最优的前缀编码技术,对于出现次数较多的符号使用较短的编码表示,对于出现次数较少的符号使用较长的编码表示。哈夫曼算法的性能十分优异,广泛应用于图像处理、云计算的海量数据处理中的压缩、解压缩,可以大幅度的降低数据的存储空间,提升数据传输的吞吐率。
传统的Huffman实现方式中,一般是基于软件平台的实现方式,编码过程是串行处理的过程,二叉树大量占用内存、码表过大、编解码速度慢。而在硬件实现过程中,字符的概率排序和二叉树的构建过程也非常耗时。
目前Huffman编码的方法主要有以下几种方式:
方案一:根据某种特定的应用场景,统计出一种普遍的字符概率,构建固定二叉树和Huffman码表。在编解码过程中省去了概率统计、二叉树构建的难点。
方案二:动态的Huffman编码,在硬件电路上实现统计字符概率长度和利用堆排序的方法构建二叉树的过程。
方案一的实现方案主要存在以下缺点:只能应用于特殊的场景中;压缩比不是最优的。因为利用普遍的字符出现的概率来代替一段固定的字符,所以固定码表的二叉树不是最优的;方案二的实现方案主要存在的缺陷是堆排序方法非常耗时。
针对现有技术哈夫曼编码计算编码长度时消耗的计算资源较多的问题,目前尚未提出有效的解决方案。
发明内容
本发明实施例提供了一种编码方法和装置,以至少解决现有技术哈夫曼编码计算编码长度时消耗的计算资源较多的技术问题。
根据本发明实施例的一个方面,提供了一种编码方法,包括:根据待编码数据中编码符号出现的频次,对第一寄存器组进行分层,第一寄存器组存储有按预设顺序排列的编码符号的概率;根据第一寄存器组的分层结果对第二寄存器组分层;将第二寄存器组的第n层中的概率与第一寄存器组中第n层的概率由小至大两两相加,并将相加结果写入第二寄存器组的第n+1层,同时,对相加的概率对应的编码符号的编码长度加一;当待编码数据的所有编码符号的概率都上升至最顶层时,得到编码符号对应的编码长度;根据每个编码符号和每个编码符号对应的编码长度对待编码数据编码。
进一步地,将第一寄存器组分为N层;确定N层中每层对应的频次范围,其中,第n层对应的频次范围为(2n-1,2n],1<n≤N。
进一步地,将第二寄存器组分为N层;根据第一寄存器组中第n-1层的频次范围和第二寄存器组种第n-1层的频次范围确定第二寄存器组中第n层对应的频次范围,其中,第二寄存器组的第一层不进行存储。
进一步地,将每个编码符号按照出现的频率依次写入第一寄存器组。
进一步地,将写入编码符号的概率的第三寄存器组进行分段,得到多个子区域,其中,每个子区域存储编码符号的第一标识和概率;分别提取每个子区域中的初始最小概率,写入第四寄存器组,并将第四寄存器组中的最小概率写入第一寄存器组,其中,第四寄存器组存储概率所属的子区域的第二标识和概率;将初始最小概率中的最小概率所属子区域中的当前最小概率写入第四寄存器组,并再次第四寄存器组中的最小概率写入第一寄存器组,直至每个编码符号的概率都写入第一寄存器组。
进一步地,从子区域中依次读取每个概率;将当前读取的概率与第五寄存器组中的每个概率进行比较,将比较结果中较大的概率占用比较结果中较小的概率是存储位置,并将比较结果中较小的概率向相邻高位移动,得到按照概率值排序的第五寄存器组;将第五寄存器组中的概率依次写回对应的子区域。
进一步地,在将相加结果写入第二寄存器组的第n+1层的同时,在第六寄存器组中查找与相加的两个概率的地址相同的地址栏,其中,第六寄存器组存储概率在第一寄存器组中的地址、概率在第二寄存器组的地址和概率对应的编码符号的编码长度;将该地址栏所对应的编码长度加一。
进一步地,根据每个编码符号和每个编码符号对应的编码长度构建编码表;根据编码表对待编码数据编码。
根据本发明实施例的另一方面,还提供了一种编码装置,包括:第一分层模块,用于根据待编码数据中编码符号出现的频次,对第一寄存器组进行分层,其中,每层对应不同的频次范围,第一寄存器组写入编码符号的概率;第二分层模块,用于根据第一寄存器组的分层结果对第二寄存器组分层;相加模块,用于将第二寄存器组的第n层中的频次与第一寄存器组中第n层的概率由小至大两两相加,并将相加结果写入第二寄存器组的第n+1层,同时,对每个频次对应的编码符号的编码长度加一;上升模块,用于当待编码数据的所有编码符号的频次都上升至最顶层时,得到编码符号对应的编码长度;编码模块,用于根据每个编码符号和每个编码符号对应的编码长度对待编码数据编码。
根据本发明实施例的另一方面,还提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述的编码方法。
根据本发明实施例的另一方面,还提供了一种处理器,处理器用于运行程序,其中,程序运行时执行上述的编码方法。
本申请上述实施例提出的编码方法,尤其是哈夫曼编码方法,设置两个寄存器组并对其进行分层,其中一个寄存器组按照编码符号出现的频次按顺序存储编码符号对应概率,另一个寄存器组存储上一层编码符号的相加结果,由于对数据进行了分层,每次运算只需要找到当前层的两个最小值进行相加,因此相较于现有技术的堆排序方案,能够节省较多的计算资源,进一步的,由于包括一个用于存储上一层概率的相加结果的寄存器组,因此只需在这两个的同一层中找到两个最小值,能够进一步的节省计算资源,解决了现有技术哈夫曼编码计算编码长度时消耗的计算资源较多的技术问题,提高计算编码长度的效率,进而提高编码效率。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的编码方法的流程图;
图2a是根据本申请实施例的通过第一寄存器组和第二寄存器组构建哈夫曼树的示意图;
图2b是根据本申请实施例的一种第三寄存器组分段的示意图;
图2c是根据本申请实施例的一种第四寄存器组的示意图;
图2d是根据本申请实施例的一种第六寄存器组的示意图;
图3是根据本申请实施例的一种可选的编码器的示意图;以及
图4是根据本申请实施例的编码装置的示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
实施例1
根据本发明实施例,提供了一种编码方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图1是根据本发明实施例的编码方法的流程图,如图1所示,该方法包括如下步骤:
步骤S102,根据待编码数据中编码符号出现的频次,对第一寄存器组进行分层,其中,每层对应不同的频次范围,所述第一寄存器组存储有按预设顺序排列的编码符号的概率。
在上述步骤中,第一寄存器组存储了排序后的编码符号出现的概率,对第一寄存器组进行分层,可以是确定分层的层数,再分别确定每层对应的频次范围,将属于层对应的频次范围的编码符号的概率划分至该层。
需要说明的是,需要确保在将第一寄存器组分为N层的情况下,存在能够表示编码符号中的最小频次的层。
在一种可选的实施例中,图2a是根据本申请实施例的通过第一寄存器组和第二寄存器组构建哈夫曼树的示意图,结合图2a所示,第一寄存器组203为Order_ram,Order_ram被分为M+1层,每层分别为Leaf_hier0、Leaf_hier1……Leaf_hierM。
步骤S104,根据第一寄存器组的分层结果对第二寄存器组分层,其中,第二寄存器组用于存储第一寄存器组中的概率的相加的结果。
在上述步骤中,对第一寄存器组进行分层后,能够得到第一寄存器组中,每层对应的频次范围,可以基于第一寄存器组的分层结果中,每层对应的频次范围,确定第二寄存器组中每层的频次范围,从而完成对第二寄存器组的分层。
值得注意的是,第二寄存器组的深度可以与待编码数据的编码符号的数量相同。
在一种可选的实施例中,结合图2a所示,第二寄存器组204为Sum_Hier_ram,Sum_Hier_ram被分为M+1层,每层分别为Sum_Hier0、Sum_Hier1……Sum_HierM(该示例中M=19)。
步骤S106,将第二寄存器组的第n层中的概率与第一寄存器组中第n层的概率由小至大两两相加,并将相加结果写入第二寄存器组的第n+1层,同时,对相加的概率对应的编码符号的编码长度加一。
在一种可选的实施例中,结合图2a所示,第二寄存器组202的第一层Sum_Hier0不存储概率,因此第一寄存器组201中第一层Leaf_hier0的概率由小至大两两相加,将相加结果存储至第二寄存器组202的第二层Sum_Hier1中。再将第一寄存器组201的第二层Leaf_hier1和第二寄存器组202中的第二层Sum_hier1中的概率由小至大两两相加,并将相加结果存储至第二寄存器组202的第三层Sum_Hier2中。
同时,在上述过程中,概率每被相加一次,该概率对应的编码符号的编码长度就会加一,从而在所有概率上升至最顶层时,能够得到每个编码符号的编码长度。
需要注意的是,当某一层中的概率的数量为单数时,直接将其上升至第二寄存器组的上一层。
步骤S108,当待编码数据的所有编码符号的概率都上升至最顶层时,得到编码符号对应的编码长度。
步骤S1010,根据每个编码符号和每个编码符号对应的编码长度对待编码数据编码。
需要注意的是,在哈夫曼编码过程中,需要构建哈弗曼树,通过哈夫曼树来确定编码符号的编码长度,确定编码长度的原则在于:出现概率较大的编码符号具有较短的编码长度,出现概率较少的编码符号具有较长的编码长度。因此需要对编码符号的概率进行排序,将较小的概率最为哈夫曼树的底层。在这一过程中,就出现了必要的比较运算。在现有技术的哈夫曼编码时,使用堆排序的方案找到最小值,尤其在编码数据量较大的情况下,比较的次数非常多,从而导致获取编码符号的编码长度的效率较低,浪费较多的计算资源的缺陷。
而本申请上述实施例提出的编码方法,尤其是哈夫曼编码方法,设置两个寄存器组并对其进行分层,其中一个寄存器组按照编码符号出现的频次按顺序存储编码符号对应概率,另一个寄存器组存储上一层编码符号的相加结果,由于对数据进行了分层,每次运算只需要找到当前程度两个最小概率进行相加,因此相较于现有技术的堆排序方案,能够节省较多的计算资源,进一步的,由于包括一个用于存储上一层概率的相加结果的寄存器组,因此只需在这两个的同一层中找到两个最小概率,能够进一步的节省计算资源,解决了现有技术哈夫曼编码计算编码长度时消耗的计算资源较多的技术问题,提高计算编码长度的效率,进而提高编码效率。
作为一种可选的实施例,根据待编码数据中编码符号出现的频次,对第一寄存器组分层进行分层,包括:
步骤S1021,将第一寄存器组分为N层。
步骤S1023,确定N层中每层对应的频次范围,其中,第n层对应的频次范围为(2n-1,2n],1<n≤N。
在一种可选的实施例中,第一寄存器组中已按概率的大小顺序存储了编码符号的概率值,获取每个概率对应的编码符号的频次,并确定每一层的频次范围,按照频次范围,将概率进行分层。
作为一种可选的实施例,根据第一寄存器组的分层结果对第二寄存器组分层,包括:
步骤S1041,将第二寄存器组分为N层。
具体的,由于第二寄存器组中的每一层用于存放第一存区域和第二寄存器组上一层概率的相加结果,因此第二寄存器组可以具有和第一寄存器组数量一样的层。
步骤S1041,根据第一寄存器组中第n-1层的频次范围和第二寄存器组种第n-1层的频次范围确定第二寄存器组中第n层对应的频次范围,其中,第二寄存器组的第一层不进行存储。
在一种可选的实施例中,可以通过如下公式确定第二寄存器组中每一层的频次范围:
sum_hier[n]=1/2(leaf_hier[n-1]+sum_hier[n-1])向上取整,其中,sum_hier[n]为第n层对应的频次范围的下限,n层对应的频次范围的上限由n+1层的下限确定。由于Sum_hier0层不存储概率,因此Sum_hier0=0。
作为一种可选的实施例,在根据待编码数据中编码符号出现的频次,对写入编码符号的第一寄存器组分层进行分层之前,上述方法还包括:
步骤S1012,将每个编码符号按照出现的频率依次写入第一寄存器组。
作为一种可选的实施例,将每个编码符号按照出现的频率依次写入第一寄存器组,包括:
步骤S10121,将写入编码符号对应的概率的第三寄存器组进行分段,得到多个子区域,其中,每个子区域存储编码符号的第一标识和概率。
具体的,编码符号可以用对应的第一标识表示。第三寄存器组的总深度与待编码数据的编码字符数量一致。分段可以是对第三寄存器组进行等分。
在一种可选的实施例中,图2b是根据本申请实施例的一种第三寄存器组分段的示意图,结合图2b所示,第三寄存器组201即为Leaf_ram,以待编码数据包括N个编码符号为例,建立一个总深度为N的leaf_ram存放概率统计结果,将leaf_ram中等比划分为深度为n的,m个子ram,划分规则为:保持N与m乘以n贴近,m的取值根据FPGA或者芯片工艺适当选择进行使m等于n,n等于2的幂次方。leaf_ram中数据有2部分组成,高位存储子ram的地址addr_s,即编码符号的第一标识,低位存储符号的概率p。
步骤S10123,分别提取每个子区域中的初始最小概率,写入第四寄存器组,并将第四寄存器组中的最小概率写入第一寄存器组,其中,第四寄存器组存储概率所属的子区域的第二标识和概率。
具体的,上述第四寄存器组的深度可以与每个子区域的深度相同。上述第二标识用于在步骤S10125中查找初始最小概率中的最小概率所属子区域。
在上述步骤中,将该最小概率写入第一寄存器组时,可以写入最高位或最低位,以使第一寄存器组中的概率能够由小至大或由大至小排列。
步骤S10125,将初始最小概率中的最小概率所属子区域中的当前最小概率写入第四寄存器组,并再次第四寄存器组中的最小概率写入第一寄存器组,直至每个编码符号的概率都写入第一寄存器组。
在上述步骤中,再将下一个概率写入第一寄存器组时,写入与上一个概率相邻的位置。
在一种可选的实施例中,图2c是根据本申请实施例的一种第四寄存器组的示意图,第四寄存器组22可以是sort ram。取leaf_ram中m个子ram中的最小概率,得到m个概率,将m个概率存储至sort ram中进行排序,sort ram中的高位记录概率每个概率在子ram块中的序列,即第二标识Addr_a,低位记录编码符对应的概率p。
再从sort ram中找到最小概率,写到第一寄存器组order ram的最高位或最低位,根据第二标识确定选中的最小概率来自于哪个leaf ram中的子ram,再从子ram中按顺序读取下一个最小概率到sort ram中,如此反复,直至leaf ram中的概率全部被读取并写入至order ram。此时,Order_ram中的值就是按概率从小到大或由大至小进行排序的。
由上述实施例可知,在将待编码数据的编码符号按照概率进行排序时,由于对用于存储编码符号的概率的寄存器组进行了分段,并将从分段的子区域中读取的概率与另一深度与子区域相同的寄存器组中的概率进行比较,从而在确定最小概率时,只需要将从子区域读取的概率与另一寄存器组中的概率进行比较,而无需与未写入第一寄存器组的所有概率进行比较,从而提升排序效率。
由此,上述方案通过对寄存器组进行分段,对分段得到的子区域中的概率进行并行或串行的排序,从而进一步的完成了所有编码符号的概率的排序。
作为一种可选的实施例,分别提取每个子区域中的初始最小概率,包括:将每个子区域中的概率进行排序,其中,将每个子区域中的概率进行排序,包括:
步骤S10123a,从子区域中依次读取每个概率。此处,每个子区域中的概率是随机存放的。
步骤S10123b,将当前读取的概率与第五寄存器组中的每个概率进行比较,将比较结果中较大的概率占用比较结果中较小的概率是存储位置,并将比较结果中较小的概率向相邻高位移动,得到按照概率值排序的第五寄存器组。
具体的,上述第五寄存器组可以是与第四寄存器组相同的寄存器组,即深度与子区域的深度相同的寄存器组。
在一种可选的实施例中,在初始情况下,第五寄存器组中没有概率,将子区域中的第一概率放入第五存储区中的最低位。从子区域中取出第二概率,将取出的第二概率与第五存储区中的第一概率相比较,由于当前第五寄存器组中只包括最低位存储的第一概率,在此次比较过程中,仅将第一概率与第二概率相比,如果第一概率小于第二概率,将第一概率移动至上一位置,并将第二概率占用第一概率的位置;如果第一概率大于第二概率,则直接将第二概率存放至与最低位相邻的位置。
然后从子区域中取出第三概率,将第三概率分别与第五存储区中的第一概率和第二概率相比,并按照比较结果确定第三概率在第五寄存器组中的位置。
重复上述步骤,直至将子区域中的所有概率都取出并存储至第五存储区中对应的位置,从而在第五存储区中形成了子区域中概率的正确排序。
步骤S10123c,将第五寄存器组中的概率依次写回对应的子区域。
经过步骤S10123b,第五寄存器组中的存储的概率已经是由大至小进行排序的结果,因此将第五寄存器组中的概率依次写回子区域,使得子区域中存储排序后的概率。
作为一种可选的实施例,对相加的概率对应的编码符号的编码长度加一,包括:
步骤S1061,在将相加结果写入第二寄存器组的第n+1层的同时,更新相加的两个概率在第六寄存器组中的第二寄存器组地址,并在第六寄存器组中查找与相加的两个概率的第一寄存器组地址相同的存储位置,其中,第六寄存器组存储概率在所述第一寄存器组中的地址、所述概率在所述第二寄存器组的地址和所述概率对应的编码符号的编码长度。
在一种可选的实施例中,图2d是根据本申请实施例的一种第六寄存器组的示意图,结合图2d所示,addr可以用于分别存储概率在第一寄存器组中的地址和概率在第二寄存器组中的地址,Code_len用于存储概率对应的编码符号的编码长度。
当第n层的两个概率通过相加,将相加结果写入n+1层时,通过查找第一寄存器组地址确定这两个概率,以确定为哪个编码符号的编码长度加一。
步骤S1063,将存储位置对应的编码长度加一。
存储位置对应的编码长度加一,即对编码符号的编码长度加一。
此处需要说明的是,对于概率的数量是单数的n层,最后剩余的一个概率会直接上升至第二寄存器组的n+1层,在未通过相加直接上升至第二寄存器组的上一层的概率,其对应的编码符号的编码长度不加一。
作为一种可选的实施例,根据每个编码符号和每个编码符号对应的编码长度对待编码数据编码,包括:
步骤S10101,根据每个编码符号和每个编码符号对应的编码长度构建编码表。
步骤S10103,根据编码表对待编码数据编码。
图3是根据本申请实施例的一种可选的编码器的示意图,下面,对图3所示的编码器进行描述。
字符概率统计、排序组件101:用于完成字符概率统计和对字符概率排序。
快速计算Huffman码长102:用于完成快速计算出每个符号的Huffman编码长度。
快速计算构建Huffman码表103:用于根据符号码长信息快速计算Huffman码表。
查表编码输出组件104:用于对输入数据通过查询Huffman码表,完成编码输出。
在图1所示的编码器的基础上,对本申请提出的哈夫曼编码方法进行描述。
在上述编码器中,对上述编码方法进行描述:
步骤一:对待编码数据进行编码符号的概率统计。
编码符号的数量为N,建立一个总深度为N的leaf_ram(如图2b所示)存放概率统计结果,将leaf_ram中等比划分为深度为n的,m个子ram,划分规则为:保持N等于m乘以n,m的取值根据FPGA或者芯片工艺适当选择进行使m等于n,n等于2的幂次方。leaf_ram中数据由两部分组成,高位存储子ram的地址addr_s,低位存储符号的概率p,leaf_ram中的地址序号就是字符的编号。
步骤二:对子ram中的概率的排序。
建立一个深度为n的sort_ram(如图2c所示)。将第一个ram块ram0逐个读入到sortram中,这个过程中完成ram0块中概率的大小排序。从ram0中读出的概率同时与sort ram中数据比较,如果sort ram中的概率大于从ram0中读出的概率,则将sort ram中的概率移到相邻的高地址里,并将从ram0中读出的概率写到空出来的地址,从而每从ram0中读出一个数据的同时再sort ram中完成从小到达的排序。完成后再将sort ram中的数据写回到ram0中,从而完成了了对ram0中概率的排序。对leaf_ram中的每个子ram按照上述步骤进行排序,即可完成子ram中的概率的排序。
步骤三:根据每个子ram中的概率的排序结果,对所有编码符号的概率进行排序。
建立一个深度为N的order ram(如图2a所示),用于存放排好序的符号概率值。将leaf_ram中m个子ram中的最小概率送到sort ram中进行排序,sort ram中的高位记录leafram中的子ram块的标识,低位存储编码符号的概率,高位的值就是leaf的原始序列。从sortram中按照步骤二的方法得到最小概率,写到order ram中;再从最小概率所属的子ram中按顺序读取下一个最小概率并写入sort ram中,如此反复完成完成所有概率的排序,最终得到的Order_ram就存储了由小到大的排列概率。
同时,还建立一个寄存器组序列code_length_ram(如图2d所示),其中的数据分两部分,一部分用于存储码长信息,另一部分存储符号序列对应的概率值再order ram和sum_hier_ram(如图2a所示)中的地址,在每次将sort ram中的最小概率写入order ram时,将最小概率在order ram中的地址写入code_length_ram中的addr。
步骤四:对order ram进行分层。
具体的,根据基本值出现的频次分层。第n层对应的频次范围为2^(n-1)<P≤2^n,n=0 1 2…N(第0层为1),N的取值保证能表示总频次的最小值。
步骤五:建立一个深度为N的sum_hier_ram(结合图2a所示),用于存放概率的相加值。对sum_hier_ram的分层是根据order_ram的分层情况进行的。Sum_hier0层为0,sum_hier[n]=1/2(leaf_hier[n-1]+sum_hier[n-1])向上取整。
步骤六:构建模拟二叉树,并计算Huffman码长。
从leaf_hier0的低地址开始,对order_ram中的概率由小至大进行两两相加,结果依次放到sum_hier_ram的hier1中,同时查找code_length_ram中地址addr项与order_ram的两个操作数地址相同的概率,并将查找到的概率的地址改成写到sum_hier_ram中的地址,相应的code_len项加1。
需要注意的是,Code_length_ram中addr数据中需要区分sum_hier_ram和orderram的地址。如果该层中的概率个数为奇数,对最后一个结果不进行相加操作直接进入sum_hier_ram的hier1层中,code_length项不进行加1操作。
在对Leaf_hier0层的概率操作完后,sum_hier1层中的数据就是从小到大的排列。依次取sum_hier_ram中hier1中的最小概率与order_ram中hier1的最小概率相比,通过两次比较即可确定sum_hier_ram中hier1和order_ram中hier1内用于进行下次相加的概率。例如:sum_hier_ram的hier1中的概率由大至小排序后倒数第一位和倒数第二位的两个概率为A和B(A≤B),order_ram的hier1中的概率由大至小排序后倒数第一位和倒数第二位的两个概率为C和D(C≤D),如果B≤C,则确定A和B为下次进行相加操作的操作数,如果D≤A,则确定C和D为下次进行相加操作的操作数,否则确定A和C为下次进行相加操作的操作数。
确定操作数后将两个操作数的相加结果存放到sum_hier_ram的hier2层中,并同时对code_length_ram进行相应的操作。依次进行到最后,即得到code_length的编码长度数据。
步骤七:Huffman表计算。得出Huffman编码长度信息后,根据范式Huffman的两个特性构建Huffman表,(1)相同码长的码子编码相差1,(2)长度为i第一个码字f(i)能从长度为i-1的最后一个码字得出,即:f(i)=2(f(i-1)+1)。;
步骤八:对输入数据通过查询Huffman码表,完成编码输出。
实施例2
根据本发明实施例,提供了一种编码装置的实施例,图4是根据本发明实施例的编码方法的流程图,如图4所示,该装置包括:
第一分层模块40,用于根据待编码数据中编码符号出现的频次,对第一寄存器组进行分层,其中,每层对应不同的频次范围,第一寄存器组写入编码符号的概率。
第二分层模块42,用于根据第一寄存器组的分层结果对第二寄存器组分层。
相加模块44,用于将第二寄存器组的第n层中的频次与第一寄存器组中第n层的概率由小至大两两相加,并将相加结果写入第二寄存器组的第n+1层,同时,对每个频次对应的编码符号的编码长度加一。
上升模块46,用于当待编码数据的所有编码符号的频次都上升至最顶层时,得到编码符号对应的编码长度。
编码模块48,用于根据每个编码符号和每个编码符号对应的编码长度对待编码数据编码。
实施例3
根据本发明实施例,提供了一种存储介质,存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行实施例1中所述的编码方法。
实施例4
根据本发明实施例,提供了一种处理器,其特征在于,所述处理器用于运行程序,其中,所述程序运行时执行实施例1中所述的编码方法。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读寄存器组(ROM,Read-Only Memory)、随机存取寄存器组(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (11)
1.一种编码方法,其特征在于,包括:
根据待编码数据中编码符号出现的频次,对第一寄存器组进行分层,其中,每层对应不同的频次范围,所述第一寄存器组存储有按预设顺序排列的所述编码符号的概率;
根据所述第一寄存器组的分层结果对第二寄存器组分层;
将所述第二寄存器组的第n层中的概率与所述第一寄存器组中第n层的概率由小至大两两相加,并将相加结果写入所述第二寄存器组的第n+1层,同时,对相加的概率对应的编码符号的编码长度加一;
当所述待编码数据的所有编码符号的概率都上升至最顶层时,得到编码符号对应的编码长度;
根据每个编码符号和所述每个编码符号对应的编码长度对所述待编码数据编码。
2.根据权利要求1所述的方法,其特征在于,根据所述待编码数据中编码符号出现的频次,对第一寄存器组分层进行分层,包括:
将所述第一寄存器组分为N层;
确定所述N层中每层对应的频次范围,其中,第n层对应的频次范围为(2n-1,2n],0<n≤N。
3.根据权利要求2所述的方法,其特征在于,根据所述第一寄存器组的分层结果对所述第二寄存器组分层,包括:
将所述第二寄存器组分为N层;
根据所述第一寄存器组中第n-1层的频次范围和所述第二寄存器组种第n-1层的频次范围确定所述第二寄存器组中第n层对应的频次范围,其中,所述第二寄存器组的第一层不进行存储。
4.根据权利要求1所述的方法,其特征在于,在根据所述待编码数据中编码符号出现的频次,对第一寄存器组进行分层之前,所述方法还包括:
将所述每个编码符号按照出现的频率依次写入所述第一寄存器组。
5.根据权利要求4所述的方法,其特征在于,将所述每个编码符号按照出现的频率依次写入所述第一寄存器组,包括:
将写入所述编码符号的概率的第三寄存器组进行分段,得到多个子区域,其中,每个子区域存储编码符号的第一标识和概率;
分别提取所述每个子区域中的初始最小概率,写入第四寄存器组,并将所述第四寄存器组中的最小概率写入所述第一寄存器组,其中,所述第四寄存器组存储概率所属的子区域的第二标识和概率;
将从所述第四寄存器组写入所述第一寄存器组的初始最小概率所属子区域中的当前最小概率写入所述第四寄存器组,并再次将所述第四寄存器组中的最小概率写入所述第一寄存器组,直至所述每个编码符号的概率都写入所述第一寄存器组。
6.根据权利要求5所述的方法,其特征在于,分别提取所述每个子区域中的初始最小概率,包括:将每个所述子区域中的概率进行排序,其中,将每个所述子区域中的概率进行排序,包括:
从所述子区域中依次读取每个概率;
将当前读取的概率与第五寄存器组中的每个概率进行比较,将比较结果中较大的概率占用所述比较结果中较小的概率的存储位置,并将所述比较结果中较小的概率向相邻高位移动,得到按照概率值排序的第五寄存器组;
将所述第五寄存器组中的概率依次写回对应的子区域。
7.根据权利要求1所述的方法,其特征在于,对相加的概率对应的编码符号的编码长度加一,包括:
在将相加结果写入所述第二寄存器组的第n+1层的同时,更新相加的两个概率在第六寄存器组中的第二寄存器组地址,并在所述第六寄存器组中查找与相加的两个概率的第一寄存器组地址相同的存储位置,其中,第六寄存器组存储概率在所述第一寄存器组中的地址、所述概率在所述第二寄存器组的地址和所述概率对应的编码符号的编码长度;
将所述存储位置对应的编码长度加一。
8.根据权利要求1所述的方法,其特征在于,根据所述每个编码符号和所述每个编码符号对应的编码长度对所述待编码数据编码,包括:
根据所述每个编码符号和所述每个编码符号对应的编码长度构建编码表;
根据所述编码表对所述待编码数据编码。
9.一种编码装置,其特征在于,包括:
第一分层模块,用于根据待编码数据中编码符号出现的频次,对第一寄存器组进行分层,其中,每层对应不同的频次范围,所述第一寄存器组写入所述编码符号的概率;
第二分层模块,用于根据所述第一寄存器组的分层结果对第二寄存器组分层;
相加模块,用于将所述第二寄存器组的第n层中的频次与所述第一寄存器组中第n层的概率由小至大两两相加,并将相加结果写入所述第二寄存器组的第n+1层,同时,对每个频次对应的编码符号的编码长度加一;
上升模块,用于当所述待编码数据的所有编码符号的频次都上升至最顶层时,得到编码符号对应的编码长度;
编码模块,用于根据每个编码符号和所述每个编码符号对应的编码长度对所述待编码数据编码。
10.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行权利要求1至8中任意一项所述的编码方法。
11.一种处理器,其特征在于,所述处理器用于运行程序,其中,所述程序运行时执行权利要求1至8中任意一项所述的编码方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711076208.1A CN108092670B (zh) | 2017-11-03 | 2017-11-03 | 编码方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711076208.1A CN108092670B (zh) | 2017-11-03 | 2017-11-03 | 编码方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108092670A CN108092670A (zh) | 2018-05-29 |
CN108092670B true CN108092670B (zh) | 2019-06-07 |
Family
ID=62172067
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711076208.1A Active CN108092670B (zh) | 2017-11-03 | 2017-11-03 | 编码方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108092670B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111786723A (zh) * | 2020-06-29 | 2020-10-16 | 安徽理工大学 | 矿工体征检测vlc系统用ppm编码产生装置 |
CN112332854A (zh) * | 2020-11-27 | 2021-02-05 | 平安普惠企业管理有限公司 | 霍夫曼编码的硬件实现方法、装置及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101198055A (zh) * | 2006-12-05 | 2008-06-11 | 华为技术有限公司 | 一种编码方法及编码器 |
CN101520771A (zh) * | 2009-03-27 | 2009-09-02 | 广东国笔科技股份有限公司 | 一种对词库压缩编码及解码的方法和系统 |
CN107294539A (zh) * | 2017-05-23 | 2017-10-24 | 浙江大学 | 一种准动态霍夫曼硬件编码器及编码方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6778107B2 (en) * | 2001-08-30 | 2004-08-17 | Intel Corporation | Method and apparatus for huffman decoding technique |
JP3807342B2 (ja) * | 2002-04-25 | 2006-08-09 | 三菱電機株式会社 | デジタル信号符号化装置、デジタル信号復号装置、デジタル信号算術符号化方法、およびデジタル信号算術復号方法 |
CN103248896A (zh) * | 2013-05-15 | 2013-08-14 | 中国科学院光电技术研究所 | Mq算术编码器 |
-
2017
- 2017-11-03 CN CN201711076208.1A patent/CN108092670B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101198055A (zh) * | 2006-12-05 | 2008-06-11 | 华为技术有限公司 | 一种编码方法及编码器 |
CN101520771A (zh) * | 2009-03-27 | 2009-09-02 | 广东国笔科技股份有限公司 | 一种对词库压缩编码及解码的方法和系统 |
CN107294539A (zh) * | 2017-05-23 | 2017-10-24 | 浙江大学 | 一种准动态霍夫曼硬件编码器及编码方法 |
Also Published As
Publication number | Publication date |
---|---|
CN108092670A (zh) | 2018-05-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106797446B (zh) | 基于存储器的历史搜索 | |
CN110533096B (zh) | 基于K-means聚类的多元宇宙算法的DNA存储编码优化方法 | |
CN104579360B (zh) | 一种数据处理的方法和设备 | |
CN104933747A (zh) | 将矢量动画转换为位图动画的方法及装置 | |
US7973680B2 (en) | Method and system for creating an in-memory physical dictionary for data compression | |
CN110928576A (zh) | 一种卷积神经网络的卷积处理方法、装置及存储介质 | |
CN112667860A (zh) | 一种子图匹配方法、装置、设备及存储介质 | |
CN110706015B (zh) | 一种面向广告点击率预测的特征选取方法 | |
CN107332567B (zh) | 编码方法和装置 | |
CN108092670B (zh) | 编码方法和装置 | |
Sklyarov et al. | Implementation in FPGA of address-based data sorting | |
CN110008192A (zh) | 一种数据文件压缩方法、装置、设备及可读存储介质 | |
CN110059129A (zh) | 数据存储方法、装置及电子设备 | |
CN104281664A (zh) | 分布式图计算系统数据切分方法和系统 | |
CN104636349A (zh) | 一种索引数据压缩以及索引数据搜索的方法和设备 | |
CN100476824C (zh) | 存储元素的方法与系统及查找元素的方法与系统 | |
CN110097581B (zh) | 基于点云配准icp算法构建k-d树的方法 | |
CN113934851A (zh) | 用于文本分类的数据增强方法、装置及电子设备 | |
CN116301656A (zh) | 基于日志结构合并树的数据存储方法、系统及设备 | |
CN110442489A (zh) | 数据处理的方法和存储介质 | |
CN105302889B (zh) | 数据存储结构的转换方法及装置 | |
CN107623524B (zh) | 一种基于硬件的Huffman编码方法及系统 | |
CN116010281A (zh) | 一种自动选取模糊器组合的集成模糊测试方法和系统 | |
CN110221778A (zh) | 酒店数据的处理方法、系统、存储介质以及电子设备 | |
CN111427857B (zh) | 一种基于分区参照技术的fpga配置文件压缩解压方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |