具体实施方式
本发明可以以许多方式来实现,包括作为过程;装置;系统;物质组成;包含在计算机可读存储介质上的计算机程序产品;和/或处理器,诸如被配置成执行存储在耦合到处理器的存储器上和/或由耦合到处理器的存储器提供的指令的处理器。在本说明书中,这些实现方式或者本发明可以采用的任何其他形式可以被称为技术。通常,可以在本发明的范围内更改所公开的过程的步骤的次序。除非另有声明,否则被描述为被配置成执行任务的部件(诸如,处理器或存储器)可以被实现为被临时配置成在给定时间处执行该任务的通用部件、或者是被制造成执行该任务的特定部件。如本文中所使用的,术语“处理器”指代被配置成处理数据(诸如,计算机程序指令)的一个或多个设备、电路和/或处理核心。
下面提供了本发明的一个或多个实施例的详细描述连同图示了本发明原理的附图。结合这种实施例描述了本发明,但是本发明不限于任何实施例。本发明的范围仅由权利要求来限定,并且本发明包括许多替代方案、修改和等同物。在以下描述中阐述了许多具体细节,以便提供对本发明的全面理解。这些细节是出于示例的目的而提供的,并且可以在没有这些具体细节中的一些或全部的情况下根据权利要求来实践本发明。出于清楚的目的,没有详细描述与本发明相关的技术领域中已知的技术材料,使得不会不必要地使本发明含糊难懂。
本文中描述了压缩编码器的各种示例。在一些实施例中,编码器使用具有多个分区的滑动窗口,该滑动窗口允许丢弃无关位,并且这继而在不显著增加处理资源的情况下改进了压缩率(例如,这个技术不需要预通滤波器)。
图1是图示了使用具有多个分区的滑动窗口来生成压缩值的编码过程的实施例的流程图,其中从压缩值中排除无关位。在这个示例中,正在被压缩的值与重复序列相关联(例如,未压缩值是标识该重复序列的较早版本的偏移或长度)。由此,该示例过程可以由偏移和/或长度编码器来执行,该编码器(例如,从标识滑动窗口中的重复模式或序列的匹配标识器)接收与重复模式或序列相关联的偏移和/或长度值,并且编码(即,压缩)重复序列的偏移和/或长度。虽然图1的示例压缩了与重复序列相关联的值,但是要注意的是,任何值(不仅仅是与重复序列相关联的那些)都可以使用本文中描述的技术来压缩和/或编码。
在100处,接收与滑动窗口中的一个或多个分区相关联的分区信息。在本文中描述的示例中,首要的压缩过程在未压缩的输入数据中找到重复模式或序列,并且利用对重复序列的较早副本的引用来替换该重复序列。为了标识未压缩的输入数据中的这种重复序列,编码器使用滑动窗口来存储来自未压缩的输入数据的较旧符号(例如,位)。在本文中描述的示例中,滑动窗口的大小是2的幂(例如,2w,其中w是正整数)。例如,如果w=12,则滑动窗口存储来自(未压缩的)输入数据的并且从中针对重复序列进行搜索的212=4096个符号。
滑动窗口具有一个或多个分区,所述分区将滑动窗口划分成多个集合;在步骤100处接收到的分区信息可以包括滑动窗口内的分区的位置或方位。在本文中描述的一些示例中,分区具有2的幂的位置或方位(例如,,其中w1是正整数,并且w1<w)。下面更详细地描述分区的示例、以及如何在编码过程(以及相反地,解码过程)中使用它们。
在102处,接收与滑动窗口中的重复序列相关联的未压缩值。在一些实施例中,未压缩值(例如,正在被压缩和/或编码的值)是来自偏移-长度对的偏移和/或长度,该偏移-长度对标识了在当前位置处重复的重复序列的较早位置或方位。例如,偏移(X,其中X≥1)可以描述匹配序列的开始(例如,在滑动窗口内,并且从当前位置或时间索引起),并且长度可以描述从指定偏移起的匹配序列的长度。通过压缩标识了重复序列的位置的偏移和/或长度,可以将输入数据压缩得甚至更多(例如,与在使用了重复序列但是不压缩偏移和长度的情况相比)。
在104处,使用未压缩值来生成包括集合指示符和集合内信息的压缩值,这包括通过以下来进行:至少部分地基于分区信息和未压缩值来生成集合指示符;至少部分地基于分区信息和未压缩值来确定未压缩值是否包括无关位;以及生成集合内信息,这包括通过以下来进行:在确定未压缩值包括无关位的情况下,从集合内信息中排除未压缩值中的无关位。
如将在下面更详细地描述的,编码和/或压缩该值(例如,偏移和/或长度)包括生成集合指示符,该集合指示符指示值落入哪个集合中(例如,如果仅存在一个划分滑动窗口的分区,则未压缩值是落入较低集合还是较高集合中)。一般来说,每个集合与唯一和/或非重叠的值范围相关联。因此,如果值在一个集合(例如,两个集合中的较高集合)内,则那个值也不能够落入另一集合(例如,两个集合中的较低集合)中。作为这个观察的结果,如果该集合指示符也是已知的,则一些未压缩值具有无关的(例如,对于解码并恢复原始未压缩值而言是不需要的)位;在可能的情况下,这些无关位在不丢失信息的情况下被丢弃或以其他方式从集合内信息中被排除。下面更详细地描述这一点的一些示例。
在106处,输出包括集合指示符和集合内信息的压缩值。在这个示例中,被输出的压缩值与重复序列相关联,但是(例如,最终)输出数据的一些其他区段或部分可以包括其中在滑动窗口中没有找到重复序列的区段,并且因此输出数据包括或以其他方式包含那些区段中的原始未压缩数据(例如,或一些其他经编码的压缩信息)。
在描述图1中所示的编码过程的更详细示例之前,说明一些示例应用可能是有帮助的。下面各图图示了本文中描述的压缩技术的一些示例应用。
图2A是图示了在通信应用中使用的压缩编码器和解压缩解码器的实施例的示图。在这个示例中,输入(即,未压缩)数据被输入到编码器(200a)。在一些实施例中,编码器(200a)执行图1的编码过程。要传输的压缩数据从编码器(200a)输出,并且被传递到发射器(202),所述发射器(202)针对特定的通信信道在适当时调制和/或格式化压缩数据,并且通过通信信道(204)(诸如,有线或无线信道和/或网络)来发送所传输的数据。
耦合到通信信道(204)的接收器(206)输入接收到的数据,并且从接收到的数据中解调和/或提取接收到的压缩数据。解码器(208a)然后解码接收到的压缩数据并且输出未压缩数据。为了便于解释,在描述解码示例之前,详细描述了各种编码示例。由此,下面将更详细地描述解码器(208a)可以执行的示例性解码过程。
通信信道(204)具有有限和/或固定量的传输容量,并且因此在传输之前压缩数据可以减少由于通信信道(204)被完全利用而需要丢弃或延迟传输时的实例。
图2B是图示了在存储应用中使用的压缩编码器和解压缩解码器的实施例的示图。在这个示例中,未压缩的输入数据被传递到编码器(200b)。在一些实施例中,编码器(200b)执行图1的编码过程。编码器将待写入的压缩数据传递到存储接口(220),所述存储接口(220)继而将数据写入到存储装置(222)。存储装置具有有限和/或固定量的存储容量,并且通过在存储之前压缩数据,可以存储更多(例如,有用的和/或有效载荷)信息。
为了获得原始数据,存储接口(220)读回存储在存储装置(222)上的数据,并且将读回的压缩数据传递到解码器(208b)。解码器(208b)将读回的数据解压缩并且输出解压缩数据。
下图示出了执行图1的过程的示例性编码系统的框图。
图3是图示了编码器的实施例的示图,该编码器被配置成使用具有一个或多个分区的滑动窗口来生成经压缩的偏移和长度,这继而允许从经压缩的偏移和长度中排除无关位。在一些实施例中,图2A中的编码器(200a)和/或图2B中的编码器(200b)如这里所示的那样来实现。在一些实施例中,编码器(300)在硬件中实现,该硬件诸如专用集成电路(ASIC)或现场可编程门阵列(FPGA)。替代地,编码器(300)可以在软件和/或计算机程序产品(例如,包含在非暂时性计算机可读介质中并且包括计算机指令)中实现。
在这个示例中,由编码器(300)来输入(未压缩的)输入数据。在编码器(300)内,输入数据被传递到滑动窗口(302),该滑动窗口(302)存储由匹配标识器(304)针对重复模式或序列进行搜索的输入数据的2w个符号(例如,位)。在一些实施例中,匹配标识器使用哈希函数来高效地针对匹配进行搜索。
当找到匹配时,匹配标识器(304)将所定位的匹配的(标称)偏移和长度(例如,其中偏移标识了从当前位置或方位起的重复序列的开始,并且长度指定了重复序列的长度)传递到偏移和长度压缩编码器(306),该偏移和长度压缩编码器(306)基于分区信息(例如,其中(多个)分区将滑动窗口划分成集合)并且通过消除无关位来压缩该偏移和长度。
虽然这个示例示出了使用相同的示例性编码过程来压缩偏移和长度两者,但是在一些实施例中,本文中描述的示例性压缩技术仅用来压缩偏移和长度对中的一个值,并且一些其他压缩技术用来压缩另一值。
多路复用器(308)通过在当标识出重复序列时来自偏移和长度压缩编码器(306)的经压缩的偏移和经压缩的长度与当未标识出重复序列时由延迟匹配块(310)生成的未压缩数据的延迟版本之间进行选择,从而生成压缩输出数据。例如,可以调整延迟匹配(310),使得A输入处的信号(例如,当未找到匹配时)与B输入处的信号(例如,当找到匹配时)的时延匹配。在一些实施例中,多路复用器(308)或一些其他(多个)部件插入首部(header)和/或保留的序列或模式,该首部和/或保留的序列或模式标识新区段的开始并且指示那个区段是什么类型的区段(例如,重复序列或非重复序列)。如图2A和图2B的示例中所示,经压缩的输出数据然后可以通过通信信道来发送或存储。
简要地返回到滑动窗口(302),滑动窗口包括一个或多个分区(313),所述分区(313)将滑动窗口划分成多个集合(312a和312b);下图示出了偏移和长度编码器(306)如何使用分区(例如,位置)信息来编码偏移和长度的更详细示例。
图4A是图示了具有一个分区和两个集合的滑动窗口的实施例的示图。在这个示例中,来自输入数据的符号从第一集合(400)的左侧移位,并且然后移位到第二集合(402)中。两个集合(400和402)是由划分滑动窗口的分区(404)来创建或以其他方式定义的。在这个示例中,第一集合(400)存储输入数据的第1个至第(−1)个符号,并且第二集合(402)存储输入数据的第()个至第(2w−1)个符号(即,
w>
w 1)。在各种实施例中,在图1中的步骤100处接收分区信息包括接收
w 1、等的值。
偏移值(X)(例如,由匹配标识器输出)标识了重复序列在滑动窗口和/或两个分区内在何处开始(例如,相对于输入数据中的当前位置和/或最新符号)。长度值(Y)(例如,由匹配标识器输出)指定了在重复序列中包括多少个符号(例如,在偏移处开始,并且然后从较新的符号向右行进朝向较旧的符号)。
本文中描述的一些示例具有4092(即,w=12)的滑动窗口大小,这在一些应用中可能是合期望的,因为它减少了时延和/或最大化了压缩率。考虑例如主要存储服务器(例如,其中编码器/解码器在软件中实现)中和/或存储盘(例如,其中编码器/解码器在硬件中实现)中的数据压缩,其中时延是关键的,并且数据大小被限制到~4K(例如,4096)或~8K(例如,8192),这是因为来自主要存储服务器或存储盘的数据是以该大小的单元或块来传送的。通过将滑动窗口的大小设置成与数据大小的大小匹配,减少了时延和/或最大化了压缩率。在一些应用中,~4K或~8K的滑动窗口大小与一些其他应用(例如,使用~32K的滑动窗口大小)相比是相对小的,但是它可能是合期望的,这是因为它减小了搜索的范围和/或需要较少的存储器来实现滑动窗口。
为了更清楚地说明编码技术以及其对压缩率的相关联改进,下图首先描述了部分编码的示例,其中没有排除无关位(例如,使得可以说明并讨论那些无关位)。然后,随后的图将描述示例性编码器如何在不丢失信息的情况下将此类无关位丢弃或以其他方式从编码值中排除。
图4B是图示了在无关位消除之前的部分编码的偏移的实施例的表。在这个示例中,偏移(X)被编码;为了简洁性,本文中没有描述对长度(Y)进行编码的示例。该表中的最左边的列(410)描述了与这个示例中的两个集合相关联的偏移(X)的值:1≤X≤−1(参见顶部行(416)),其与第一集合相关联(例如,图4A中的集合1(400));以及≤X≤2w−1(参见底部行(418)),其与第二集合相关联(例如,图4A中的集合2(402))。
中心列(412)中所示的集合指示符(SI)值示出了在图1中的步骤104处生成的集合指示符的一个示例。在这个示例中,如果偏移在第一集合内,则集合指示符(412)被设置成0(参见顶部行(416))。如果偏移在第二集合内,则集合指示符(412)被设置成1(参见底部行(418))。
除了集合指示符之外,偏移和长度编码器还生成集合内信息(ISI),以完整地和/或完全地指定偏移值(X),例如,在偏移值处于其内的任何分区的情境内。右边的列(414)示出了针对两个集合的部分编码的集合内信息(ISI)。在这个示例中,集合内信息仅被部分编码(例如,尚未丢弃无关位),使得可以讨论那些无关位。
如果偏移(X)在第一集合内,则部分编码的集合内信息按照顶部行(416)包括偏移(X)的w1位。例如,如果偏移(X)在第一集合内,则根据定义,这意味着X严格小于,并且因此可以使用w1位来准确地表示或以其他方式表达X。如果偏移(X)在第二集合内,则部分编码的集合内信息按照底部行(418)包括偏移(X)的w位。如果需要,对部分编码的集合内信息进行零填充以达到规定的位数(例如,w1或w)。
图4C是图示了当w1=9和w=12时在无关位消除之前的部分编码的偏移的实施例的表。在这个示例中,最左边的列(420)示出了偏移(X)的四个示例值:行425-428中分别是511、512、1023和1024。从左数第二列(421)以二进制示出了X的那些值:在行425-428中分别是1 1111 1111、10 0000 0000、11 1111 1111和100 0000 0000。为了可读性,这个图和其他图中每四位之间插入空白。
从右数第二列(422)示出了针对示例偏移值的集合指示符(SI)值:按照图4B中描述的部分编码方案,在行425-428中分别是0、1、1和1。例如,因为w1=9和29=512,所以只有偏移值511(参见顶部行(425))在第一集合之内,并且因此具有集合指示符值0。X的其余示例值(参见底部三行(426-428))具有集合指示符值1。这遵循了图4B中的中心列(412)中描述的集合指示符编码。
最右边的列(423)示出了针对示例偏移值的部分编码的集合内信息(ISI):在行425-428中分别是1 1111 1111(其具有w1位的长度)、0010 0000 0000(其具有w的长度)、0011 1111 1111(其具有w的长度)和0100 0000 0000(其具有w的长度)。这遵循在图4B中的最右边的列(414)中描述的部分编码的集合内信息编码。
在这个示例中,在512至1023范围内的偏移值(X)(参见中间两行(426-428))具有从右数第10位(在列421和423中用下划线来指示),如果已知偏移值(X)落入第二集合内(例如,在给定SI=1的情况下),则不需要该第10位和/或该第10位是无关的。如果偏移值(X)落入第二集合内,则由于互斥,那个偏移值(X)不能够在1至511的范围内,否则它将被分类为落入到第一集合中,不是落入到第二集合中。因此,对于512≤X≤1023,从右数第(w1+1)位(在这个示例中,从右数第10位)被移除或以其他方式从经编码的偏移中排除。更正式地,当SI=1时,可以移除子集[,−1]的前导位,以成为[0,−1]而没有歧义。因此,仅用
w位来编码子集[,−1]。
在概念上,这与将512至1023范围中的偏移值(X)“移位”到1至511的“未使用”范围中是相同的事情(其中“未使用”是在第二集合的情境中或相对于第二集合)。关联于第二集合的“移位的”偏移值(例如,移位之前的512≤X≤1023)与关联于第一集合的“未移位的”偏移值是可区分的,这是因为对于前者,SI=1,而对于后者,SI=0。
在这个示例中,大于或等于1024的X的值不具有无关位,这是因为在解码期间需要从右数第10位。例如,1024(以二进制,100 0000 0000)和1536(以二进制,110 0000 0000)除了从右数第10位之外都是相同的,使得对于大于或等于1024的X的值来说,位不是无关的。
下图示出了当从经编码和/或压缩的输出中消除了这个无关位时的编码。
图4D是图示了当w1=9和w=12时在无关位消除之后的经压缩的偏移的实施例的表。在这个示例中,最左边的列(430)示出了偏移(X)的示例值。从左数第二列(431)示出了集合指示符(SI)。从右数第二列(432)示出了针对512≤X≤1023的那些偏移值(参见例如中间两行(436和437))消除了无关位之后的集合内信息(ISI)。在这个示例中,从右数第10位(本文中也被称为前导位)是被丢弃的无关位,并且用删除线来示出。描述这一点的另一方式是:当512≤X≤1023时,从X中减去。
最右边的列(433)示出了经压缩的偏移的长度(即SI+ISI的长度)。在这个示例中,经压缩的偏移分别具有长度10(参见例如顶部行(435))、长度12(参见例如中间两行(436和437))和长度13(参见例如底部行(438))。
下图更加正式和/或一般地描述了这个压缩编码。
图4E是图示了包括通过消除无关位来生成经压缩的偏移的编码过程的实施例的表。在这个示例中,左边的列(440)示出了偏移(X)的示例值,中心列(441)示出了对应的集合指示符值(SI),并且右边的列(442)示出了对应的集合内信息(ISI),其中在适当的情况下消除了无关位。就编码器的输入和输出而言,左边的列(440)是示例性压缩编码器的输入,并且编码器的输出包括中心列(441)和右边的列(442)。
在这个示例中,如果1≤X≤−1,则按照顶部行(445),集合指示符(SI)被设置成0,并且集合内信息(ISI)是X的w1位。如果≤X≤−1,则按照中间行(446),SI=1,并且ISI=X的w−1位(例如,X的前导位在零填充之前被丢弃)。如果≤X≤2w−1,则按照底部行(447),SI=1,并且ISI=X的w位。如果需要额外的位来满足规定的位数,则执行零填充。
如图4A-4E的示例中所示,在一些实施例中,滑动窗口中的第一分区位于处;在未压缩值在[,−1]范围内的情况下:未压缩值被确定成包括无关位;并且从集合内信息中排除的未压缩值中的无关位包括[,−1]范围内的前导位。
这个编码技术的一个益处是:与一些其他压缩技术(例如,霍夫曼编码器)相比,它提供了可比较的压缩率,但是不需要未压缩数据的分布的先验知识(例如,与霍夫曼编码器不同)。更具体地,所描述的编码技术不需要预通滤波器来收集频率,并且因此与霍夫曼编码器相比更不复杂和/或更小,同时提供了可比较的压缩性能。
此外,压缩率比一些其他编码器(例如,Elias Delta)更好,但是处于基本上相同的复杂度和/或大小。例如,与Elias Delta编码器相比,在可能的情况下,从编码数据中丢弃无关位进一步改进了压缩率,处于复杂度和/或大小的可忽略的代价。
一般而言,与其他压缩技术相比,本文中描述的示例性压缩技术允许使用相对小的滑动窗口(例如,其中较小的滑动窗口减少了复杂度和时延)进行快速压缩,并且使用相对低的复杂度和/或相对小的部件来执行。
下图描述了解码过程(对应于上面描述的编码示例),接着是滑动窗口中的一个分区(即,两个集合)的特定解码示例,其中w1=9并且w=12。
图5是图示了解码过程的实施例的流程图,该解码过程使用包括多个分区的滑动窗口来生成解压缩值,并且其中有时从压缩值中排除无关位。图5示出了与图1的编码过程相对应的解码过程。在一个示例应用中,该过程由偏移和长度解压缩解码器(例如,其对应于图3中所示的偏移和长度压缩编码器(306))来执行。
在500处,接收与滑动窗口中的一个或多个分区相关联的分区信息。例如,对于图4A中所示的分区(404),可以接收w1=9和/或29=512的值。
在502处,接收包括集合指示符和集合内信息的压缩值。参见例如在图4E中的一个分区/两个集合示例中生成的集合指示符(441)和集合内信息(442)。
在504处,使用压缩值来生成与滑动窗口中的重复序列相关联的未压缩值,这包括通过以下来进行:至少部分地基于集合指示符和集合内信息来确定是否在编码期间从集合内信息中排除了未压缩值中的无关位;以及生成未压缩值,这包括通过以下来进行:在确定了在编码期间从集合内信息中排除了未压缩值中的无关位的情况下,将替换位插入到集合内信息中以便获得未压缩值。下面更详细地描述这一点的一些示例。
在506处,输出与滑动窗口中的重复序列相关联的未压缩值。例如,未压缩值可以是指定了滑动窗口内的从当前位置或时间索引起的重复序列的开始的偏移。然后,将检索到的重复序列插入到未压缩和/或输出数据的流中(例如,代替对重复序列的引用和/或关于重复序列的信息)。
下图描述了具有特定偏移值、分区位置和窗口大小的一些解码示例。
图6A是图示了当w1=9和w=12时在替换位插入之后的解压缩的偏移的实施例的表。在这个示例中,存在一个分区和两个集合(参见例如图4A),并且X的解码值与图4D的示例中的那些相匹配。在这个示例中,最左边的列(600)示出了一些示例性接收到的集合指示符(SI),并且从左数第二列(601)示出了对应的接收到的集合内信息(ISI)。
如上面所描述的,在编码期间将无关位从集合内信息的排除是可检测的,这是因为由接收到的集合内信息(601)指示的值与和接收到的集合指示符(600)相关联的值的范围不匹配。例如,在第二行(606)中,接收到的集合内信息(601)具有基10值0,但是接收到的集合指示符(600)指示该值应当在512与1023之间。对于第三行(607)也是如此,其中接收到的集合内信息(601)具有值511,并且接收到的集合指示符(600)具有值1,其彼此是矛盾的。
因此,将具有值1的替换位插入(例如,在从右数第10位处)到所接收的集合内信息(601)中,以获得第二和第三行(606和607)中的经修改的集合内信息(602),这是因为接收到的信息是矛盾的。被插入的替换位在从右数第二列(602)中用下划线来指示。描述这一点的另一方式是:当接收到的SI(600)和接收到的ISI(601)彼此矛盾时,将(例如,当w1=9时为512)加到接收到的ISI(601),以获得经修改的ISI(602)。经修改的集合内信息(602)(如果有的话)或接收到的ISI(601)(如果适当的话)然后被用来获得在最右边的列(603)中示出的X的解码和/或未压缩值。
相比之下,第一行和第四行(605和608)具有彼此不矛盾的集合指示符(600)和集合内信息(601),并且因此针对那些示例,不会生成经修改的集合内信息(602);针对那些行(605和608)的X的解码值是从接收到的集合内信息(601)而生成的。
下图更加正式地和/或一般地描述了这一点。
图6B是图示了在一个分区和两个集合的情况下利用替换位插入的解码的实施例的表。在这个示例中,这个表中的解码对应于图4E中所示的编码。左边的列(610)和中心列(611)分别示出了接收到的集合指示符(SI)和接收到的集合内信息(ISI),并且包括压缩值。在一些实施例中,以所示的次序来执行检查(例如,以需要从存储装置中读出的最少数目的接收到的ISI位开始,并且结束于最多数目的接收到的ISI位)。
在顶部行(615)中,如果接收到的SI=0并且接收到的ISI≤−1(这不是矛盾的陈述),则偏移的解码值(或其他值)是接收到的ISI,并且具有w1位。
在中间行(616)中,如果接收到的SI=1并且接收到的ISI≤−1(这是矛盾的陈述),则确定或以其他方式得出结论:在编码期间排除了无关位,并且插入对应的替换位,例如通过将加到接收到的ISI(其具有(w−1)位)以获得解码值。
在底部行(617)中,如果接收到的SI=1并且接收到的ISI在[,2w−1]的范围内,则经解码的偏移(或其他值)是接收到的ISI,其在这个情况下具有w位。
如这个示例中所示,在一些实施例中,滑动窗口中的第一分区位于处;以及生成未压缩值进一步包括:确定多个集合中的哪一个由集合指示符来指示;以及在(1)确定了在编码期间从集合内信息中排除了未压缩值中的无关位并且(2)确定了集合指示符指示第一集合的情况下,插入替换位包括将加到集合内信息。
要注意的是,不同的位长度是取决于解码值来读出的(参见例如图6B中的右边的列(612)中的不同位长度)。在一些应用中,可能期望避免从某个缓冲器、移位寄存器、存储接收到的位序列(例如,接收到的集合指示符、接收到的集合内信息等)的其他存储器中读出额外的位。因此,在一些实施例中,滑动窗口中的第一分区位于处;以及生成未压缩值(例如,在图5中的步骤504处)进一步包括:确定多个集合中的哪一个由集合指示符来指示;并且在确定了集合指示符指示第一集合的情况下,从至少存储集合内信息的存储器或存储装置中读出对应于集合内信息的w1位。参见例如图6B中的顶部行(615)。
在一些实施例中,滑动窗口具有2w的大小;滑动窗口中的第一分区位于处;并且滑动窗口中存在两个集合;以及生成未压缩值进一步包括:确定多个集合中的哪一个由集合指示符来指示;在确定了集合指示符指示第一集合的情况下,从至少存储集合内信息的存储装置中读出对应于集合内信息的w1位;以及在确定了集合指示符指示第二集合并且集合内信息小于或等于−1的情况下,从该存储器中读出对应于集合内信息的w−1位。参见例如图6B中的顶部和中心行(615和616)。
下图图示了使用包括一个或多个分区的滑动窗口来输入压缩数据并且输出解压缩数据的解码器的示例。
图7是图示了使用包括一个或多个分区的滑动窗口来输入压缩数据并且输出解压缩数据的解码器的实施例的示图。这里所示的示例性解码器(700)对应于图3中所示的示例性编码器(300)。为了保持该示图的可读性以及为了简单性,图3中所示的一些部件(例如,集合(312a和312b)、分区(313)和延迟匹配(310))在这里未图示。
被压缩的输入数据被传递到解码器(700)中的区段划分器(702)。在这个示例中,输入数据包括不同的区段、与重复序列相关联的区段(例如,由偏移和长度对所描述的)、以及不与重复序列相关联并且包含未压缩数据本身的区段(例如,在编码器处不能够针对那个区段来标识重复序列)。例如,区段划分器可以寻找标识这种区段的开始的保留的首部或特定序列,或者知道先前区段的大小,并且对位/符号进行计数以确定下一个区段的开始。
对于不与重复序列相关联的那些区段,区段划分器(702)将输入数据输出到多路复用器(704),使得多路复用器可以将那些区段作为未压缩的输出数据来输出。那些区段也由区段划分器(702)传递到具有(多个)分区和集合的滑动窗口(706),使得如果需要,则它们可用于未来的检索。
对于与重复序列相关联的那些区段,区段划分器(702)将那个区段(例如,包括经压缩的偏移和经压缩的长度)输出到偏移和长度解压缩解码器(708)。在一些实施例中,这个解码器(708)执行图5的解码过程。
偏移和长度解压缩解码器(708)向序列取出器(710)输出(标称)偏移和长度,所述序列取出器(710)在指定的偏移处访问滑动窗口(706),并且检索指定的长度以获得重复序列。滑动窗口(706)可以更新其自身以反映刚刚取出的重复序列(例如,在数据的区段随后被引用并且需要被拷贝的情况下)。
由序列取出器(710)将重复序列传递到多路复用器(704),所述多路复用器(704)输出重复序列作为解压缩的输出数据。一般来说,多路复用器将酌情地在针对不与重复序列相关联的那些区段的区段划分器(702)和针对与重复序列相关联的那些区段的序列取出器(710)之间进行切换(例如,多路复用器的控制或选择信号由区段划分器(702)取决于当前区段来控制)。
简要地返回到图4A中所示的示例性滑动窗口,要注意的是,本文中描述的技术不一定局限于或以其它方式限制于具有两个分区的滑动窗口。下图描述了具有两个分区和三个集合的编码和解码示例,从中可以推断出具有另外分区/集合的实施例。
图8A是图示了在无关位消除之前使用具有两个分区和三个集合的滑动窗口的部分编码方案的实施例的表。如在上面的两集合示例中那样,这仅仅是编码方案的一部分,使得可以说明无关位(其稍后被丢弃)。
在这个示例中,左边的列(800)示出了对应于三个集合中的每一个的偏移值(X):按照顶部到底部的行(805-807)分别是X≤−1、≤X≤−1以及≤X≤2w−1。中心列(801)示出了用于三个集合中的每一个的集合指示符的值:0、10和11。如这个示例中所示,在一些实施例中,集合指示符是可变长度字段(例如,1或2位的长度)。右边的列(802)示出了用于三个集合中的每一个的部分编码的集合内信息的值:X的w1位(参见顶部行(805))、X的w2位(参见中间行(806))、以及X的w位(参见底部行(807))。
下图示出了那三个分区内的一些特定值。
图8B是图示了当w1=8、w2=10和w=12时的经编码的偏移的实施例的表,其中使用两个分区和三个集合来消除无关位。在这个示例中,最左边的列(810)示出了偏移(X)的一些示例值。从左数第二列(811)以二进制示出了那些偏移值。从右数第二列(812)示出了经压缩的偏移,包括集合指示符(SI)和集合内信息(ISI),其中无关位以删除线示出并且被丢弃。这类似于上面描述的两分区示例,并且为了简洁性,在这个示例中跳过了这个讨论。为了帮助在集合指示符(SI)与集合内信息(ISI)之间进行区分,在经压缩的偏移列(812)中,在两者之间插入垂直线。最右边的列(813)示出了集合指示符(SI)和集合内信息(ISI)的长度(即,经压缩的偏移的长度)。
在第一行(820)中,示例偏移值是255,其以二进制是1111 1111,并且具有经压缩的偏移0 | 1111 1111。这产生了9位的经压缩的长度。
第二行和第三行(821和822)示出了其中可以丢弃无关位的示例偏移值。在那些示例中,偏移值是256和511,其以二进制分别是1 0000 0000和1 1111 1111。二进制列(811)中的偏移(X)在那些行(821和822)中具有加下划线的前导位和/或无关位。那些值的经压缩的偏移是(即,在丢弃了删除位(struck through bit)之后是10 | 0 00000000)和(即,在丢弃了删除位之后是10 | 0 1111 1111)。这将经压缩的长度从12位减少到11位。
在第四行和第五行(823和824)中,示例偏移值是512和1023,其以二进制分别是100000 0000和11 1111 1111,并且具有10 | 10 0000 0000和10 | 11 1111 1111的经压缩的偏移。这对应于12位的经压缩的长度。
第六和第七行(825和826)示出了其中丢弃了(第二)无关位的示例偏移值。这里的示例偏移值是1024和2047,其以二进制分别是100 0000 0000和 111 1111 1111,其中无关位和/或前导位被加下划线。那些值的经压缩的偏移是(即,11 | 0000000 0000)和(即,11 | 011 1111 1111)。这将经压缩的长度从14位减少到13位。
第八行(827)示出了示例偏移值2048,其以二进制是1000 0000 0000;这导致了具有14位的长度的经压缩的偏移11 | 1000 0000 0000。
下表更加一般地和/或正式地示出了这一点。
图8C是图示了经编码的偏移的实施例的表,其中使用两个分区和三个集合来消除无关位。在这个示例中,最左边的列(830)示出了偏移的值,从左数第二列(831)示出了对应的集合指示符(SI),从右数第二列(832)示出了对应的集合内信息(ISI),并且最右边的列(833)示出了经编码的偏移的长度(即,集合指示符和集合内信息的长度)。
第一行(840)示出了X≤−1范围中的偏移值。这些偏移值用0的集合指示符(SI)以及包括X的w1位的集合内信息(ISI)来编码,这产生了w1+1的长度。
第二行(841)示出了≤X≤−1范围中的偏移值。这些偏移值用10的集合指示符(SI)以及包括X的w2−1位的集合内信息(ISI)来编码(例如,X的前导位被丢弃),这产生了w2+1的长度。
第三行(842)示出了≤X≤−1范围中的偏移值。这些偏移值用10的集合指示符(SI)以及包括X的w2位的集合内信息(ISI)来编码,这产生了w2+2的长度。
第四行(843)示出了≤X≤−1范围中的偏移值。这些偏移值用11的集合指示符(SI)以及包括X的w−1位的集合内信息(ISI)来编码(例如,X的前导位被丢弃),这产生了w+1的长度。
第五行(844)示出了≤X≤2w−1范围中的偏移值。这些偏移值用11的集合指示符(SI)以及包括X的w位的集合内信息(ISI)来编码,这产生了w+2的长度。
如图8A-8C的示例中所示,在一些实施例中,多个分区中的第一分区具有的大小;多个分区中的第二分区具有的大小;在未压缩值在[,−1]范围内的情况下:未压缩值被确定成包括无关位;以及从集合内信息中排除的未压缩值中的无关位包括[,−1]范围内的前导位;以及在未压缩值在[,−1]的范围内的情况下:未压缩值被确定成包括无关位;以及从集合内信息中排除的未压缩值中的无关位包括[,−1]范围内的前导位。
在一些实施例中,滑动窗口(例如,图3中的滑动窗口(302)和/或图7中的滑动窗口(706))在SRAM上实现。虽然SRAM由于其节省功率和降低大小的能力而具有吸引力,但是在SRAM上存储滑动窗口会对所标识的匹配和/或重复模式的最大长度具有负面影响。例如,假设图3中的滑动窗口(302)具有212的大小(即w=12),但是滑动窗口被存储在读取大小为256的SRAM上(例如,SRAM的单次读取返回大小为256(例如,位或字节)的读取数据)。作为其结果,匹配标识器(例如,图3中的匹配标识器(304))可被限制到标识最大长度为256(即,读取大小)的重复模式,即使滑动窗口更大。
特别地,单个游程(run)(例如,其中单个符号或位被重复R次的序列)可能具有大于读取大小的游程长度(R),并且针对单个游程使用上面描述的编码技术是低效的。为了改进压缩率,在一些实施例中,上面描述的示例性编码过程具有其中对单个游程不同地进行编码和/或处理的特殊和/或极端情况。下图示出了这一点的示例。
图9是图示了在两个分区和三个集合的情况下利用替换位插入的解码的实施例的表。在这个示例中,左边的列(900)示出了接收到的集合信息,中心列(901)示出了接收到的集合内信息,并且右边的列(902)示出了解码值(在这个示例中,为长度(X))。在一些实施例中,解码检查以这里所示的次序来执行(例如,从顶部行(910)到底部行(914))。
如第一行(910)中所示,如果接收到的集合信息是0,并且接收到的集合内信息小于或等于−1,则解码值是接收到的集合内信息,其中从存储接收到的集合内信息的存储器或存储装置中读出接收到的集合内信息的w1位。
按照第二行(911),如果接收到的集合信息是10,并且接收到的集合内信息小于或等于−1,则解码值是接收到的集合内信息加上,其中接收到的集合内信息具有
w 2−1位。
按照第三行(912),如果接收到的集合信息是10,并且接收到的集合内信息在[,−1]的范围内,则解码值是接收到的集合内信息,其中接收到的集合内信息具有
w 2位。
按照第四行(913),如果接收到的集合信息是11,并且接收到的集合内信息小于或等于−1,则解码值是接收到的集合内信息加上,其中接收到的集合内信息具有
w−1位。
按照第五行(914),如果接收到的集合信息是11,并且接收到的集合内信息在[,2 w −1]的范围内,则解码值是接收到的集合内信息,其中接收到的集合内信息具有
w位。
图10是图示了通过在标称偏移和长度对中包括游程长度来编码单游程序列的编码过程的实施例的流程图。在一些实施例中,该示例性过程由图3中的匹配标识器(304)来执行。在一些实施例中,结合图1的编码过程来执行该示例性过程。
在1000处,接收未压缩数据。参见例如图3中的被输入到匹配标识器(304)的未压缩数据。
在1002处,在未压缩数据内标识具有独立于滑动窗口的游程长度(R)的单游程序列。例如,除了在未压缩数据内找到也出现在滑动窗口中的重复序列之外,匹配标识器(304)还可以(替代地)将未压缩数据的区段标识为单游程序列。例如,如果进入匹配标识器(304)中的未压缩数据是全0或全1的游程,则匹配标识器可以将其标记为单游程序列。
在1004处,针对单游程序列来生成标称偏移和长度对,该标称偏移和长度对包括被设置成单游程序列的游程长度的标称偏移和被设置成1的长度。如本文中所使用的,标称偏移和长度对是一对值,其在一些情况下(例如,当长度大于或等于2时)是相对于滑动窗口和/或在滑动窗口内的偏移和长度,但是在其他情况下(例如,当长度等于1时),(标称)偏移不是滑动窗口内的偏移(位置),而是更确切地说在重复前面的符号或位中使用的游程长度。
在1006处,输出针对单游程序列的标称偏移和长度对。例如,图3中的匹配标识器(304)可以将标称偏移和长度对输出到偏移和长度压缩编码器(306)以用于如上面所描述的压缩。
下图图示了对应的解码过程的示例。
图11是图示了解码单游程序列的解码过程的实施例的流程图,其中游程长度被包括在标称偏移和长度对中。在一些实施例中,该示例性过程由图7中的序列取出器(710)来执行。在一些实施例中,结合图5的解码过程来执行该示例性过程。
在1100处,接收标称偏移和长度对,该标称偏移和长度对包括被设置成单游程序列的游程长度的标称偏移和被设置成1的长度。参见例如图7中的序列取出器(710),其输入(标称)偏移和长度。
在1102处,响应于标称偏移和长度对中的长度等于1,生成单游程序列,这包括通过以下来进行:使用游程长度并且在不访问滑动窗口的情况下重复前面的符号。例如,在出现单游程序列的情况下,序列取出器可以存储最近的符号或位。为了执行拷贝操作,在一些实施例中,可以调用memset(或类似)命令(例如,在计算机软件实施例中),或者可以使用(例如,字节)复制电路(例如,在硬件实施例中)。
相比之下,如果标称偏移和长度对中的长度大于或等于2,则在指定偏移处并且针对指定长度来访问滑动窗口,以获得重复序列。
在1104处,输出包括单游程序列的未压缩数据。如上面所描述的,这个未压缩数据可以包括在编码器处针对其没有标识出重复序列的区段(参见例如图7中的多路复用器(704)处的A输入)、或从滑动窗口(例如,图7中的滑动窗口(706))取出的重复序列的区段等等。
虽然出于清楚理解的目的已经对前述实施例进行了一些详细描述,但是本发明不限于所提供的细节。存在实现本发明的许多替代方式。所公开的实施例是说明性的,并且不是限制性的。