CN112994703B - 硬件友好的数据解压缩 - Google Patents
硬件友好的数据解压缩 Download PDFInfo
- Publication number
- CN112994703B CN112994703B CN202110219951.8A CN202110219951A CN112994703B CN 112994703 B CN112994703 B CN 112994703B CN 202110219951 A CN202110219951 A CN 202110219951A CN 112994703 B CN112994703 B CN 112994703B
- Authority
- CN
- China
- Prior art keywords
- encoded data
- symbol
- bits
- state
- current
- 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
- 230000006837 decompression Effects 0.000 title description 20
- 238000000034 method Methods 0.000 claims abstract description 66
- 230000001186 cumulative effect Effects 0.000 claims description 42
- 230000006870 function Effects 0.000 claims description 24
- 238000007906 compression Methods 0.000 description 31
- 230000002829 reductive effect Effects 0.000 description 13
- 230000006835 compression Effects 0.000 description 12
- 238000009826 distribution Methods 0.000 description 12
- 238000013144 data compression Methods 0.000 description 4
- 238000003491 array Methods 0.000 description 2
- 238000010276 construction Methods 0.000 description 2
- 125000004122 cyclic group Chemical group 0.000 description 2
- 238000011084 recovery Methods 0.000 description 2
- 230000000717 retained effect Effects 0.000 description 2
- OKTJSMMVPCPJKN-UHFFFAOYSA-N Carbon Chemical compound [C] OKTJSMMVPCPJKN-UHFFFAOYSA-N 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000000903 blocking effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000000670 limiting effect Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000005192 partition Methods 0.000 description 1
- 230000002441 reversible effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
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/60—General implementation details not specific to a particular type of compression
- H03M7/6005—Decoder aspects
-
- 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/70—Type of the data to be coded, other than image and sound
-
- 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
-
- 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
- H03M7/4031—Fixed length to variable length coding
- H03M7/4037—Prefix coding
- H03M7/4043—Adaptive prefix coding
- H03M7/4062—Coding table adaptation
-
- 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/60—General implementation details not specific to a particular type of compression
- H03M7/6017—Methods or arrangements to increase the throughput
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/04—Protocols for data compression, e.g. ROHC
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
提供了用于压缩数据和解压缩压缩数据的系统、装置和方法。一种方法可以包括:接收要解压缩的编码数据,获得所述编码数据中符号总数的大小"Stotal”,所述编码数据中不同符号的出现次数以及在编码过程中生成的最终状态作为解码的第一个状态,建立包含对应于L个编码状态的所述不同符号的解码表,使用所述解码表对所述编码数据进行解码,包括:基于当前状态X从所述解码表中获取当前符号,动态地确定要从所述编码数据中恢复的当前位数和新状态X,并且输出从所述编码数据恢复的符号。
Description
技术领域
本公开涉及数据压缩,尤其涉及使用熵编码的无损压缩。
背景技术
数据压缩已广泛用于数字信号系统,例如通信和计算机系统。在信息论中,克劳德·香农(Claude Shannon)的信源编码定理(source coding theorem,或称为无噪声编码定理)确定了可能的数据压缩以及香农熵的运算含义的极限。根据香农的信源编码定理,符号的最佳代码长度为-logbP,其中b是用于制作输出代码的符号数,P是输入符号的概率。霍夫曼(Huffman)编码和算术(Arithmetic)编码是最常见的两种熵编码技术。自2014年以来,数据压缩器已开始使用熵编码技术的非对称数字系统(ANS)系列,该技术可结合算术编码的压缩率和类似于霍夫曼编码的运算成本。但是,这些现有的ANS实现是为通用计算系统开发的,该系统通常使用通用中央处理单元(CPU)来执行数据压缩或解压缩操作。因此,需要一种对硬件更友好的压缩技术,例如适用于现场可编程门阵列(FPGA)或专用集成电路(ASIC)的压缩技术。
发明内容
本公开提供了用于使用熵编码的无损压缩的系统和方法。在示例性实施例中,提供了一种方法,该方法可以包括:接收要解压缩的编码数据;获得所述编码数据中符号总数的大小"Stotal”,所述编码数据中不同符号的出现次数以及在编码过程中生成的最终状态作为解码的第一个状态;建立包含对应于L个编码状态的所述不同符号的解码表;使用所述解码表对所述编码数据进行解码,包括:基于当前状态X从所述解码表中获取当前符号,动态地确定要从所述编码数据中恢复的当前位数和新状态X;和输出从所述编码数据中恢复的符号。L可以等于所述不同符号的出现次数之和。
在另一个示例性实施例中,提供了一种解压缩器,其可以包括:解包器,被配置为接收要解压缩的编码数据并获得所述编码数据中符号总数的大小"Stotal”,所述编码数据中不同符号的出现次数以及在编码过程中生成的最终状态作为解码的第一个状态;解码表构建器,被配置为建立包含对应于L个编码状态的所述不同符号的解码表;解码表存储器,用于存储所述解码表;和解码器引擎,被配置为使用所述解码表对所述编码数据进行解码,包括:基于当前状态X从所述解码表中获取当前符号,动态地确定要从所述编码数据中恢复的当前位数和新状态X,并且输出从所述编码数据恢复的输出符号。L可以等于所述不同符号的出现次数之和。
附图简要说明
图1示意性地示出了根据本公开一实施例的压缩过程。
图2A示意性地示出了根据本公开一实施例的出现次数表。
图2B示意性地示出了根据本公开一实施例的累计出现表。
图2C示意性地示出了根据本公开一实施例的状态间隔和符号状态间隔。
图3示意性地示出了根据本公开一实施例的压缩器。
图4示意性地示出了根据本公开一实施例的解压缩过程。
图5A示意性地示出了根据本公开一实施例的解码表。
图5B示意性地示出了根据本公开另一实施例的解码表。
图6示出了根据本公开一实施例的解压缩器。
具体实施方式
现在将参考附图详细描述根据本申请的具体实施例。为了一致性,各个图中的相同元件由相同的附图标记表示。
图1示意性地示出了根据本公开一实施例的压缩过程100。在框102中,可以接收输入数据的块。在一个实施例中,存储系统控制器(例如,SSD控制器)可以接收要存储在存储系统中的数据流。在另一个实施例中,信号发送器可以接收要发送的数据流。可以使用熵编码来压缩数据流,以减少用于存储的空间或用于传输的带宽。因此,压缩过程100也可以称为编码过程。在一些实施例中,数据流可以被分成数据块,并且每个数据块可以被分别编码。块的示例性大小可以是1KB、2KB、4KB等。例如,压缩器的一个实施例可以被配置为对大小为4KB的块进行编码,并且具有大于4KB的大小的文件可以被划分为几个4KB块,并且其他剩余划分在小于4KB的剩余块中。并且数据块可以被分别编码。
在框104中,可以建立用于编码的表。在各种实施例中,输入数据块中的数据可以以不同的数据单元(例如,4位、8位、16位等)表示或组织。在一些实施例中,数据单元可以是2的幂数位,但在某些其他实施例中可能不是2的幂数位。例如,在一个实施例中,输入数据块中的数据可以由7位的美国信息交换标准码(ASCII)码表示。一个数据单元可以被称为一个符号,因此输入数据块可以包括许多符号。输入数据块中所有符号的总数可以表示为Stotal,可以是1024、2048或4096或一个个位数、两位数、百位数,千位数或更大的另一个数字。对于不同的输入流,Stotal可能会有所不同。有时,Stotal可以是固定的特定数字,例如2的幂。在另一些时候,Stotal可能不是固定的特定数字,也不一定是2的幂。
通常,数据块可以由一组不同的符号形成,每个符号出现一次或多次。在一些实施例中,可以针对输入数据块计算符号的概率分布,并且可以构建两个表来表示符号的概率分布,出现次数表和累计出现表。
在一个实施例中,可以扫描输入数据以建立一组不同符号,并且还可以计算不同符号的数量以及每个不同符号在输入数据块中出现多少次。在各种实施例中,符号可以具有预定义的大小,例如,1个字节、2个字节、4个字节等。该大小可以不是2的幂。如本文中所使用的,不同符号的集也可以被称为字母表(A),每个符号也可以被称为元素并且使用小写字母“s”来表示。小写字母“n”可用于表示字母表中不同符号(或元素)的数量,其中n是大于1的整数。应当注意,在一些实施例中,不同符号的集可以是预定义的,例如,预先编程的或由规范给出的。在这样的实施例中,可以扫描输入数据以仅计算不同符号的数量以及每个不同符号在输入数据块中出现多少次。
元素"s"的出现次数可以使用斜体小写字母"l”和下标s表示为"ls",并且块中所有符号的总出现次数可以表示为一个元素出现的概率可以通过将该元素出现的次数除以该块中所有符号的总出现次数来计算。也就是说,符号块中元素"s"的概率为ls/L。表示元素的实际出现次数的元素的出现次数可以称为"ls-actual”,并且可以例如通过对元素在输入数据块中出现的次数进行计数来获得。通过将所有不同符号的实际出现次数相加而获得的块中所有符号的总出现次数,可以称为所有符号的实际总出现次数或"Lactual”。符号块中的元素"s"的概率ls-actual/Lactual可以称为实际概率。应当注意的是,数字Lactual等于Stotal。
在各种实施例中,实际符号概率分布可以被处理为减量所有符号的总出现次数。该过程可以被称为L簡化(reduction)过程。例如,在获得(例如,通过计数)元素的出现次数"ls-actual”之后,可以通过将"ls-actual”除以预定数DIV,并将除法结果四舍五入为非零整数,可以减少实际的出现次数,以生成减量的出现次数"ls-reduced”。可以有不同的方法来获得非零整数。在一个实施例中,可以通过使用向上取整函数(例如,ceiling(ls-actual/DIV))将除法结果四舍五入到最接近的整数来获得非零整数。在另一个实施例中,可以通过使用下限函数(例如,floor(ls-actual/DIV))将除法结果四舍五入为最接近的整数来得到非零整数,并且如果下限函数的结果为零,可以将非零整数设置为1。即,如果ls-actual小于DIV,则非零整数可以是floor(ls-actual/DIV)+1。在又一个实施例中,可以通过将除法结果四舍五入为最接近的整数来获得非零整数(例如,如果提醒等于或大于0.5,则四舍五入增加;如果提醒小于0.5,则四舍五入舍去),如果四舍五入的结果为零,则将结果设置为1。
预定数DIV可以是大于1的任意数量,典型示例数可以是正整数,例如但不限于2、3或4等。可以使用相同的预定数来减少输入数据块中每个不同符号的出现次数。在还原每个不同符号的每个单独出现次数之后,所有符号的总出现次数也可以减少为减量的所有符号的总出现次数,这可以表示为"Lreduced”。应当注意的是,Lreduced可以接近于Lactual/DIV,但不一定相等。
作为一个例子,假设符号"α"在4096个符号的块中出现了五(5)次,而符号"β"在同一个块中出现了三(3)次。同一个块中可能还有其他符号,出现的总数为4088(4096-8)。符号"α"可以具有5的实际出现次数和5/4096的实际出现概率。符号"β"可以具有3的实际出现次数和3/4096的实际出现概率。在一个实施例中,上限函数可以用于获得减量的出现次数,示例DIV为4,对于符号"α",可以通过ceiling(ls-actual/DIV)获得"ls-reduced",其等于二(2),对于符号"β",可以通过ceiling(ls-actual/DIV)获得"ls-reduced",其等于(一)1。在另一实施例中,下限函数可用于获得减量的出现次数,仍然示例DIV为4,对于符号"α",可通过floor(ls-actual/DIV)获得"ls-reduced”,其等于一(1);对于符号"β",因为ls-actual小于DIV,所以可以通过floor(ls-actual/DIV)+1来获得"ls-reduced”,该值也等于一(1)。在两种情况下,在L簡化之后,减量的所有符号的总出现次数可以为Lreduced=它可以等于1024(4096/4),或接近1024但不等于1024(例如,大于或小于1024)。
在各种实施例中,用于压缩或解压缩的概率分布可以是实际概率分布或L簡化之后的概率分布,并且在两种情况下压缩都是无损的。应该注意的是,实施例可以获得具有实际概率分布的最佳压缩率。在L簡化之后使用概率分布可以提高速度并降低硬件成本(例如,存储空间),但可能会牺牲一点压缩率。因为根据本公开的压缩和解压缩技术可以使用实际概率分布或在L簡化之后的概率分布来实现,所以可以将术语"ls”用作元素"s"的出现次数的通用术语,它可以是元素"s"的实际出现次数,也可以是元素s减量的出现次数。并且,术语“L”可以用作数据块中所有符号的总出现次数的通用术语,其可以是数据块中所有符号的实际总出现次数或数据块中减量的所有符号的总出现次数。
L为8且具有三个元素的字母表的示例可用于示出根据一个实施例的压缩和解压缩操作。可以将三个元素字母表表示为{a,b,c},其中“a”,“b”,“c”代表三个不同的符号。在此示例中,假设元素“a”的出现次数为一(1),元素“b”的出现次数为五(5),元素“c”的出现次数为二(2),元素“a”的出现概率可以是1/8,元素“b”的出现概率可以是5/8,元素“c”的出现概率可以是2/8。在该示例中,字母“a”,“b”和“c”可用于表示任意三个不同的不同符号,而不必表示字母本身。应当注意,每个元素a,b或c可以具有预定义的大小,该大小在不同的实施例中可以是不同的,因为不同的实施例可以对元素使用不同的代码。例如,元素的预定义大小可以是ASCII中的7位,扩展ASCII中的8位或UTF-32中的32位。
图2A示意性地示出了根据本公开一个实施例的出现次数表202。出现次数表202可以是符号集的所有元素的出现次数表,并且可以被称为ls表。对于每个符号si(下标i从0到n-1),可以存储其出现次数为li。应当注意,在表202中示出了第一行元素用于说明。在一些实施例中,第二行中每个出现次数的位置可以对应于符号集中对应符号的位置,因此,表202可以仅需要第二行记录符号出现的次数。对于字母表为{a,b,c}且具有三个符号(n=3)的示例,出现次数表可以是下面的表1。在一个实施例中,可以在编码操作期间将字母表{a,b,c}分别存储在符号表中,并且可以将出现次数的列表{1、5、2}存储为表1的替代方案,其中出现次数的位置与字母表中的符号列表中的符号的位置相对应。
a | b | c |
1 | 5 | 2 |
表1简单示例中符号集{a,b,c}的出现次数
图2B示意性地示出了根据本公开的一个实施例的累计出现表204。累计出现表204可以是符号集的所有元素的累积出现表。元素的累积出现次数,可以称为bs,是字母表中该元素之前的所有元素出现的总和。换句话说,一个元素的累积出现是符号集中该元素之前的元素的出现总数。累积出现次数表204也可以称为bs表。对于符号s0,在第一个元素之前没有元素,因此符号s0的累积出现次数可以为零,存储在表204中。对于所有后续符号si(下标i从1到n-1),它们各自的累积出现次数可以是0+l0+…+li-1。
应当注意,在表204中示出了第一行元素用于说明。在一些实施例中,第二行中每个累积出现的位置可以对应于符号集中相应符号的位置,因此,表204可能仅需要第二行记录该符号的累积出现。对于具有三个符号(n=3)的字母表{a,b,c}的示例,累积出现表bs可以是下面的表2。在一个实施例中,可以在编码操作期间分别存储字母表{a,b,c},并且可以将累积出现的列表{0,1、6}存储为表2的替代,其中累积次数的位置对应于字母表中元素列表中元素位置的出现次数。
a | b | c |
0 | 1 | 6 |
表2简单示例中符号集{a,b,c}的累积次数
在一个实施例中,表202或表204中的任何一个都可以具有该行符号,但不能同时具有二者。
再次参考图1,在框106中,可以基于出现次数表和累计出现表来执行编码,并且在框108中,可以从压缩器输出编码的数据。在一个实施例中,编码可以生成数字序列,其中来自被处理的输入符号块的每个符号。数字序列中的每个数字可以表示一种状态,该状态可以基于该点处已处理的符号生成,并且序列中的下一个数字可以是当前状态和输入符号的函数。在一些实施例中,编码函数可以表示为C(x,s),其中x是当前状态,而s是输入符号(例如,要处理的下一个符号)。
应当注意,解码过程可以以相反的顺序对编码生成的状态进行处理。即,最后一个编码符号可以是被解码的第一个符号,并且解码过程可以从在压缩过程100期间生成的最后一个状态开始并且工作直到在压缩过程100期间生成的第一个状态。在一个实施例中,为了按照符号的输入块的顺序获得解码的符号,压缩过程100可以从输入块的最后一个符号开始并且向后工作直到输入块的第一个符号。在另一个实施例中,压缩过程100可以从输入块的第一个符号开始,并且向前工作直到输入块的最后一个符号,并且相应地,解码过程可以获取首先解码的输入块的最后一个符号和最后解码的输入块的第一个符号。
根据本公开的一个实施例可能需要选择L个不同的编码状态用于压缩。编码状态也可以称为编码的状态或状态。在一些实施例中,L个不同状态可以是在压缩过程100期间生成的L个不同数字的间隔。该间隔可以是数字序列的范围。在压缩过程100期间,当由编码函数C(x,s)生成的状态超过该范围时,可以将生成的状态的一些位转移到输出流(或输出缓冲器),使得生成的状态的剩余部分可以落入间隔。在一些实施例中,可以将生成的状态右移以减小生成的状态的值,并且可以将移位后的位传送到输出流(或输出缓冲器)。在各个实施例中,状态的间隔可以具有L的范围,例如,M到M+L-1,其中M可以是状态范围的基值,并且可以是等于或大于零的整数。图2C示意性地示出了根据本公开一实施例的状态间隔和符号状态间隔。图2C所示的表可以是{a,b,c}的简单示例的编码状态表,其分布为{1/8、5/8、2/8}。第一行可以是可以在编码过程中生成的状态。第二行可以是进行编码的符号“a”的出现次数,第三行可以是用于进行编码的符号“b”的出现次数,第四行可以是进行编码的符号“c”的出现次数。框206可以是3至10个选择作为L个不同的状态(例如,对于状态范围,基值M为3)。在框206中,符号“a”可以具有1到1的出现次数范围(例如,状态间隔为1到1),符号“b”可以具有2到4和5到6的出现次数范围(例如,状态间隔为2到6),并且符号“c”可以具有0到1的出现次数范围(例如,状态间隔为0到1)。
在至少一个实施例中,状态的范围可以选择为L至2*L-1,其中“L”是所有符号的出现之和,“*”表示乘法。在这样的实施例中,状态范围的基值M可以等于L。每个符号"s"也可以具有ls至2*ls-1的符号状态间隔Ints。框208可以是这样的选择,其中状态间隔为8至15(M为8,L也为8)。在框208中,符号"a"可以具有1至1的出现次数范围(例如,状态间隔为1至1,其中ls为1),符号"b"可以具有5至9的出现次数范围(例如,状态间隔为5到9,其中ls为5),并且符号"c"可以具有2到3的出现次数范围(例如,状态间隔为2到3,其中ls为2)。
在一些实施例中,在M被选择为等于“L”的情况下,在框106中的编码可以开始于将状态“x”初始化为初始值“L”,然后可以执行编码,使得对于输入数据块中的每个符号,基于出现次数表和累积出现表,可以在运行时动态获得用于右移用于编码当前符号的当前状态“x”的移位数和下一状态“x”。例如,在一个实施例中,框106中的编码可以为输入块的每个符号执行循环。循环可以作用于从输入块的最后一个符号到第一个符号的符号。在循环内部,"x"的值可能会右移,直到x的左边(可以称为xtmp)可以落入当前符号的符号状态间隔中。移位数可以被称为nBits。通过对当前符号进行编码而生成的下一个状态值可以通过将当前符号的累积出现次数加到xtmp,然后减去当前符号的出现次数并加上M来确定。也就是,新的"x”等于bs+xtmp-ls+M。在框108中,可以将向右移位的nBits个位输出到编码的数据。
在一个实施例中,在框106和108中的编码和输出操作可以如下用伪码表示,其中“lg()”是二进制对数函数,“>>”是右移运算符,“∈”是属于运算符:
Initial x=M,R=lg(L);
对于要编码的符号块的最后一个字符到第一个字符
在压缩过程100的结尾,编码结果可以包括编码数据和最终状态x。最终状态x可以是通过对输入中的最后一个符号减去M进行编码而生成的新状态x。可以在框108中输出编码结果。
可以使用简单示例符号集{a,b,c}来解释框106和框108,其中“L”为8,出现次数为{1、5、2},累积出现次数为{0、1、6}。为了编码字符串“bac”,在从最后一个符号开始并且直到第一个符号的实施例中,可以首先对字母“c”进行编码。初始值“x”可以初始化为8。字母“c”可能具有6的累积出现次数和2的出现次数。“c”的符号状态间隔可以是2到3(例如,2*2-1)。初始x值8可以二进制表示为b1000,因此可能需要右移两次以使值xtmp变为b10(例如,十进制数2),以落入2到3的间隔。新状态“x”可以变为6+2-2+8,可以等于14。右移的两位b00可以被放入编码数据中。
在状态“x”现在为14的情况下,可以对下一个字母“a”进行编码。字母“a”的累积出现次数为0,出现次数为1。“a”的符号状态间隔可以是1到1(例如,2*1-1)。数字14可以二进制表示为b1110,因此可能需要右移3次才能使值xtmp变为b1,使其落入1到1的间隔。新状态“x”可以变为0+1-1+8,可以等于8。右移的三位b110可以被放入编码数据中。
在状态“x”现在为8的情况下,可以对下一个字母“b”进行编码。字母“b”的累积出现次数为1,出现次数为5。“b”的符号状态间隔可以是5到9(例如,2*5-1)。数字8可以二进制表示为b1000,并且它可以不需要移位(零移位)即可使值xtmp落入5到9的间隔。新状态“x”可以变为1+8-5+8,可以等于12。由于“b”可以是要编码的最后一个符号,因此在对“b”进行编码之后,不能在编码数据中放入任何位,并且可以通过从最后生成的新状态“x”减去L来获得最终状态x(例如,12-8)。因此,在一个实施例中,从压缩器输出的编码结果可以是编码数据b11000和最终状态x 4。
应当注意,对于可以将被右移的位放入编码数据中的顺序没有限制。即,压缩器可以被配置为将被右移的位以不同的顺序放入编码的数据中,只要可以保留顺序信息,使得解压缩器可以稍后获得该信息以用于解码。例如,编码“a”产生的三位b110被移出并作为b110或b011放入编码数据中,并且顺序信息可以被保存以供解压缩器获得并用于解码。
此外,与在连续编码操作循环中生成的连续符号相对应的位集也可以以任何顺序被级联,只要可以保持级联顺序信息,使得解压缩器可以稍后获得该级联信息用于解码。例如,通过将第一个元素“c”编码而生成的b00和通过将第二个元素“b”编码而生成的b110可以由b011+b00连接为b01100,或者由b00+b011连接为b00011,并且可以将级联顺序信息保留为解压缩器获取以用于解码。在至少一个实施例中,位顺序、级联顺序或两者可以是预定义的(例如,在规范中指定),并且压缩器和解压缩器可以遵循预定的顺序,因此,在该实施例中,由于解压缩器可以通过使用预定顺序正确解码,因此位顺序、级联顺序或者两者可以不需要保留并传递给解压缩器。
因为压缩过程100可以包括具有循环索引的循环,对于每个符号,循环索引从0开始逐步增加到lg(L),与没有L簡化的压缩过程100的实施例相比,具有L簡化(较小的L)的压缩过程100的实施例可以花费更少的时间来完成。
根据本公开的压缩器实施例可以对硬件实现是友好地。出现次数表可能需要n个条目(其中,n是字母表的不同符号的数量),累计出现表也可能需要n个条目。条目大小可以是lg(L)位,以便这两个表所需的存储器可以是2*n*lg(L),其中“*”可以是乘法运算符,"lg()"可以是二进制对数函数。具有L簡化的实施例也可以比没有L簡化的实施例更加硬件友好,因为这些表可以以较少的条目大小占用更少的空间(L较小,因此lg(L)较小)。在符号的位长可以等于lg(L)的实施例中,字母表可以与表202或204一起存储。在符号的位长不等于Ig(L)的实施例中,字母表可以存储在单独的列表中,并且表202和204可以仅需要相应表中的第二行。应当注意,根据本公开的编码技术不需要任何包含所生成的状态的编码表,其中每个状态都伴随有对应的符号(用该符号编码的先前状态来生成状态)。因此,根据本公开的压缩器实施例可以需要很少的存储空间,并且可以易于在现场可编程门阵列(FPGA)或专用集成电路(ASIC)等中实现。
图3示意性地示出了根据本公开的一个实施例的压缩器300。压缩器300可以被配置为实施压缩过程100。压缩器300可以包括输入接口302、输入缓冲器304、计算器306、表缓冲器308、编码器引擎310和输出缓冲器312。输入接口302可以耦合到外部总线,并且被配置为执行框102以接收要被编码的数据。所接收的数据可以具有一个副本存储在输入缓冲器304中,并且另一副本发送至计算器306。计算器306可以被配置为执行框104,该框104包括:如果没有给出字母表,则扫描输入数据以构建字母表;确定字母表中每个符号的出现次数;以及计算累积出现。表缓冲器308可以存储由计算器306生成的表,该表可以包括出现次数表202和累积出现表204。
在一些实施例中,可以按顺序表示字母表中的符号,例如,扩展的ASCII码是与256个字符相对应的256个连续数字的列表,小写英文字符是从“a”到“z”的26个字母。在这样的实施例中,可以在不扫描输入数据的情况下获得字母表,并且可以不需要存储字母表,因为编码器和解码器都可以获取这种信息(例如,编码或解码规范可以提供字母表),并且表202和表204的每个条目的地址或索引可以指示对应的符号。例如,如果字母表是扩展的ASCII,则第一个符号可以是“null”,并且表202中的第一个条目可以对应于符号“null”的出现次数,并且表204中的第一个条目可以对应于符号“null”的累积出现。在另一示例中,如果字母表是小写英文字母,则第一个符号可以是“a”,并且表202中的第一个条目可以对应于符号“a”的出现次数,并且表204中的第一个条目可以对应于符号“a”的累积出现。
在一些其他实施例中,可以通过扫描输入数据来构建字母表,并且在扫描之前输入数据中的不同符号可能是未知的。在这样的实施例中,可以在运行时构建字母表,并且在一个实施例中,可以将其存储在表缓冲器308中的单独的表或列表中。在另一个实施例中,可以在运行时构建字母表,但是符号列表可以是表缓冲器308中的表202或表204中的一行,因此不需要单独的字母表或列表。
编码器引擎310可以被配置为使用表缓冲器308中的表和输入缓冲器304中的数据执行框106中的编码操作。可以将编码的数据放入用于框108操作的输出缓冲器312中。在一些实施例中,字母表和出现次数也可以放入输出缓冲器312中。此外,在一些实施例中,还可以输出(例如,到输出流或到输出缓冲器)用于编码数据的位顺序和级联顺序信息。
图4示意性地示出了根据本公开的一个实施例的解压缩过程400。在一个或多个实施例中,解压缩过程也可以被称为解码过程。在框402中,可以接收编码的数据的块。在各种实施例中,编码的数据的块可以通过对一个符号块进行编码来生成。应该注意的是,由于字母表,符号的概率分布或输入数据在输入数据块中的位置可能不同,一个输入数据(例如,短语、句子、段落、页面、图片或图片的一部分等)可以被编码以生成不同的编码数据块。
在框404中,可以获得与编码的数据相关联的元数据。在根据本公开的实施例中,编码的数据块可以具有关联的元数据。例如,解压缩器可能需要知道原始数据块Stotal的大小,从字母表、符号的出现次数或概率分布中可以生成编码的数据块,以及在编码过程中生成最终状态。在一个实施例中,可以由解码器引擎获得编码数据中的符号的Stota,不同符号的出现次数以及在编码过程中生成的最终状态。应该注意的是,所有符号的总出现次数(无论是否为减量的L)都可以是从出现次数获得的信息的一部分,例如,通过将所有不同符号的出现次数相加而得出。而且,在一些实施例中,位顺序和/或级联顺序也可以被包括在要从压缩器传递到解压缩器的元数据中。元数据可以以多种方式获得。例如,元数据可以与编码数据一起存储或发送,或者元数据可以与编码数据分开存储或发送,但是具有标识信息以将元数据与特定的编码数据相关联。
在框406中,可以生成解码表。图5A示意性地示出了根据本公开的一个实施例的解码表502。解码表502可以示出为四行。第一行可以是用于编码的L个不同的状态。在一些实施例中,L个不同状态可以是M至M+L-1范围的L个不同值,其中M是该范围的基值。在图5A所示的实施例中,状态范围可以是零至L-1,M为零。第二行可以是与状态相对应的符号,并且可以被表示为具有从零到L-1的索引i的Symbol[i]表示。第三行可以是要从与状态相对应的编码数据中恢复的位数,并且可以被表示为具有从零到L-1的索引i的nBits[i]表示。并且第四行可以是从编码数据中解码出该列中的符号之后的新状态,并且可以被表示为具有从零到L-1的索引i的newX[i]。应当注意,第一行中的值可以与其他行的基于零的索引匹配,因此,在至少一个实施例中,第一行不需要保留在表中。
在一些实施例中,表502可以被构造成具有两个循环:用于遍历字母表的所有元素的外循环和用于遍历每个元素的所有出现次数的内循环。解码表的建立过程可以从将状态X初始化为初始值零(0)并将R初始化为lg(L)开始,然后执行具有对应于字母表中每个元素位置的循环索引的外循环。在一个实施例中,索引可以是基于零(从零开始),因此字母表中的第一个元素的索引可以为零,字母表中的第二个元素的索引可以为一,依此类推。在外循环内部,可以将Ls的初始值(带有大写字母L和下标s)设置为当前元素的出现次数,以使Ls=ls。内循环可以从1开始,直到1s。在内循环内部,可以将当前解码符号设置为当前元素(例如,当前解码符号=当前元素),可以将要从编码数据中恢复的当前位数设置为R减去floor(lg(Ls))(例如,nBits=R-floor(lg(Ls))),新状态X可以设置为Ls,左移当前要恢复的位数减去L(例如,newX=(Ls<<nBits)–L),其中<<可以是左移运算符。当前解码的符号、当前要恢复的位数和新状态可以存储在解码表中用于与状态X对应的条目。然后对于下一次内循环迭代,状态X可以加1,并且Ls也可以增加1。一旦针对一个元素的所有出现次数的内循环迭代完成,则外循环可进行到字母表中的下一个元素。
在一实施例中,可以用如下伪码来表示在框406中构建解码表502的操作:
对于具有三个符号(n=3)的字母表{a,b,c}的示例,解码表502可以是下面的表3。应当注意,第一行可以对应于从零开始的索引(对于范围M至M+8-1,基本值M为零)。因此,第一行可以仅出于说明目的而示出,并且不需要被存储在解码表的实施例中。
X | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Symbol[X] | a | b | b | b | b | b | c | c |
nBits[X] | 3 | 1 | 1 | 1 | 0 | 0 | 2 | 2 |
newX[X] | 0 | 2 | 4 | 6 | 0 | 1 | 0 | 4 |
表3简单示例中的用于符号集{a,b,c}的第一示例性解码表
在一些实施例中,当L不是2的幂时,方程nBits=R–floor(lg(Ls))不再正确。即,当L是2的幂时,可以使用由等式nBits=R-floor(lg(Ls))构建的解码表502。当L不是2的幂时,在构建解码表502时,可以以与当L是2的幂时相同的方式获得R的符号行,但是可以通过不同的方法来填充nBits和newX行。在一个实施例中,当L不是2的幂时,在构建解码表502时,可以将R设置为ceiling(lg(L)),并且可以通过执行从0到R的索引"j”循环的操作获得n_Bits(替代nBits),并且可以将数字new_State(替代新状态newX)设置为当前Ls。在循环内部,可以通过将初始Ls左移循环索引号j,并将获得的左移值加2的j次幂,然后从获得的值中减去1,以获得称为Ls_tmp的临时Ls。也就是说,Ls_tmp=(Ls<<j)+(2^j-1),其中<<是左移位运算符,^是幂运算符。在一个实施例中,在硬件实现中,可以通过将Ls向左移位j位并以最低有效位(LSB)插入j位1来执行针对(Ls<<j)+(2^j-1)的运算。可以通过每次将循环索引从零递增到R直到Ls_tmp落入间隔{L,…,2L-1)中来获得Ls_tmp。然后,可以将n_Bits设置为“j”(并且代替nBits保存到表502中)并且可以停止循环。
应当注意,要从编码数据中恢复的位数可以是n_Bits或n_Bits+1,但是只有j和j+1中较小的一个可以记录在解码表502中。即,尽管在L不是2的幂的情况下可以将n_Bits数保存为nBits数的替代,但是n_Bits数不一定是要从编码数据中恢复的实际位数,其可以在当执行基于解码表502的解码操作时动态地确定。
在一个实施例中,在框406中为L不是2的幂的构建解码表502的操作可以采用如下伪码表示:
图5B示意性地示出了根据本公开的另一个实施例的解码表504。解码表504可以示出为两行。第一行可以是用于编码的L个不同的状态。在一些实施例中,L个不同状态可以是M至M+L-1范围的L个不同值,其中M是该范围的基值。在图5B所示的实施例中,状态范围可以是从零到L-1,M是零。第二行可以是与状态相对应的符号,并且可以表示为具有从零到L-1的索引i的Symbol[i]。应当注意,第一行中的值可以与其他行的基于零的索引匹配,因此,在至少一个实施例中可以省略第一行。此外,在实现解码表504的实施例中,可以从运行时计算当前要从编码数据恢复的位数nBits和新状态X newX。因此,与实现解码表502的实施例相比,可以减少存储空间,因此,与构建解码表504的实施例相比,解压缩器在集成电路(IC)芯片中可以需要较小的面积。
在一些实施例中,表504可以被构造成具有两个循环:用于遍历字母表的所有元素的外循环和用于遍历每个元素的所有出现次数的内循环。解码表构建过程可以开始于将状态“X”初始化为初始值零(0),然后使用与索引中的每个元素的位置相对应的循环索引执行外循环。在一个实施例中,索引可以是基于零(从零开始),因此字母表中的第一个元素的索引可以为零,字母表中的第二个元素的索引可以为一,依此类推。内循环可以从1开始,直到1s。在内循环内部,可以将当前解码符号设置为当前元素(例如,当前解码符号=当前元素)。当前解码的符号可以被存储到解码表504中用于与状态X相对应的条目。然后对于下一次内循环迭代,状态X可以被增加1。一旦针对一个元素的所有出现次数的内循环迭代完成,则外循环可进行到字母表中的下一个元素。
在一实施例中,可以如下用伪码来表示在框406中构建解码表504的操作:
对于具有三个符号(n=3)的字母表{a,b,c}的示例,解码表504可以是下面的表4。应当注意,第一行可以对应于从零开始的索引(对于范围M至M+8-1,基本值M为零)。因此,第一行可以仅出于说明目的而示出,并且不需要被存储在解码表的实施例中。
X | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Symbol[X] | a | b | b | b | b | b | c | c |
表4简单示例中的用于符号集{a,b,c}的第二示例性解码表
在框408中,可以执行基于解码表的解码。编码数据中的最终状态可以成为解压缩过程400中的第一个状态,以被解码以获得第一个恢复的符号。在生成解码表502的实施例中,最终状态可以与解码表502的索引匹配,与索引相对应的符号可以是第一个恢复的符号。当L是2的幂时,还可以从解码表502直接获得要从编码数据恢复的位数(例如,nBits)。可以通过将解码表502中的对应的新状态newX与要从编码数据中恢复的位数表示的恢复值相加来获得下一状态X。利用下一个状态X,可以获得下一个符号,以及下一个nBits和newX。然后,解码操作可以继续,直到恢复编码数据中的所有"Stotal”符号为止。应当注意的是,某些符号在编码时不会产生右移位,因此将没有从这些符号中恢复的位。例如,表3示出nBits[X]行中有两个“0”条目。一个或多个这样的符号可以最后被编码以生成编码数据是可能的。因此,即使已经处理了编码数据中的所有位,但是对于当前的恢复数据块,恢复的符号还没有达到"Stotal”,解压缩处理400的实施例可以继续。
使用表3作为解码表502的示例,编码数据可以是b01100,并且第一个状态可以是四。应当注意,解压缩过程中的第一个状态可以是压缩过程中的最后状态或最终状态。因为解压缩过程可以是单独的过程,所以不应将解压缩过程中描述的状态与压缩过程中的状态混淆。第一个状态可以与索引匹配,因此,第一个解码符号可以是Symbol[4],如表3所示,它是“b”。如表3所示,索引为4,nBits[4]可以为0,newX[4]可以为0。因为nBits[4]为零,所以没有从编码数据中恢复的位,并且恢复的值可以为零,因此下一个状态X=0+0=0。现在以状态X=0作为第二个索引,第二个解码符号可以是Symbol[0],即表3所示的“a”。而且,可以从表3分别将nBits[0]和newX[0]设为3和0。现在nBits为3,可以从编码数据中恢复三位。因为解压缩器可以获得有关位顺序和级联顺序的元数据信息,所以解压缩器可以从解码的数据获得b011并将其识别为b110,其原始顺序为十进制6。因此,下一状态X=0+6=6。现在,以状态X=6作为第三个索引,第三个解码符号可以是Symbol[6],即表3所示的“c”。此外,可以从表3中分别将nBits[6]和newX[6]设为2和0。在nBits现在为2的情况下,可以从编码数据中恢复编码数据的最后两位b00。
应该注意的是,尽管解压缩器可以从表3中获得nBits[6]和newX[6]并继续计算下一个状态X,但是由于解压缩器已经成功地解码了三个符号“bac”,所以没有必要这样做。因此,在使用解码表502的至少一个实施例中,在压缩处理100期间,可以不需要将用于对第一个符号进行编码的右移位输出到编码数据,因为在解压缩过程400中可能不需要这些位。
在生成解码表504的实施例中,编码数据的最终状态可以与解码表504的索引匹配,与该索引相对应的符号可以是第一个恢复符号。但是,解码表504不具有nBits或newX信息,因此它们可以在运行时动态地生成。也就是说,使用解码表504的实施例可能需要基于当前状态X从解码表获得当前符号,并动态地确定运行时当前要从编码数据恢复的位数和新状态X。在一个实施例中,可能需要累积出现表bs,并且可以基于出现次数信息(例如,表ls)来生成累积出现表bs。在该实施例中,可以使用符号状态值(SSV)获得要恢复的位数nBits,例如,nBits=R–floor(lg(SSV)),新状态X可以等于[(SSV)<<nBits]–L+(编码数据的nBits),其中<<是左移运算符,其值SSV由bs+1+X–2*bs获得,其中bs和bs+1可以是字母表中当前符号和下一个符号的累积出现,并且*可以是乘法运算符。在一个实施例中,可以在解码期间建立出现次数表bs。在另一个实施例中,可以从元数据获得出现次数表bs。当符号是字母表中的最后一个元素时,可能会有一个特殊的值bs+1设置为L。应当注意,因为bs+1=bs+ls,由公式bs+1+X–2*bs获得的数与公式ls+X–bs相同。也就是说,SSV也等于ls+X–b s。
使用表4作为解码表504的示例,编码数据可以是b01100,并且第一个状态可以是四。第一个状态可以与索引匹配,因此,第一个解码符号可以是Symbol[4],如表4所示,它是“b”。如表2所示,对于元素b,累积出现次数bs可以为1,累积出现次数bs+1可以为6,因此SSV=(bs+1+X–2*bs)=(6+4-2*1)=8。nBits可以是R-lg8=0,并且新状态X可以是[8<<0]-8+0=0。现在以状态X=0作为第二个索引,第二个解码符号可以是Symbol[0],即表4所示的“a”。如表2所示,对于元素a,累积出现次数bs可以为0,累积出现次数bs+1可以为1,因此SSV=(bs+1+X–2*bs)=(1+0-2*0)=1。nBits可以为R-lg1=3。因为解压缩器可以获得有关位顺序和级联顺序的元数据信息,所以解压缩器可以从解码的数据获得b011并将其识别为b110,其原始顺序为十进制6。因此,新状态X可以是[1<<3]-8+b110=6。现在,以状态X=6作为第三个索引,第三个解码符号可以是Symbol[6],即表3所示的“c”。如表2所示,对于元素c,累积出现次数b s可以为6,并且由于c是字母表的最后一个元素,因此累积出现次数bs+1可以为bn(例如,L=8),因此SSV=(bs+1+X–2*bs)=(8+6-2*6)=2。nBits可以是R-lg2=2,并且新状态X可以是[2<<2]-8+0=0。在nBits现在为2的情况下,可以从编码数据中恢复编码数据的最后两位b00。类似于使用解码表3的实施例,不需要恢复与右移位相对应的最后两位以对第一个符号进行编码。因此,在使用解码表504的至少一个实施例中,在压缩过程100期间,可以不需要将用于对第一个符号进行编码的右移位输出到编码数据,因为在解压缩过程400中可以不需要这些位。
在某些情况下,例如,在L簡化过程或数据输入流已经被另一个压缩过程(例如Lempel-Ziv压缩)压缩之后,数字L可能不是2的幂。在这些情况下,仍然可以生成解码表502,但是用n_Bits替代要恢复的位数,用new_State替代新状态X存储在解码表502中。解码表504不包含要恢复的位数或新状态X,并且可以与对于L为2的幂的方式相同的方式来生成,但是替代n_Bits和替代new_State仍然可以动态地生成。因此,对于L不是2的乘方,框408中的解码操作可以从编码数据获得需要恢复的位数并从替代n_Bits和替代new_State获得下一状态X。
对于使用解码表502的实施例,可以从解码表502获得当前符号的替代n_Bits和替代new_State。在一个实施例中,为了确定n_Bits或n_Bits+1中的哪一个是正确的要从编码数据恢复的位数,可以计算两个X值,一个基于n_Bits,另一个基于n_Bits+1。两个X值之一可以落入L个状态的间隔中(例如,对于基值M为零的{0,…,L-1}),并且那一个可以是下一个状态X,相应的n_Bits或n_Bits+1可以是从编码数据中恢复的位数。
可以使用如下伪码来表示从编码数据恢复的实际位数以及从存储在表502中的n_Bits和new_State中获得下一状态X的运算,其中“<<”是左移位运算符,“∈”是属于运算符:
对于使用解码表504的实施例,替代n_Bits和替代new_State可以在框408的操作中动态生成。首先,当L不是2的幂时,在编码过程和解码过程中都可以将R设置为ceiling(lg(L))。设置R=ceiling(lg(L))不会影响编码过程。在解码过程中,对于当前状态X,可以将Ls的初始值设置为符号状态值(SSV),该值可以通过bs+1+X–2*bs或ls+X–bs,获得,其中bs和bs+1可以是字母表中当前符号和下一个符号的累积出现,并且*可以是乘法运算符。通过执行从0到R的索引“j”的循环,可以获得n_Bits。
在循环内部,可以通过将初始Ls左移循环索引号j,并将获得的左移值加2的j次幂,然后从获得的值中减去1,以获得称为Ls_tmp的临时Ls。即,Ls_tmp=(Ls<<j)+(2^j-1)。在一个实施例中,在硬件实现中,可以通过将Ls向左移位j位并以最低有效位(LSB)插入j位1来执行针对(Ls<<j)+(2^j-1)的运算。可以通过每次将循环索引从零递增到R直到Ls_tmp落入间隔{L,…,2L-1)中来获得Ls_tmp。然后,可以将n_Bits设置为“j”,并且可以停止循环。要从编码数据中恢复的位数可以是n_Bits或n_Bits+1。在一个实施例中,为了确定n_Bits或n_Bits+1中的哪一个是正确的要从编码数据恢复的位数,可以计算两个X值,一个基于n_Bits,另一个基于n_Bits+1。两个X值之一可以落入L个状态的间隔中(例如,对于基值M为零的{0,…,L-1}),并且那一个可以是下一个状态X,相应的n_Bits或n_Bits+1可以是从编码数据中恢复的位数。
可以使用如下伪码来表示要从编码数据恢复的位数和下一状态X的运算,其中“<<”是左移位运算符,“∈”是属于运算符,并且“*”是一个乘法运算符:
SSV=bs+1+X–2*bs;或可选的通过公式ls+X–bs,其中bs和bs+1可能是字母表中当前符号和下一个符号的累计出现
因此,执行获得n_Bits并确定n_Bits和下一状态X的操作可以在用于构建解码表502的实施例中在构建解码表502的过程中(例如,在框406中)或用于构建解码表504的实施例中在解码操作过程中(例如,在框408中)执行。
在框410中,可以从解压缩器输出恢复的符号。在一些实施例中,每个恢复的符号可以在可以被解码之后从解压缩器输出。也就是说,框410不需要等待直到所有符号都已被解码以执行。
因为解压缩过程400可以包括具有循环索引的循环,对于每个符号,循环索引从1开始逐步增加到ls,与没有L簡化的解压缩过程400的实施例相比,具有L簡化(对于每个符号较小的L)的解压缩过程400的实施例可以花费更少的时间来完成。
在实现解码表502和解码表504的实施例中的解压缩器可以对硬件实现友好。解码表504可以仅需要用于lg(n)位中的每一个的L个条目的存储空间。尽管解码操作可能需要表bs和值bn,但是解压缩器仍可以以紧凑的尺寸实现在IC芯片中,因此一个实施例可以称为超小面积解压缩器。此外,尽管解码表502可以大于解码表504,但是两个表的条目数量仍可以与L成比例,因此具有L簡化的实施例与没有具有L簡化的实施例相比仍然对硬件更友好。因此,根据本公开的解压缩器实施例可以需要很少的存储空间,并且可以易于在现场可编程门阵列(FPGA)或专用集成电路(ASIC)等中实现。
图6示意性地示出了根据本公开的一个实施例的解压缩器600。解压缩器600包括解包器602、解码表构建器604、解码表存储器606、解码器引擎608和输出缓冲器610。解压缩器600可以被配置为实施解压缩过程400。解包器602可以被耦合到数据总线,并且被配置为执行框402以接收要解码的编码数据。例如,数据总线可以是耦合到存储设备的总线,并且可以从存储设备接收编码的数据。解包器602可以解包接收到的数据,例如,获得编码数据和与编码数据相关联的任何元数据。元数据可以包括例如字母表、元素ls的出现。在一个实施例中,可以由解包器602获得编码数据中的符号总数的大小"Stotal”,并且可以通过对元素ls的出现求和来获得L。并且在一些实施例中,元数据还可包括但不限于位顺序信息、级联顺序信息或两者。
解压缩的编码数据和元数据可以具有一个副本传递给解码表构造器604,而另一副本传递给解码器引擎608。解码表构建器604可以被配置为执行框406以构建解码表502或504。在使用表504的实施例中,解码表构造器604还可被配置为建立累积出现表bs。解码表存储器606可以是配置为存储由解码表构造器604生成的解码表的缓冲器。
解码器引擎608可以被配置为使用解码表存储器606中的解码表和来自解包器602的编码数据来执行框408中的解码操作。可以将解码的符号放入输出缓冲器610中。
在示例性实施例中,提供了一种方法,该方法可以包括:接收要解压缩的编码数据,获得所述编码数据中符号总数的大小"Stotal”,所述编码数据中不同符号的出现次数以及在编码过程中生成的最终状态作为解码的第一个状态,建立包含对应于L个编码状态的所述不同符号的解码表,使用所述解码表对所述编码数据进行解码,包括:基于当前状态X从所述解码表中获取当前符号,动态地确定要从所述编码数据中恢复的当前位数和新状态X,并且输出从所述编码数据恢复的符号。L可以等于不同符号的出现次数的总和。
在一个实施例中,所述L个编码状态是M至M+L-1范围的L个不同值,其中,M是该范围的基值并且是等于或大于零的整数。
在一个实施例中,L可以是2的幂,并且M可以是零,并且动态确定要从所述编码数据恢复的当前位数和新状态X可以包括:通过bs+1+X–2*bs或ls+X–bs获得符号状态值(SSV),其中*是可以乘法运算符,bs和bs+1可以是符号集中所述当前符号和下一个符号的累积出现,bn可以设置为L;获取要从所述编码数据中恢复的当前位数为nBits=R–floor(lg(SSV));和获得所述新状态X为[(SSV)<<nBits]–L+(所述编码数据的nBits比特),其中“<<”可以是左移运算符。
在一个实施例中,L可以不是2的幂,并且M可以是零,并且动态地确定要从所述编码数据恢复的当前位数和新状态X可以包括:将Ls的初始值设置为符号状态值(SSV),其中SSV通过bs+1+X–2*bs或ls+X–bs获得,其中*可以是乘法运算符,bs和bs+1可以是符号集中所述当前符号和下一个符号的累积出现,bn可以设置为L;将值R设置为ceiling(lg(L)),其中ceiling为向上取整函数;对于从0到R的索引“j”;以(Ls<<j)+(2^j-1)的形式获得临时Ls_tmp,直到Ls_tmp落入间隔{L,…,2L-1),其中<<是左移位运算符,^是幂运算符,并且将数字n_Bits设置为“j”;将X1设置为[(SSV)<<n_Bits]-L+(所述编码数据的n_Bits比特);将X2设置为[(SSV)<<(n_Bits+1)]-L+[所述编码数据的(n_Bits+1)比特];确定X1和X2中的哪一个落在{0,…,L-1}的范围内;如果X1落在{0,…,L-1}的范围内,则将要从所述编码数据中恢复的所述当前位数设置为n_Bits,并将所述新状态X设置为X1;和如果X2落入{0,…,L-1}的范围内,则将要从所述编码数据中恢复的所述当前位数设置为n_Bits+1,并将所述新状态X设置为X2。
在一个实施例中,该方法可以进一步包括从与所述编码数据相关联的元数据获得位顺序和级联顺序,所述位顺序指定生成所述编码数据时的位顺序,并且并且所述级联顺序指定生成所述编码数据时将连续符号生成的位集连接在一起的顺序。
在一个实施例中,该方法可以进一步包括基于所述不同符号的出现次数,为符号集中的所有符号建立累积出现表。
在一个实施例中,该方法可以进一步包括在从所述编码数据中解码最后一个符号之后,跳过动态地确定要从所述编码数据恢复的所述当前位数和所述新状态X。
在一个实施例中,所述不同符号的出现次数可以是减量的出现次数,而不是实际出现的次数。
在一个实施例中,所述解码表由用于遍历所述编码数据中符号集的所有符号的外循环和用于遍历每个符号的所有出现次数的内循环建立。
在一个实施例中,所述解码表可以具有用于lg(n)位中的每一个的L个条目的存储空间,其中,n是所述符号集中的符号的数量,并且lg()是二进制对数函数。
在又一个示例性实施例中,提供了一种解压缩器,该解压缩器可以包括:解包器,被配置为接收要解压缩的编码数据并获得所述编码数据中符号总数的大小"Stotal”,所述编码数据中不同符号的出现次数以及在编码过程中生成的最终状态作为解码的第一个状态,解码表构建器,被配置为建立包含对应于L个编码状态的所述不同符号的解码表,解码表存储器,用于存储所述解码表,和解码器引擎,被配置为使用所述解码表对所述编码数据进行解码,包括:基于当前状态X从所述解码表中获取当前符号,动态地确定要从所述编码数据中恢复的当前位数和新状态X,并且输出从所述编码数据恢复的输出符号。L可以等于不同符号的出现次数的总和。
在一个实施例中,所述L个编码状态是M至M+L-1范围的L个不同值,其中,M是该范围的基值并且是等于或大于零的整数。
在一个实施例中,L可以是2的幂,并且M可以是零,并且动态确定要从所述编码数据恢复的当前位数和新状态X,所述解码器引擎进一步被配置为:通过bs+1+X–2*bs或ls+X–bs获得符号状态值(SSV),其中*是可以乘法运算符,bs和bs+1可以是符号集中所述当前符号和下一个符号的累积出现,bn可以设置为L;获取要从所述编码数据中恢复的当前位数为nBits=R–floor(lg(SSV));和获得所述新状态X为[(SSV)<<nBits]–L+(所述编码数据的nBits比特),其中“<<”可以是左移运算符。
在一个实施例中,L可以不是2的幂,并且M可以是零,并且动态确定要从所述编码数据恢复的当前位数和新状态X,所述解码器引擎进一步被配置为:将Ls的初始值设置为符号状态值(SSV),其中SSV通过bs+1+X–2*bs或ls+X–bs获得,其中*可以是乘法运算符,bs和bs+1可以是符号集中所述当前符号和下一个符号的累积出现,bn可以设置为L;将值R设置为ceiling(lg(L)),其中ceiling为向上取整函数;对于从0到R的索引“j”:以(Ls<<j)+(2^j-1)的形式获得临时Ls_tmp,直到Ls_tmp落入间隔{L,…,2L-1),其中<<是左移位运算符,^是幂运算符,并且将数字n_Bits设置为“j”;将X1设置为[(SSV)<<n_Bits]-L+(所述编码数据的n_Bits比特);将X2设置为[(SSV)<<(n_Bits+1)]-L+[所述编码数据的(n_Bits+1)比特];确定X1和X2中的哪一个落在{0,…,L-1}的范围内;如果X1落在{0,…,L-1}的范围内,则将要从所述编码数据中恢复的所述当前位数设置为n_Bits,并将所述新状态X设置为X1;和如果X2落入{0,…,L-1}的范围内,则将要从所述编码数据中恢复的所述当前位数设置为n_Bits+1,并将所述新状态X设置为X2。
在一个实施例中,该解包器可以进一步被配置为从与所述编码数据相关联的元数据获得位顺序和级联顺序,所述位顺序指定生成所述编码数据时的位顺序,并且所述级联顺序指定生成所述编码数据时将连续符号生成的位集连接在一起的顺序。
在一个实施例中,该解码表构造器可以进一步被配置为基于所述不同符号的出现次数,为符号集中的所有符号建立累积出现表。
在一个实施例中,该解码器引擎可以进一步被配置为在从所述编码数据中解码最后一个符号之后,跳过动态地确定要从所述编码数据恢复的所述当前位数和所述新状态X。
在一个实施例中,所述不同符号的出现次数可以是减量的出现次数,而不是实际出现的次数。
在一个实施例中,所述解码表由用于遍历所述编码数据中符号集的所有符号的外循环和用于遍历每个符号的所有出现次数的内循环建立。
在一个实施例中,所述解码表可以具有用于lg(n)位中的每一个的L个条目的存储空间,其中,n是所述符号集中的符号的数量,并且lg()是二进制对数函数。
任何公开的方法和操作可以被实现为存储在一个或多个计算机可读存储介质(例如,非暂时性计算机可读介质,例如,一个或更多个光盘介质,易失性存储组件(例如,动态随机存取存储器(DRAM)或静态随机访问存储器(SRAM)),或非易失性存储组件(例如,硬盘驱动器)上并在设备控制器(例如,ASIC执行的固件)上执行的计算机可执行指令(例如,本文描述的操作的软件代码)。可以将用于实现所公开的技术的任何计算机可执行指令以及在所公开的实施例的实现期间创建和使用的任何数据可以存储在一个或多个计算机可读介质(例如,非暂时性计算机可读介质)上。
尽管本文已经公开了各个方面和实施例,但是其他方面和实施例对于本领域技术人员将是显而易见的。本文所公开的各个方面和实施例是出于说明的目的,而不是旨在进行限制,真实的范围和精神由所附权利要求书指示。
Claims (17)
1.一种解压缩数据的方法,其特征在于,包括:
接收要解压缩的编码数据;
获得所述编码数据中符号总数的大小"Stotal”,所述编码数据中不同符号的出现次数以及在编码过程中生成的最终状态作为解码的第一个状态;
建立包含对应于L个编码状态的所述不同符号的解码表,其中,L等于所述不同符号的出现次数之和;
使用所述解码表对所述编码数据进行解码,包括:基于当前状态X从所述解码表中获取当前符号,动态地确定要从所述编码数据中恢复的当前位数和新状态;和
输出从所述编码数据中恢复的符号。
2.根据权利要求1所述的方法,其特征在于,所述L个编码状态是M至M+L-1范围的L个不同值,其中,M是该范围的基值并且是等于或大于零的整数。
3.根据权利要求2所述的方法,其特征在于,L是2的幂,并且M是零,并且动态地确定要从所述编码数据恢复的当前位数和新状态包括:
通过bs+1+X–2*bs或ls+X–bs获得符号状态值SSV,其中*是乘法运算符,ls表示元素"s"的出现次数,bs和bs+1是符号集中所述当前符号和下一个符号的累积出现,bn设置为L,n表示字母表中不同或元素的数量;
获取要从所述编码数据中恢复的当前位数为nBits=R–floor(lgSSV),floor()表示下限函数,lg()表示二进制对数函数,R=lgL;和
获得所述新状态为[SSV<<nBits]–L+所述编码数据的nBits比特,其中“<<”是左移运算符。
4.根据权利要求2所述的方法,其特征在于,L不是2的幂,并且M是零,并且动态地确定要从所述编码数据恢复的当前位数和新状态包括:
将Ls的初始值设置为符号状态值SSV,其中,所述符号状态值通过bs+1+X–2*bs或ls+X–bs获得,其中,*是乘法运算符,ls表示元素"s"的出现次数,bs和bs+1是符号集中所述当前符号和下一个符号的累积出现,bn设置为L,n表示字母表中不同或元素的数量;
将值R设置为ceiling(lgL),其中ceiling为向上取整函数,lg()表示二进制对数函数;
对于从0到R的索引“j”:
以(Ls<<j)+(2^j-1)获得临时Ls_tmp,直到Ls_tmp落入间隔{L,…,2L-1),其中,Ls_tmp表示Ls的临时值,<<是左移位运算符,^是幂运算符,和
将数字n_Bits设置为“j”,n_Bits是通过执行从0到R的索引"j”循环的操作获得的值;
将X1设置为[SSV<<n_Bits]-L+所述编码数据的n_Bits比特;
将X2设置为[SSV<<(n_Bits+1)]-L+所述编码数据的n_Bits+1比特;
确定X1和X2中的哪一个落在{0,…,L-1}的范围内;
如果X1落在{0,…,L-1}的范围内,则将要从所述编码数据中恢复的所述当前位数设置为n_Bits,并将所述新状态设置为X1;和
如果X2落入{0,…,L-1}的范围内,则将要从所述编码数据中恢复的所述当前位数设置为n_Bits+1,并将所述新状态设置为X2。
5.根据权利要求1所述的方法,其特征在于,还包括:从与所述编码数据相关联的元数据获得位顺序和级联顺序,所述位顺序指定生成所述编码数据时的位顺序,并且所述级联顺序指定生成所述编码数据时将连续符号生成的位集连接在一起的顺序。
6.根据权利要求1所述的方法,其特征在于,还包括:基于所述编码数据中所述不同符号的出现次数为符号集中的所有符号建立累积出现表。
7.根据权利要求1所述的方法,其特征在于,还包括:在从所述编码数据中解码最后一个符号之后,跳过动态地确定要从所述编码数据恢复的所述当前位数和所述新状态。
8.根据权利要求1所述的方法,其特征在于,所述不同符号的出现次数是减量的出现次数,而不是实际出现的次数。
9.根据权利要求1所述的方法,其特征在于,所述解码表由用于遍历所述编码数据中符号集的所有符号的外循环和用于遍历每个符号的所有出现次数的内循环建立。
10.根据权利要求9所述的方法,其特征在于,所述解码表具有用于lg(n)位中的每一个的L个条目的存储空间,其中,n是所述符号集中的符号的数量,并且lg()是二进制对数函数。
11.一种解压缩器,其特征在于,包括:
解包器,被配置为接收要解压缩的编码数据并获得所述编码数据中符号总数的大小"Stotal”,所述编码数据中不同符号的出现次数以及在编码过程中生成的最终状态作为解码的第一个状态;
解码表构建器,被配置为建立包含对应于L个编码状态的所述不同符号的解码表,其中,L等于所述不同符号的出现次数之和;
解码表存储器,用于存储所述解码表;和
解码器引擎,被配置为使用所述解码表对所述编码数据进行解码,包括:基于当前状态X从所述解码表中获取当前符号,动态地确定要从所述编码数据中恢复的当前位数和新状态,并且输出从所述编码数据恢复的输出符号。
12.根据权利要求11所述的解压缩器,其特征在于,所述L个编码状态是M至M+L-1范围的L个不同值,其中,M是该范围的基值并且是等于或大于零的整数。
13.根据权利要求12所述的解压缩器,其特征在于,L是2的幂,并且M是零,并且动态地确定要从所述编码数据恢复的当前位数和新状态,所述解码器引擎进一步被配置为:
通过bs+1+X–2*bs或ls+X–bs获得符号状态值SSV,其中*是乘法运算符,ls表示元素"s"的出现次数,bs和bs+1是符号集中所述当前符号和下一个符号的累积出现,bn设置为L,n表示字母表中不同或元素的数量;
获取要从所述编码数据中恢复的当前位数为nBits=R–floor(lgSSV),floor()表示下限函数,lg()表示二进制对数函数,R=lgL;和
获得所述新状态为[SSV<<nBits]–L+所述编码数据的nBits比特,其中“<<”是左移运算符。
14.根据权利要求12所述的解压缩器,其特征在于,L不是2的幂,并且M是零,并且动态确定要从所述编码数据恢复的当前位数和新状态,所述解码器引擎进一步被配置为:
将Ls的初始值设置为符号状态值SSV,其中,所述符号状态值通过bs+1+X–2*bs或ls+X–bs获得,其中,*是乘法运算符,ls表示元素"s"的出现次数,bs和bs+1是符号集中所述当前符号和下一个符号的累积出现,bn设置为L,n表示字母表中不同或元素的数量;
将值R设置为ceiling(lgL),其中ceiling为向上取整函数;
对于从0到R的索引“j”:
以(Ls<<j)+(2^j-1)获得临时Ls_tmp,直到Ls_tmp落入间隔{L,…,2L-1),其中,Ls_tmp表示Ls的临时值,<<是左移位运算符,^是幂运算符,并且
将数字n_Bits设置为“j”;
将X1设置为[SSV<<n_Bits]-L+所述编码数据的n_Bits比特;
将X2设置为[SSV<<(n_Bits+1)]-L+所述编码数据的n_Bits+1比特;
确定X1和X2中的哪一个落在{0,…,L-1}的范围内;
如果X1落在{0,…,L-1}的范围内,则将要从所述编码数据中恢复的所述当前位数设置为n_Bits,并将所述新状态设置为X1;和
如果X2落入{0,…,L-1}的范围内,则将要从所述编码数据中恢复的所述当前位数设置为n_Bits+1,并将所述新状态设置为X2。
15.根据权利要求11所述的解压缩器,其特征在于,所述解包器进一步被配置为从与所述编码数据相关联的元数据获得位顺序和级联顺序,所述位顺序指定生成所述编码数据时的位顺序,并且所述级联顺序指定生成所述编码数据时将连续符号生成的位集连接在一起的顺序。
16.根据权利要求11所述的解压缩器,其特征在于,所述解码表构建器进一步被配置为基于所述编码数据不同符号的出现次数为符号集中的所有符号建立累积出现表。
17.根据权利要求11所述的解压缩器,其特征在于,所述解码器引擎进一步被配置为在从所述编码数据中解码最后一个符号之后,跳过动态地确定要从所述编码数据恢复的所述当前位数和所述新状态。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US17/000,620 US11115049B1 (en) | 2020-08-24 | 2020-08-24 | Hardware friendly data decompression |
US17/000,620 | 2020-08-24 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112994703A CN112994703A (zh) | 2021-06-18 |
CN112994703B true CN112994703B (zh) | 2024-04-16 |
Family
ID=76351224
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110219951.8A Active CN112994703B (zh) | 2020-08-24 | 2021-02-26 | 硬件友好的数据解压缩 |
Country Status (2)
Country | Link |
---|---|
US (1) | US11115049B1 (zh) |
CN (1) | CN112994703B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11296720B2 (en) * | 2020-08-24 | 2022-04-05 | Innogrit Technologies Co., Ltd. | Data compression using reduced numbers of occurrences |
CN114003169B (zh) * | 2021-08-02 | 2024-04-16 | 固存芯控半导体科技(苏州)有限公司 | 一种用于ssd的数据压缩方法 |
US20230214367A1 (en) * | 2022-01-05 | 2023-07-06 | AVAST Software s.r.o. | System and method for data compression and decompression |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5272478A (en) * | 1992-08-17 | 1993-12-21 | Ricoh Corporation | Method and apparatus for entropy coding |
US5475388A (en) * | 1992-08-17 | 1995-12-12 | Ricoh Corporation | Method and apparatus for using finite state machines to perform channel modulation and error correction and entropy coding |
US5546080A (en) * | 1994-01-03 | 1996-08-13 | International Business Machines Corporation | Order-preserving, fast-decoding arithmetic coding arithmetic coding and compression method and apparatus |
US5867114A (en) * | 1996-02-29 | 1999-02-02 | Mitel Corporation | Method and apparatus for performing data compression |
US8823560B1 (en) * | 2013-03-01 | 2014-09-02 | Gurulogic Microsystems Oy | Data encoder, data decoder and method |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5912636A (en) * | 1996-09-26 | 1999-06-15 | Ricoh Company, Ltd. | Apparatus and method for performing m-ary finite state machine entropy coding |
US9419749B2 (en) * | 2009-08-19 | 2016-08-16 | Qualcomm Incorporated | Methods and apparatus employing FEC codes with permanent inactivation of symbols for encoding and decoding processes |
WO2010044100A1 (en) * | 2008-10-15 | 2010-04-22 | Veeresh Rudrappa Koratagere | Lossless compression |
US9298722B2 (en) * | 2009-07-16 | 2016-03-29 | Novell, Inc. | Optimal sequential (de)compression of digital data |
PL2559166T3 (pl) * | 2010-04-13 | 2018-04-30 | Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | Koder i dekoder dzielący interwał prawdopodobieństwa |
GB2523348B (en) * | 2014-02-20 | 2016-03-30 | Gurulogic Microsystems Oy | Encoder, decoder and method |
US9509335B1 (en) * | 2015-05-11 | 2016-11-29 | Via Alliance Semiconductor Co., Ltd. | Hardware data compressor that constructs and uses dynamic-prime huffman code tables |
-
2020
- 2020-08-24 US US17/000,620 patent/US11115049B1/en active Active
-
2021
- 2021-02-26 CN CN202110219951.8A patent/CN112994703B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5272478A (en) * | 1992-08-17 | 1993-12-21 | Ricoh Corporation | Method and apparatus for entropy coding |
US5475388A (en) * | 1992-08-17 | 1995-12-12 | Ricoh Corporation | Method and apparatus for using finite state machines to perform channel modulation and error correction and entropy coding |
US5546080A (en) * | 1994-01-03 | 1996-08-13 | International Business Machines Corporation | Order-preserving, fast-decoding arithmetic coding arithmetic coding and compression method and apparatus |
US5867114A (en) * | 1996-02-29 | 1999-02-02 | Mitel Corporation | Method and apparatus for performing data compression |
US8823560B1 (en) * | 2013-03-01 | 2014-09-02 | Gurulogic Microsystems Oy | Data encoder, data decoder and method |
Non-Patent Citations (2)
Title |
---|
Adaptive-Length Coding of Image Data for Low-Cost Approximate Storage;Qianqian Fan等;《IEEE Transactions on Computers》;第69卷(第2期);239-252 * |
多阶上下文自适应二进制算术编码实现;杨文涛等;《华中科技大学学报(自然科学版)》;第35卷(第3期);42-45 * |
Also Published As
Publication number | Publication date |
---|---|
CN112994703A (zh) | 2021-06-18 |
US11115049B1 (en) | 2021-09-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112994703B (zh) | 硬件友好的数据解压缩 | |
JP4801776B2 (ja) | データ圧縮 | |
CN106560010B (zh) | Vlsi高效霍夫曼编码设备和方法 | |
KR101092106B1 (ko) | 데이터 압축 | |
US7907068B2 (en) | FIFO radix coder for electrical computers and digital data processing systems | |
US7671767B2 (en) | LIFO radix coder for electrical computers and digital data processing systems | |
CN112615628B (zh) | 硬件友好地数据压缩 | |
US7843367B2 (en) | Data coding buffer for electrical computers and digital data processing systems | |
JPH0253329A (ja) | 圧縮符号化方法及び復号方法 | |
SE530081C2 (sv) | Metod och system för datakomprimering | |
CN112738124B (zh) | 硬件友好的数据压缩方法、压缩器 | |
CN113346913B (zh) | 使用减量的出现次数的数据压缩 | |
CN113315523B (zh) | 硬件友好的数据解压缩 | |
US8018359B2 (en) | Conversion of bit lengths into codes | |
US7683809B2 (en) | Advanced lossless bit coding | |
KR101810863B1 (ko) | 누적 심볼 빈도수 기반 Deflate 부호화 방법 및 장치 | |
Doshi et al. | “Quad-Byte Transformation as a Pre-processing to Arithmetic Coding | |
US20240137045A1 (en) | Noniterative entropy coding | |
KR101734515B1 (ko) | 데이터 부호화 및 복호화 방법과 장치 | |
Bharti et al. | Construction algorithms for RVLCs: A survey | |
Shen et al. | Optimal coding | |
Biggs | Data compression |
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 |