掌桥专利:专业的专利平台
掌桥专利
首页

硬件友好的数据解压缩

文献发布时间:2023-06-19 12:21:13


硬件友好的数据解压缩

技术领域

本公开涉及数据压缩,尤其涉及使用熵编码的无损压缩。

背景技术

数据压缩已广泛用于数字信号系统,例如通信和计算机系统。在信息论中,克劳德·香农(Claude Shannon)的信源编码定理(source coding theorem,或称为无噪声编码定理)确定了可能的数据压缩以及香农熵的运算含义的极限。根据香农的信源编码定理,符号的最佳代码长度为-log

发明内容

本公开提供了用于使用熵编码的无损压缩的系统和方法。在示例性实施例中,提供了一种方法,该方法可以包括:接收要解压缩的编码数据;获得所述编码数据中符号总数的大小"S

在另一个示例性实施例中,提供了一种解压缩器,其可以包括:解包器,被配置为接收要解压缩的编码数据并获得所述编码数据中符号总数的大小"S

附图简要说明

图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)码表示。一个数据单元可以被称为一个符号,因此输入数据块可以包括许多符号。输入数据块中所有符号的总数可以表示为S

通常,数据块可以由一组不同的符号形成,每个符号出现一次或多次。在一些实施例中,可以针对输入数据块计算符号的概率分布,并且可以构建两个表来表示符号的概率分布,出现次数表和累计出现表。

在一个实施例中,可以扫描输入数据以建立一组不同符号,并且还可以计算不同符号的数量以及每个不同符号在输入数据块中出现多少次。在各种实施例中,符号可以具有预定义的大小,例如,1个字节、2个字节、4个字节等。该大小可以不是2的幂。如本文中所使用的,不同符号的集也可以被称为字母表(A),每个符号也可以被称为元素并且使用小写字母“s”来表示。小写字母“n”可用于表示字母表中不同符号(或元素)的数量,其中n是大于1的整数。应当注意,在一些实施例中,不同符号的集可以是预定义的,例如,预先编程的或由规范给出的。在这样的实施例中,可以扫描输入数据以仅计算不同符号的数量以及每个不同符号在输入数据块中出现多少次。

元素"s"的出现次数可以使用斜体小写字母"l”和下标s表示为"l

在各种实施例中,实际符号概率分布可以被处理为减量所有符号的总出现次数。该过程可以被称为L简化(reduction)过程。例如,在获得(例如,通过计数)元素的出现次数"l

预定数DIV可以是大于1的任意数量,典型示例数可以是正整数,例如但不限于2、3或4等。可以使用相同的预定数来减少输入数据块中每个不同符号的出现次数。在还原每个不同符号的每个单独出现次数之后,所有符号的总出现次数也可以减少为减量的所有符号的总出现次数,这可以表示为"L

作为一个例子,假设符号"α"在4096个符号的块中出现了五(5)次,而符号"β"在同一个块中出现了三(3)次。同一个块中可能还有其他符号,出现的总数为4088(4096-8)。符号"α"可以具有5的实际出现次数和5/4096的实际出现概率。符号"β"可以具有3的实际出现次数和3/4096的实际出现概率。在一个实施例中,上限函数可以用于获得减量的出现次数,示例DIV为4,对于符号"α",可以通过ceiling(l

在各种实施例中,用于压缩或解压缩的概率分布可以是实际概率分布或L简化之后的概率分布,并且在两种情况下压缩都是无损的。应该注意的是,实施例可以获得具有实际概率分布的最佳压缩率。在L简化之后使用概率分布可以提高速度并降低硬件成本(例如,存储空间),但可能会牺牲一点压缩率。因为根据本公开的压缩和解压缩技术可以使用实际概率分布或在L简化之后的概率分布来实现,所以可以将术语"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可以是符号集的所有元素的出现次数表,并且可以被称为l

表1简单示例中符号集{a,b,c}的出现次数

图2B示意性地示出了根据本公开的一个实施例的累计出现表204。累计出现表204可以是符号集的所有元素的累积出现表。元素的累积出现次数,可以称为b

应当注意,在表204中示出了第一行元素用于说明。在一些实施例中,第二行中每个累积出现的位置可以对应于符号集中相应符号的位置,因此,表204可能仅需要第二行记录该符号的累积出现。对于具有三个符号(n=3)的字母表{a,b,c}的示例,累积出现表b

表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"也可以具有l

在一些实施例中,在M被选择为等于“L”的情况下,在框106中的编码可以开始于将状态“x”初始化为初始值“L”,然后可以执行编码,使得对于输入数据块中的每个符号,基于出现次数表和累积出现表,可以在运行时动态获得用于右移用于编码当前符号的当前状态“x”的移位数和下一状态“x”。例如,在一个实施例中,框106中的编码可以为输入块的每个符号执行循环。循环可以作用于从输入块的最后一个符号到第一个符号的符号。在循环内部,"x"的值可能会右移,直到x的左边(可以称为x

在一个实施例中,在框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,因此可能需要右移两次以使值x

在状态“x”现在为14的情况下,可以对下一个字母“a”进行编码。字母“a”的累积出现次数为0,出现次数为1。“a”的符号状态间隔可以是1到1(例如,2*1-1)。数字14可以二进制表示为b1110,因此可能需要右移3次才能使值x

在状态“x”现在为8的情况下,可以对下一个字母“b”进行编码。字母“b”的累积出现次数为1,出现次数为5。“b”的符号状态间隔可以是5到9(例如,2*5-1)。数字8可以二进制表示为b1000,并且它可以不需要移位(零移位)即可使值x

应当注意,对于可以将被右移的位放入编码数据中的顺序没有限制。即,压缩器可以被配置为将被右移的位以不同的顺序放入编码的数据中,只要可以保留顺序信息,使得解压缩器可以稍后获得该信息以用于解码。例如,编码“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中,可以获得与编码的数据相关联的元数据。在根据本公开的实施例中,编码的数据块可以具有关联的元数据。例如,解压缩器可能需要知道原始数据块S

在框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)开始,然后执行具有对应于字母表中每个元素位置的循环索引的外循环。在一个实施例中,索引可以是基于零(从零开始),因此字母表中的第一个元素的索引可以为零,字母表中的第二个元素的索引可以为一,依此类推。在外循环内部,可以将L

在一实施例中,可以用如下伪码来表示在框406中构建解码表502的操作:

对于具有三个符号(n=3)的字母表{a,b,c}的示例,解码表502可以是下面的表3。应当注意,第一行可以对应于从零开始的索引(对于范围M至M+8-1,基本值M为零)。因此,第一行可以仅出于说明目的而示出,并且不需要被存储在解码表的实施例中。

表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。在循环内部,可以通过将初始L

应当注意,要从编码数据中恢复的位数可以是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开始,直到1

在一实施例中,可以如下用伪码来表示在框406中构建解码表504的操作:

对于具有三个符号(n=3)的字母表{a,b,c}的示例,解码表504可以是下面的表4。应当注意,第一行可以对应于从零开始的索引(对于范围M至M+8-1,基本值M为零)。因此,第一行可以仅出于说明目的而示出,并且不需要被存储在解码表的实施例中。

表4简单示例中的用于符号集{a,b,c}的第二示例性解码表

在框408中,可以执行基于解码表的解码。编码数据中的最终状态可以成为解压缩过程400中的第一个状态,以被解码以获得第一个恢复的符号。在生成解码表502的实施例中,最终状态可以与解码表502的索引匹配,与索引相对应的符号可以是第一个恢复的符号。当L是2的幂时,还可以从解码表502直接获得要从编码数据恢复的位数(例如,nBits)。可以通过将解码表502中的对应的新状态newX与要从编码数据中恢复的位数表示的恢复值相加来获得下一状态X。利用下一个状态X,可以获得下一个符号,以及下一个nBits和newX。然后,解码操作可以继续,直到恢复编码数据中的所有"S

使用表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。在一个实施例中,可能需要累积出现表b

使用表4作为解码表504的示例,编码数据可以是b01100,并且第一个状态可以是四。第一个状态可以与索引匹配,因此,第一个解码符号可以是Symbol[4],如表4所示,它是“b”。如表2所示,对于元素b,累积出现次数b

在某些情况下,例如,在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,可以将L

在循环内部,可以通过将初始L

可以使用如下伪码来表示要从编码数据恢复的位数和下一状态X的运算,其中“<<”是左移位运算符,“∈”是属于运算符,并且“*”是一个乘法运算符:

SSV=b

因此,执行获得n_Bits并确定n_Bits和下一状态X的操作可以在用于构建解码表502的实施例中在构建解码表502的过程中(例如,在框406中)或用于构建解码表504的实施例中在解码操作过程中(例如,在框408中)执行。

在框410中,可以从解压缩器输出恢复的符号。在一些实施例中,每个恢复的符号可以在可以被解码之后从解压缩器输出。也就是说,框410不需要等待直到所有符号都已被解码以执行。

因为解压缩过程400可以包括具有循环索引的循环,对于每个符号,循环索引从1开始逐步增加到l

在实现解码表502和解码表504的实施例中的解压缩器可以对硬件实现友好。解码表504可以仅需要用于lg(n)位中的每一个的L个条目的存储空间。尽管解码操作可能需要表b

图6示意性地示出了根据本公开的一个实施例的解压缩器600。解压缩器600包括解包器602、解码表构建器604、解码表存储器606、解码器引擎608和输出缓冲器610。解压缩器600可以被配置为实施解压缩过程400。解包器602可以被耦合到数据总线,并且被配置为执行框402以接收要解码的编码数据。例如,数据总线可以是耦合到存储设备的总线,并且可以从存储设备接收编码的数据。解包器602可以解包接收到的数据,例如,获得编码数据和与编码数据相关联的任何元数据。元数据可以包括例如字母表、元素l

解压缩的编码数据和元数据可以具有一个副本传递给解码表构造器604,而另一副本传递给解码器引擎608。解码表构建器604可以被配置为执行框406以构建解码表502或504。在使用表504的实施例中,解码表构造器604还可被配置为建立累积出现表b

解码器引擎608可以被配置为使用解码表存储器606中的解码表和来自解包器602的编码数据来执行框408中的解码操作。可以将解码的符号放入输出缓冲器610中。

在示例性实施例中,提供了一种方法,该方法可以包括:接收要解压缩的编码数据,获得所述编码数据中符号总数的大小"S

在一个实施例中,所述L个编码状态是M至M+L-1范围的L个不同值,其中,M是该范围的基值并且是等于或大于零的整数。

在一个实施例中,L可以是2的幂,并且M可以是零,并且构建所述解码表包括可以包括:将初始值X设置为零,R设置为ceiling(lg(L)),其中ceiling()是向上取整函数,lg()是二进制对数函数;在具有对应于一组不同符号中的每个元素的位置的循环索引的外循环中;将L

在一个实施例中,可以通过Ls向左移位“j”位并将“j”位1插入最低有效位(LSB)来执行(L

在一个实施例中,L不是2的幂且M是零,并且根据对所述当前状态X的解码表中要恢复的位数的对应替代和对新状态的对应替代,动态地确定要从所述编码数据中恢复的当前位数和新状态X包括,将所述要恢复位数的对应替代命名为n_Bits,将所述新状态的对应替代命名为New_state;从所述编码数据中提取n_Bits位和n_Bits+1位,分别追加到new_state和从new_state中减去L;及将从所述编码数据恢复的当前位数确定为n_Bits位或n_Bits+1位,通过他们中的一个使其它们各自附加的new_state落入L个不同值的范围内。

在一个实施例中,获得要从所述编码数据中恢复的当前位数和新状态X的操作可以包括:将X1设置为[(new_state)<

在一个实施例中,该方法可以进一步包括从与所述编码数据相关联的元数据获得位顺序和级联顺序,所述位顺序指定生成所述编码数据时的位顺序,并且并且所述级联顺序指定生成所述编码数据时将连续符号生成的位集连接在一起的顺序。

在一个实施例中,该方法可以进一步包括从与所述编码数据相关联的元数据获得所述L的数值。

在一个实施例中,该方法可以进一步包括在从所述编码数据中解码最后一个符号之后,跳过动态地确定要从所述编码数据中恢复的所述当前位数和所述新状态X。

在一个实施例中,所述不同符号的出现次数可以是减量的出现次数,而不是实际出现的次数。

在又一个示例性实施例中,提供了一种解压缩器,该解压缩器可以包括:解包器,被配置为接收要解压缩的编码数据并获得所述编码数据中符号总数的大小"S

在一个实施例中,所述L个编码状态是M至M+L-1范围的L个不同值,其中,M是该范围的基值并且是等于或大于零的整数。

在一个实施例中,L可以是2的幂,并且M可以是零,并且构建所述解码表包括可以包括:将初始值X设置为零,R设置为ceiling(lg(L)),其中ceiling()是向上取整函数,lg()是二进制对数函数;在具有对应于一组不同符号中的每个元素的位置的循环索引的外循环中;将L

在一个实施例中,可以通过Ls向左移位“j”位并将“j”位1插入最低有效位(LSB)来执行(L

在一个实施例中,L不是2的幂且M是零,并且根据对所述当前状态X的解码表中要恢复的位数的对应替代和对新状态的对应替代,动态地确定要从所述编码数据中恢复的当前位数和新状态X包括,将所述要恢复位数的对应替代命名为n_Bits,将所述新状态的对应替代命名为New_state;从所述编码数据中提取n_Bits位和n_Bits+1位,分别追加到new_state和从new_state中减去L;及将从所述编码数据恢复的当前位数确定为n_Bits位或n_Bits+1位,通过他们中的一个使其它们各自附加的new_state落入L个不同值的范围内。

在一个实施例中,获得要从所述编码数据中恢复的当前位数和新状态X的操作可以包括:将X1设置为[(new_state)<

在一个实施例中,该解包器可以进一步被配置为从与所述编码数据相关联的元数据获得位顺序和级联顺序,所述位顺序指定生成所述编码数据时的位顺序,并且所述级联顺序指定生成所述编码数据时将连续符号生成的位集连接在一起的顺序。

在一个实施例中,该解码表构造器可以进一步被配置为从与所述编码数据相关联的元数据获得所述L的数值。

在一个实施例中,该解码器引擎可以进一步被配置为在从所述编码数据中解码最后一个符号之后,跳过动态地确定要从所述编码数据中恢复的所述当前位数和所述新状态X。

在一个实施例中,所述不同符号的出现次数可以是减量的出现次数,而不是实际出现的次数。

任何公开的方法和操作可以被实现为存储在一个或多个计算机可读存储介质(例如,非暂时性计算机可读介质,例如,一个或更多个光盘介质,易失性存储组件(例如,动态随机存取存储器(DRAM)或静态随机访问存储器(SRAM)),或非易失性存储组件(例如,硬盘驱动器)上并在设备控制器(例如,ASIC执行的固件)上执行的计算机可执行指令(例如,本文描述的操作的软件代码)。可以将用于实现所公开的技术的任何计算机可执行指令以及在所公开的实施例的实现期间创建和使用的任何数据可以存储在一个或多个计算机可读介质(例如,非暂时性计算机可读介质)上。

尽管本文已经公开了各个方面和实施例,但是其他方面和实施例对于本领域技术人员将是显而易见的。本文所公开的各个方面和实施例是出于说明的目的,而不是旨在进行限制,真实的范围和精神由所附权利要求书指示。

相关技术
  • 硬件友好的数据解压缩
  • 一种软硬件结合的自适应实时gzip数据解压缩方法及系统
技术分类

06120113267078