适合数据压缩的方法和设置的制作方法

文档序号:7504631阅读:260来源:国知局
专利名称:适合数据压缩的方法和设置的制作方法
背景技术
数据压缩是指缩减表达已知信息所需数据量的过程。缩减过程的基础是除去冗余或不必要的数据。数据压缩技术可以降低信息存储及信息传输的费用。数据压缩技术被用于许多方面,从简单的文件缩小到语音及视频信号的编码都可用到数据压缩技术。
数据压缩分为二种类型无损压缩和有损压缩。在无损压缩中,在编码器输入的源信息会在解码器的输出中进行严格的检索。在有损压缩中,信息不进行严格的检索,但损失的信息量对于使用这种压缩技术的情况而言是可以接受的。有损压缩主要用于语言、音频、图像及视频信号的压缩。压缩算法的目的在于使用最少量的字节数来表达信号,同时又可保持这一信号可被解读和感知。所有人类感官不能察觉的信息都可以被除去。
无损失压缩技术用应用的情况于不允许有信息损失,例如用于压缩可执行文件、源代码文件、卫星图像以及医疗成像。无损压缩技术也会在有损压缩方案中得到部分应用,以期得到更佳的压缩比。
一项用于无损压缩的著名技术就是LZW算法,LZW算法是一项通用算法,该算法的基础是根据固定规则对字符串进行解析。该算法基于一个概念,这个概念就是经常使用的序列可以使用比表达整个序列所需数量更少的字节进行编码。LZW算法需要对带有源字符的表格进行初始化处理。在起动编码过程之前,符号的宽度要被选定,符号的源字符被生成并被存储在编码器和解码器的编码表格中。当对收到的符号序列进行编码时,LZW算法将选定的符号(词汇)序列添加到代码库时,代码库中含有的序列可以用少于表达整个序列所需数量的字节进行编码。源字符的大小与符号的宽度无关。举例而言,宽度为1比特(8个字节)的符号需要28(256)输入的源字符,宽度为2比特(16字节)的符号需要216(64K)输入的源字符。一般而言,LZW算法用于宽度为1比特的符号。LZW算法对编码表进行搜索以便找到与所收到的符号序列相配的最长源字符,并将代码库中存储的与符号串相配的最长源字符索引发送出去。


图1表明的是执行无损数据压缩的编码器和解码器中所用到的以往LZW算法的编码表100。这一LZW编码表可能是一个三元可设定地址的内存。编码器使用存储在LZW编码表100中的源字符106和代码库108对输入的符号序列102编译成索引值序列。编码器110中的编码表100和解码器112中的解码表120含有源字符106和代码库108。索引序列114由编码器110传输出去,并由解码器112进行解码。解码器112输出的字符串104与输入的符号序列102具有相同的符号。在编码器110开始对输入的符号序列102进行编码之前,源字符106被存储于编码器110和解码器112的LZW编码表100中。从编码器110发送至解码器112的索引序列114或者是存储在源字符106中的无格式文本符号,或者是存储在代码库108中的符号串索引。编码器110和解码器112通过依据初始的源字符来获悉新的符号序列,并由此在各自的代码库中独立地创建输入项。编码器110在代码库中添加入新的符号序列,并将以前获悉符号或符号序列的索引以索引序列114这一形式发送给解码器112。解码器同样获悉新的字符串,并将新的字符串存储在代码表108中LZW解码表120的新索引位置上。
图2表明的是以前的LZW技术对图1所示的编码器输入的字符串进行压缩的过程。在编码器110开始对输入的字符串进行解析或解码器开始解码之前,源字符106被存储在LZW编码表100中。在编码表100和解码表120中,8位字符所用的源字符106存储在索引0~255的位置上。源字符106中256地址的5项内容被显示出来。符号“/”存储在索引47的位置上,符号“b”存储在索引98的位置上,符号“d”存储在索引100的位置上,符号“e”存储在索引101的位置上,符号“t”存储在索引116的位置上,符号“w”在座在索引119的位置上。LZW编码表100中源字符106的索引256位置上的另一输入项256存储着字符串结束码,LZW编码表100中代码库108的索引257位置上的输入项257存储着溢出码。
输入的字符串102被编码器110所接收。编码器110对输入的字符序列102进行解析,并发送出索引序列114。编码器110通过对输入的字符序列102进行解析并通过在LZW编码表100中搜寻与这一字符序列相匹配的最长对应码来对字符序列102进行编码。输入的字符序列102作为索引序列被发送出去,用于LZW编码表100的输入。索引可以是源字符106或代码库108中某一输入项的指示符。
正如LZW编码表100所示的,存储有符号“/”的源字符106中输入项的索引为47。编码表100最初只存储有源字符106。当编码器收到字符序列102时,编码器根据字符的宽度来对字符序列102进行解析。编码器选择字符序列102中的某一字符,并在LZW编码表100中搜寻这一字符。编码器通过将已知的字符与该字符序列加合起来来获悉代码词汇。如果这一字符被找到了,则这一字符与下一字符进行加合,然后在LZW编码表100中针对由这二个字符形成的字符序列进行搜寻。如果该字符序列没有存储在LZW编码表100中,则前一个被识别出字符的索引或字符序列的索引被发送出去,这一新的字符序列被添加到LZW编码表100中。
使用LZW算法的编码器操作过程可通过输入字符序列102和宽度为一个字母(8位)的字符加以说明;如图2所示,字符串102为“/wed/we/wee/web/wet/”。编码表100存储有初始字符,初始字符对于每个8位字符都有一个输入项,其中字符包括“/”、“w”、“e”、“d”、“b”和“t”。
对输入字符序列102的解析是从符号“/”开始的,符号“/”存储在LZW编码表100中索引为47的位置上,“/”与下一个字符“w”进行加合。编码器会在编码表中搜寻字符串“/w””,由于LZW编码表100中没有存储“/w”,所以编码器通过在下一个序列索引258存储“/w”来获悉“/w”。“/”的索引,即47这一已被识别字符的索引在索引序列104中被发送出去。
对字符序列102的解析接下来从字符“w”开始。编码器在LZW编码表100中搜寻字符“w”。字符“w”存储在LZW编码表100中索引为119的位置上,字符“w”与下一字符“e”进行加合,编码器在编码表中搜寻字符串“we”。由于“we”并未存储在编码表100中,所以字符串“we”是通过被存储在下一个序列索引259中而被获悉的。
对字符序列102的解析接下来从字符“e”开始。字符“e”存储在LZW编码表100中索引为101的位置上,字符“ e”与输入字符串的下一字符“d”进行加合,编码器在编码表中搜寻字符串“ed”。由于“ed”并未存储在编码表100中,所以字符串“ed”是通过被存储在下一个序列索引260中而被获悉的。前一个被识别出字符“e”的索引,即101在索引序列104中被发送出去。
对字符序列102的解析接下来从字符“d”开始。字符“d”存储在LZW编码表100中索引为100的位置上,字符“d”与输入字符串的下一字符“/”进行加合,编码器在编码表中搜寻字符串“d/”。由于“d/”并未存储在编码表100中,所以字符串“d/”是通过被存储在下一个序列索引261中而被获悉的。前一个被识别出字符“d”的索引,即100在索引序列104中被发送出去。
对字符序列102的解析接下来从字符“/”开始。字符“/”存储在LZW编码表100中索引为47的位置上,字符“/”与输入字符串的下一字符“w”进行加合,编码器在编码表中搜寻字符串“/w”。由于“/w”存储在编码表100的索引258处,字符“/w”与输入字符串102的字符“e”进行加合,编码器在编码表中搜寻字符串“/we”,由于“/we”并未存储在编码表100中,所以字符串“/we”是通过被存储在下一个序列索引262中而被获悉的。前面被识别出字符串“/w”的索引,即258在索引序列104中被发送出去。
举例而言,对于宽度为8位的字符而言,如果找到了与24位字符串“/we”相匹配的内容,则编码器向解码器发送一个9位的索引(字符串“/we”存储在代码库中的地址)。这样就把传递的位数从24降到了9。在收到9位的索引后,解码器将存储在9位索引中的字符串“/we”恢复到代码库的拷贝中。如果代码库中没有相匹配的序列,则编码器发送单个字符“/”、“w”和“e”的索引。
发送字符串102这20个符号需要160位(20符号×8位/符号)。LZW算法将发送的位数降到了126位(14索引×9位)。在输入的字符串102被解析的同时,编码表100中代码库108所存储的代码词汇在增加,存储在编码表中字符串的长度也在增加。举例而言,索引264代表着4个字符的字符串“/wee”。
存储在编码表中的字符串越大,则压缩效果越好,因为所传送索引的数量降低了。通过增加字符的宽度也可以改善压缩效果。然而,字符宽度每增加1位,则LZW算法所需要的初始源字符就要增加2个。因此,对于宽度为几个字节的字符而方言,对初始源字符进行编码将需要一个很大的表,以致于大到不合实用的程度。
发明概述本发明不需对代码库中的源字符进行初始化处理。在本发明中,源字符和代码词汇是在对输入的字符串进行编码过程中而被获悉并被存储到代码库中。
此外,在以前的LZW算法中,较大的字符需要较大的字符索引宽度。一个由256个单字节符号组成的字符需要以9位索引开始,16384个双字节符号组成的字符需要的初始索引为17位。索引的宽度会直接影响到压缩比。在本发明中,字符的大小对索引宽度没有直接的影响。此外,只有被源用到的符号才被添加到代码库中去。因此,本发明适用于稀疏源。
对代码库进行搜索,以便找出在字符串中所收到的符号或符号序列。一旦发现代码库中没有存储这一符号,则通过将其存储在代码库中来获悉这一符号,该无格式符号以编码单词的形式被发送出去。
一旦发现代码库中存储有某一符号或符号序列,则符号或符号序列在代码库中所存储位置的索引以编码代码形式被发送出去。代码字前缀区的状况可以表明代码字的内容是要被获悉的无格式符号,还是一个索引。代码库的索引可以根据已获悉符号的数量或字符序列的数量而改变宽度。
符号的宽度可以根据数据的类型进行选定。举例而言,在文本传输过程中,一个单字节可方便地定义一个字母。然而,对于音频或视频数据而言,在符号更宽的情况下对数据流进行解析会得到更好的压缩效果。因为并不是所有的符号都一开始就存储在代码库中,而是在它们出现时才被存储起来,所以可以使用宽度大的符号,而不必担心内存出现初始过载问题。
图示简介通过本文下面结合所附图示对优选实施方案的更具体说明,可以清楚地理解前面所述的本发明的各种目的、特点及优势;在不同图形中相同的参照字符代表相同的部件。所附图形并不一定是按比例绘制的,为了表明本发明的原理,图形中有着重强调的地方。
图1表明的是在使用以前LZW技术执行无损数据压缩时编码器形成的编码表以及解码器形成的解码表。
图2表明的是以前的LZW技术对图1所示编码器中输入字符串进行的压缩过程。
图3表明的是根据本发明的原理进行无损压缩时,编码器所形成的编码表以及解码器所形成的解码表。
图4A表明的是编码器以无格式符号方式在编码字符串中发送出去的代码字符,无格式符号为图3所示的编码器所获悉。
图4B表明的是某一符号在被发送的字符串中的代码字符,该符号是已被获悉的符号,并被存储在图3所示的编码表和解码表中。
图5所示的是在将输入字符串编译成被发送的编码代码时,图3所示的编码器形成的编码表以及控制逻辑。
图6是流程图,它表明了在对输入字符串进行编码时,图5所示的控制逻辑所使用的方法。
图7是流程图,它表明了在确定索引宽度和代码库的状态时,图6中步骤618所执行的步骤。
图8A-8B是流程图,它表明了在对接收到的编码字符串进行解码时,图3所示解码器所使用的方法。
图9表明的是输入的字符串、在对输入字符串进行处理后编码器代码库中的内容以及编码后的字符串。
本发明的详细说明本发明优选实施方案的说明如下。
图3中含有根据本发明原则进行无损压缩的编码器310以及解码器312;编码器含有编码表300,解码器含有解码表320。编码器310和解码器312在代码库308未存储初始源字符的状态下开始编码和解码。当编码器对输入的字符串302进行解析时,其中的字符被获悉。输入字符串以符号为单位被解析。符号可以是任意宽度的,例如符号可由多个字母组成。在编码器输出的每个编码代码前面会加上一个1位的前缀,这样可使解码器获悉这一字符。当编码器310获悉一个符号时,编码器310按无格式方式以编码代码的形式将这一符号发送出去,并在编码代码前面加上1位被指定为“0”的前缀。如果该符号为已知符号,则编码器310在发送的索引前面加上一位被指定为“1”的前缀。在本发明中,符号的宽度没有限制,因为在本发明中没有受限于内存容量的初始表格。字符是被动态获悉的。为了对编码单词进行解码,解码器312首先要识别表明数据类型的前缀位。如果这一位的数值为“0”,则解码器312将这一符号直接输出。如果这一位的数值为“1”,则解码器使用代码库对索引对编码代码进行翻译。
每当有无格式符号发送到解码器312时,解码器312便将收到的符号添加到解码器的代码库308中。因此,不需要储存整个源字符。而且,只有解码器所收到的符号才被存储在代码库308中。
编码器310接收输入的字符串302,并使用编码表300中代码库308所存储的符号或符号串来对输入的字符串进行压缩,压缩后将编码的字符串314发送出去。在某一实施方案中,编码字符串314可以以数据包的形式在网络上进行传输,并在接收地的解码器进行解码。在另一实施方案中,经编码后的数据可以被传送到存储装置中。
与以往的LZW算法不同,在编码器310开始对输入字符串302进行解析之前,该符号的源字符并未存储在编码表300中。编码器310是在对输入字符串302进行解析时获悉该源字符和编码代码的。编码器310将新获悉的符号按无格式方式以编码字符串314这一形式发送出去,这样解码器可以获悉到源字符。
编码器310所收到的字符串302被进行编码,以便去除冗余或不必要的数据。编码器310依据所选定的符号宽度以及存储在编码表300中的代码库308对收到的字符串进行编码。经编码后的字符串314被发送给解码器312。编码后的字符串314是一串编码单词。每个编码单词都含有符号或索引,该索引与代码库308中储存的符号串相对应。
解码器312从接收到的编码字符串314获悉源字符和代码词汇,并将它们存储在解码表320的代码库308中。解码器312根据代码库308中获悉的源字符及编码代码来对接收到的编码字符串314进行解码,从而提供原始的字符串。
在某一实施方案中,编码器310中的编码表300和解码器312中的解码表320形成于二元或三元内容可编地址内存中。该内容可编地址内存具有搜索和学习功能。如果在内容可编地址内存中没有搜索索引存在,则搜索和学习功能可以使内容可编地址内存获得搜索索引。如果在内容可编地址内存的输入项中存储有搜索索引,则内容可编地址内存返回到与搜索索引相对应的地址。如果在内容可编地址内存的输入项中没存储搜索索引,则内容可编地址内存通过将新的搜索索引存储在内容可编地址内存的输入项中来获悉一个新的搜索索引。
编码表300和解码表320使用二个输入项进行初始化处理,这二项输入为字符串结束316和溢出码318。当发送溢出码318的索引时,则表示编码表300已满。当编码表300已满时,除字符串结束和溢出码外,其余所有的输入均被清除,当收到字符串时,字符和编码代码再被重新获悉。溢出码被发送给解码器,这样解码器312可以对其解码表320进行初始化处理。编码表300的初始化处理将在下面结合图6进行说明。字符串结束这一输入项的索引在编码过程结束时被发送出去。
由于不需要初始源字符,所以符号的宽度不再受到来自于存储初始源字符所需的内存的限制,此外,初始索引的宽度也不再受到源字符大小的影响。因为符号是通过编码字符串312发送的,这可使解码器312获悉新的字符,所以在编码过程中可以对符号的宽度进行修改。在编码过程中可以对压缩比进行监测,为了提高压缩比可以适当修改符号的宽度。举例而言,在互联网上进行数据交换时,被压缩数据的类型可转换成用户所需的数据类型。举例而言,用户所需的文件类型可从音频文件转变成图像文件,然后再转成文本文件。在本发明中符号的宽度可随被传送文件类型的变化而变化,这样对于所收到的特定字符串而言,符号的宽度可以进行优化选择。同样,较大的符号,如在一幅图像中一个4×4像素块(16字节)可在无需较大存储初始源字符的内存情况下被压缩。
符号的最大宽度取决于编码表300和解码表320的物理宽度。举例而言,一个7字节(56位)的符号可以存储在一个72位宽的内容可编地址内存中。72位宽的内容可编地址内存提供56位(7字节)来存储这一符号,再提供14位来存储另一内容可编地址内存输入的索引。144位的内容可编地址内存可以存储更宽的符号。从编码器310发送到解码器312的编码字符串314中编码单词的格式将结合图4A-4B进行说明。
在另一实施方案中,编码器310和解码器312可以作为指令存储在内存中并由处理器执行。
图4A表明的是编码字符串314的编码代码,编码字符串314是图3所示的编码器310在发送所获悉的无格式符号时发送出去的。当编码器310通过将无格式符号存储在编码表300中而获悉一个新的符号时,编码器310按无格式方式以编码字符串314的形式将这一符号传送给解码器312。该符号以存储在无格式符号区406中的无格式方式被传送出去。无格式符号区406的前面有一个前缀位404。前缀位404被定为“0”以表明后面跟着的是无格式符号。举例而言,如果符号的宽度为2字节,且被获悉的符号为“/w”,则“/w”存储在无格式符号区406中,“0”被存储在前缀位404中。
图4B表明的是编码字符串314中的编码代码,这里的编码字符串314是编码器在发送已知的符号或字符串时发送出去的;这些已知的符号或字符串存储在图3所示的编码表300中。编码单词包括表格索引区408,该索引区前面有前缀位。表格索引存储在表格索引区408中,在表格索引区408之前是被指定为“ 1”的前缀位。表格索引区408存储着该输入项的索引,输入项存储着编码表300和解码表320中的符号或字符串。
表格索引区408的宽度是依据编码表300和解码表320中存储的输入项数量而变化的。举例而言,如果编码表300和解码表320存储的输入少于4个,则表格索引区408的宽度为2位。如果编码表300和解码表320存储的输入在128至255之间,则表格索引区408的宽度为8位。
图5表明的是控制逻辑500以及图3所示的编码器在将输入字符串502编译为编码字符串314时所用的编码表300。控制逻辑500对输入字符串502进行解析以生成编码字符串314。控制逻辑所发送的编码字符串314含有编码单词,编码单词含有无格式符号或表格索引;无格式符号存储在无格式符号区406中,无格式符号区406前面的前缀位404被定为“0”,表格索引存储在表格索引区408中,表格索引区408前面的前缀位404被定为“ 1”。
输入字符串502含有多个符号。符号的宽度是可变的,符号可以是单字母或单字节(8位),或多字节的。符号的宽度可以根据输入字符串502中数据的类型而动态地进行改变。举例而言,如果正在处理的是文本文件,则符号宽度可选定为一个字母(8位)。如果正在处理的是图像文件,则符号宽度可以是16字节。控制逻辑500依据所选定的符号宽度来对输入字符串502进行解析。
符号的宽度是可以动态变化的。编码器310可以对压缩比(输入位数/输出位数)进行监测,如果这一比值低或突然下降,则控制逻辑500所执行的压缩算法可动态地试用不同的符号宽度并选定具有最佳压缩比的宽度。举例而言,对于压缩比要设定某些阈值,当压缩比达到阈值水平时,符号的宽度就要改变,并且对符号的宽度进行试用。符号宽度改变时的代码要保存下来,且编码器310和解码器312之间要达成约定,这样解码器312才会识别出新的符号宽度。
此外,每当编码器310改变符号宽度时,编码器会在新的符号宽度之后发送一个特定保留的代码(不为代码库中字符串所使用的代码)。
改变符号宽度的一种方法是清空整个编码表300并重新获悉具有新宽度的符号。如果新的符号宽度可以立即给出高的压缩比,则这种方法是有效的。但如果新宽度不适合于输入字符串502(图5)中数据的类型,则这种改变符号宽度的方法可能具有损害性。
另一种可用的方法是清除代码库308中的一部分,例如将不具有多个新符号宽度的字符串除去。这是一种中间方案,因为新的符号宽度会从代码库308(图3)中已获悉的字符串开始。
控制逻辑500包括字符串寄存器512、输入字符串指针514、索引精密度寄存器516、当前字符串长度寄存器518、输入数量寄存器520和最终添加长度寄存器522。控制逻辑500使用字符串寄存器512和输入字符串指针514来对输入字符串502进行解析,并使用索引精密度寄存器516来追踪编码字符串314所发送的编码代码中表格索引区408要发送的位数。字符串寄存器512被用来存储搜索索引,输入字符串指针514被用来存储当前正在为控制逻辑500(图5)所处理的输入字符串502中符号的指针。
输入寄存器520的数量每当符号或字符串被添加到代码库308中时便会增加。编码器310会对输入寄存器520的数量进行监测以便检查代码库308是否已满。一旦检查到代码库308已满,则编码器310清空其代码库308,并将溢出码发送给解码器,这样解码器也会清空它的代码库308(图3)。
最新添加长度寄存器522中的内容被用来对字符串的长度进行追踪,被追踪的字符串是最新添加到代码库308中去的。如果该寄存器被定为“1”,则有一个符号新添加到代码库308中。当前字符串寄存器518中的长度内容是从输入字符串502提取的符号数量,输入字符串502目前被用作为搜索索引。
编码表300中的代码库308使用二项输入进行初始化,这二项输入是处于“0”索引的字符串结束码和处于“1”索引的溢出码,处于索引“3”的符号宽度变化项可在需要动态变化符号宽度时对符号的宽度进行动态改变。字符串结束码和溢出码已结合图3进行了说明。控制逻辑500选择输入字符串502中的第一个符号,并将该符号作为搜索索引504连同指令组506中的“搜索和获悉”指令一同发送给编码表300。编码表300对编码表300中代码库308输入项所存储的搜索索引504进行搜索。
如果第一个符号没有存储在代码库308中,则编码表300通过获悉508表明编码表正在通过将搜索索引504存储在代码库308中来获悉搜索索引504。控制逻辑500对获悉项508进行监测,一旦发现编码表300正在获悉搜索索引504,则控制逻辑500将这一符号作为无格式符号以编码代码的形式发送出去,正如前面结合图4A所说明的,无格式符号位于无格式符号区406中,其前面的前缀位404被设定为“0”。解码器312发现前缀位404被设为“0”后,解码器312通过将代码库308中无格式符号区406存储的该无格式符号存储在解码表320下一个序列索引中来获悉这一符号。如果编码表300找到了与搜索索引相匹配的项,则相配项的索引510被发送给控制逻辑500。如果找到了搜索索引504的相配项,则编码器310在代码库308中搜寻与该搜索索引相配的更长的符号串。控制逻辑500将当前符号与输入字符串502的下一个符号加合起来;以此给出下一个搜索索引504。如果没有找到这一搜索索引,则通过将这一字符串(当前符号加下一个符号)存储在编码表300中来获悉该搜索索引。
与在语言中将字母组合起来而学习词汇一样,这样可以获悉字符串。最长前缀相配索引在编码字符串314中发送出去,编码字符串314存储在表格索引区408(图4B)中,其前面的前缀位404被设定为“1”。这种获悉字符串的方法将在以下结合图9进行说明。
控制逻辑500根据所选定的符号宽度对输入字符串502进行解析。编码表300最初只存储有3个输入项,即字符串结束、溢出码以及字符宽度变化码;其中字符宽度变化码是一可选的输入项。控制逻辑500选择输入字符串中的下一个符号,并在编码表300搜寻这一符号。如果找到了这一符号,则控制逻辑500将该符号与输入字符串502中的下一个符号加合起来。控制逻辑不断地将输入字符串中的符号加合起来,直至找到一个当前在编码表300中未存储的符号串。控制逻辑500将相配的最长符号串索引发送出去,并在该索引前加上被设定为“1”的前缀位。
如果某一符号没有存储在编码表300中,则控制逻辑500将这一符号的无格式符号发送出去,并在其前面加上被设定为“0”的前缀,这样解码器312(图5)便可获悉这一符号。
当符号以及符号串存储在编码表300中时,控制逻辑500对输入的数量进行监测。每当输入的数量超过了2的幂次,则控制逻辑500便增加索引的宽度。控制逻辑500还对编码表300所用的输入项数量进行监测,从而确定编码表300是否已满。一旦发现编码表300已满,则控制逻辑500通过清除所有存储符号的输入项以及符号串来对编码表300进行初始化,并向解码器312发送一个溢出码,这样解码器312便可以对其解码表320进行初始化处理。
另外,控制逻辑500可以对压缩比进行监测,并且决定在有效压缩情况下不对编码表300进行初始化。K.Ouaissa等人的“LZW数据压缩过程中代码库大小的适应性限制”一文对监测压缩比的方法进行了说明,该文章于1995年9月在加拿大举行的IEEE国际信息理论演讨会上发表,该文章在此通过引证被并入本文。
图6表明的是图5所示的控制逻辑在对输入字符串502进行编码时所用方法的流程。图6将结合图5进行说明。
在步骤600,编码表300进行初始化,控制逻辑500被加以执行。通过将字符串结束码“0”存储在索引“0”的第一项输入上,并将溢出码“1”存储在索引“1”的第二项输入上或者将宽度变化码存储在索引“2”上来对代码库进行初始化处理;将宽度变化码存储在索引“2”上是一可选操作步骤。为简化本文中的说明,结合图6进行说明的实施方案并不执行宽度改变码。在这一实施方案中,符号的宽度是固定不变的。索引精密度寄存器516被设定为“1”,当前字符串长度518被设定为“1”,存储在代码库中输入520的数量被设定为2,这里没有符号宽度变化码,最新添加长度522被设定为“1”,对于字符串502中第一字符的索引而言,输入字符串指针514被设定为“0”,字符串寄存器512被设为空置(无字符)。过程接下来继续执行步骤601。
在步骤601,控制逻辑选取输入字符串502中的下一个符号,并将这一符号与字符串寄存器512中存储的符号相加合,或者将所选取的符号添加到空的字符串寄存器512中,接下来继续执行步骤602。
在步骤602,控制逻辑500通过将字符串寄存器512中的内容作为搜索索引504发送给编码表300来在代码库中搜索与字符串寄存器512中内容相匹配的输入项。控制逻辑500同样在指令组506中发送一条“搜索并获悉”的指令。接下来继续执行步骤604。
在步骤604,控制逻辑500对获悉项508的状态进行监测以便确定搜索索引是否正在被获悉,因为搜索索引没有存储在编码表300中。如果获悉项508的状态表明搜索索引正在被获断悉,则继续执行步骤606。如果找到了搜索索引504,则继续执行步骤620。
在步骤606,编码表300中没有找到搜索索引504。搜索索引504被存储在编码表300的下一个索引位置上。过程接下来继续执行步骤608。
在步骤608,控制逻辑500根据存储在当前字符串长度518中的数值来检查存储在字符串寄存器512中符号的数量。如果当前字符串长度518被设定为“1”,则过程继续执行步骤610,将这一符号以无格式方式发送出去。如果当前字符串长度518中的内容大于1,这表明字符串寄存器512中存储的符号在1个以上,过程接下来继续执行步骤612。
在步骤610,控制逻辑500按照结合图4A所说明的过程将字符串寄存器512中存储的无格式符号发送出去,并在这一符号前加上被设定为“0”的前缀位404。过程接下来继续执行步骤616。
在步骤612,控制逻辑500对最新添加长度项522进行检查以确定最新添加到代码库308中的字符串长度。如果最新存储的字符串长度为“1”,即一个符号,则过程继续执行步骤616;如果不是,则过程继续执行步骤614。
在步骤614,控制逻辑500按结合图4B所说明的将表格索引区408中前一个相配字符串的索引发送出去,这一索引前面的前缀位404被设定为“1”。这一字符串是已知的,因此,前一个被识别符号串的索引被发送出去。过程接下来继续执行步骤616。
在步骤616,控制逻辑500确定最新的添加到当前字符串长度518中内容的长度522。当前字符串长度518被设定为“1”。过程接下来继续执行步骤617。
在步骤617,控制逻辑500将字符串寄存器设为空置。过程接下来继续执行步骤618。
在步骤618,控制逻辑500检查编码表300中的代码库308是否已满。控制逻辑500还检查索引精密度寄存器516是否应该增长。步骤618将在下文中结合图7进行说明。
在步骤620,控制逻辑500将输入字符串指针514推进到输入字符串502的下一个字符。过程接下来继续执行步骤621。
在步骤621,控制逻辑500增加当前字符串长度518中存储的符号数量。过程接下来继续执行步骤622。
在步骤622,控制逻辑500确定输入字符串502是否有更多的符号要编码。如果字符串指针没有指向字符串结束码,则有更多的符号需要解码。如果有有效符号,则过程继续执行步骤601。如果指针指向字符串结束码,则过程继续执行步骤624。
在步骤624,控制逻辑500完成了对输入字符串502的编码。如果该字符串存在于代码库308中,则控制逻辑传送这一字符串的索引,排在编码字符串314前面的前缀位404被设定为“1”。过程至此全部完成。控制逻辑500发送字符串结束项代码“1”,如果该字符串存储有字符串结束项,则编码字符串314的前缀位404被设定为“1”。
如果输入字符串502的压缩不是具有多种符号宽度的,则编码器310向解码器312发送一个特定的代码,该代码后面跟着的是符号中剩余的位数,后面再跟着的是无格式符号。举例而言,如果输入字符串是“123456789”,且符号宽度为二个字符,则解析边界为12、34、56、78、9。因此,最后的字符>9=是一个部分符号。因此,“9”以1.特定代码.9(8位).8(要解析的位数)这一形式被发送出去。
图7是流程图,它表明了图6中步骤618所执行的步骤,该步骤用来确定存储于索引精密度寄存器516中的当前索引宽度是否要增加。图7还表明了在代码库308已满时编码表300的重新初始化步骤。
如果代码库308已满,则会有一个溢出码发送到解码器312,这表明应执行清除操作。清除操作会清除掉编码表300中的所有输入项,并通过将字符串结束这一项存储在索引“0”位置上以及将溢出码存储在索引“1”位置同时将索引宽度初始设定为“1”来对编码表300进行重新初始化处理。每当存储于编码表300中的输入项数量跨越2的幂次一次,索引宽度便增长1位。
在步骤700,控制逻辑500从输入项数量项520中的内容确定代码库308是否已满。如果代码库308已满,则过程继续执行步骤706。如果不满,则过程继续执行步骤702。
在步骤702,控制逻辑500确定编码表300中输入数量项520中的内容,并确定编码表300中的输入项数量是否达到了2的幂次。索引的宽度起始时为1位,每当编码表300中最新存储输入项的索引达到2的幂次时,索引的宽度便增加。举例而言,当代码库存储的输入项少于23时,则索引精密度寄存器516对一个三位宽的索引存储3,当存储8个输入项时,索引的宽度从3增加到4。如果编码表300达到2的幂次时,过程继续执行步骤704。如果没有达到这一幂次,则过程继续执行步骤622。
在步骤704,编码表300达到2的幂次,索引精密度寄存器516被增加。索引精密度寄存器516表明有多少位在表格索引区408中被传递出去。过程接下来执行步骤622。
在步骤706,代码库308已满。控制逻辑500将存储在代码库308第二项输入中的溢出码发送出去。溢出码在编码字符串314中被发送出去,这样解码器312会知道编码表300正在被清空,解码器312也会清空解码器312的代码库308。过程接下来继续执行步骤708。
在步骤708,编码表300中的所有表格输入被清空。过程接下来继续执行步骤710。
在步骤710,编码表300被初始化。在不选择符号的宽度可以变化的情况下代码库308是通过在索引“0”的第1输入项上存储“0”并在索引“1”的第二输入项上存储“1”而进行初始化的。索引精密度寄存器516被设定为1,存储于代码库308中的输入数量520被设定为2,最新添加长度522被设定为“1”,输入字符串指针514被设定为当前符号中这一位置的索引。过程接下来继续执行步骤622。
图8A一8B是流程图,它表明了图3所示解码器312在对所收到的编码字符串314进行解码时所使用的方法。为了对接收到的编码代码进行解码,解码器312含有多个寄存器。寄存器包括用于存储最新解码字符串索引的旧索引寄存器,还包括用于存储索引的新索引寄存器以及用于存储当前解码字符串(无格式)和某一符号的解码字符串寄存器;解码字符串寄存器中所存储的这一符号与当前解码字符串的第一个符号是相等的。
解码器312对所收到的第一位进行检查以确定所收到的是一个符号还是一个索引。解码器使用存储于解码表320中的已知符号串来替代索引,从而实现对收到索引的解码。解码器312通过将无格式符号存储在解码表320中的下一顺序索引位置上来获悉所收到的无格式符号。
在步骤800,解码器312从编码字符串314中选取第1位。在不选择符号宽度可以变动的情况下,解码器中代码库308最初只存储有二项输入。解码器312从所收到的编码字符串314中获悉符号,并将符号填充到代码库308中。解码器312所收到的第1个编码字符串314的第1位表明了第一个编码代码包括无格式符号区406,该无格式符号区存储有解码器312要获悉的无格式符号。
在步骤802,所收到的第1位被设定为“0”,这表明存储于无格式符号区406的符号前有前缀位404。解码器312从编码字符串314中选取该无格式符号。所选取的位数取决于所选定的符号宽度。举例而言,如果选定的符号宽度为16位,则解码器312从编码输入字符串314中选取下面的16位。过程接下来继续执行步骤804。
在步骤804,该无格式符号被添加到解码表320中代码库308的下一个序列索引上。过程接下来继续执行步骤806。
在步骤806,旧索引寄存器被设为代码库308已添加符号的索引,过程接下来继续执行步骤808。
在步骤808,解码器将接收到的编码字符串314中的符号以解码输出字符串304这一形式输出出去。过程接下来继续执行步骤810。
在步骤810,解码器312从编码字符串314中选取下一位,从而确定这一编码代码是否包括无格式符号或索引。过程接下来继续执行步骤812。
在步骤812,解码器对接收到的编码字符串314中的下一位进行检查,从而确定它是否对表格索引408设定为“1”,或对无格式符号406设定为“0”。如果下一位被设定为“0”,则过程继续执行步骤813,从而对无格式符号406进行处理。如果下一位被设定为“1”,则过程继续执行步骤830,从而对表格索引408进行处理。
在步骤813,解码器312从编码字符串314中选取下面的位。下面的位数取决于符号的宽度。解码器312将这些位存储于编码字符串寄存器中。过程接下来继续执行步骤814。
在步骤814,解码器312将解码字符串的第一个符号存储于某一符号寄存器中。过程接下来继续执行步骤814。
在步骤814,解码器312将解码字符串的第一个符号存储于某一符号寄存器中。过程接下来继续执行步骤815。
在步骤815,解码器312将旧索引位置上字符串与解码符号加合所得到的字符串存储在代码库308的下一个序列索引中。每当有字符串或符号添加到代码库308中时,解码器312便检查代码库308中的输入数量是否达到了2的幂次。如果代码库308中的输入数量达到了2的幂次,则解码器312按结合图7所说明的步骤增加索引的精密度。与编码器310不同的是,解码器312无需检查代码库308是否已满,因为满载状态由编码器310所发出的溢出码所表示。过程接下来继续执行步骤816。
在步骤816,解码器312将解码后的符号存储在代码库308的下一个序列索引上。过程接下来继续执行步骤818。
在步骤818,解码后符号的索引或解码后字符串的索引被储存在旧索引寄存器中。过程接下来继续执行步骤820。
在步骤820,解码器312将存储在字符串寄存器中的解码字符串输出出去。过程接下来继续执行步骤822。
在步骤822,解码器312确定编码字符串314中是否有更多的位需要解码。如果有,则过程继续执行步骤810。如果没有,则过程至此全部结束。
在步骤830,新索引寄存器被设定为表格索引区408中下一个索引的内容。存储于新索引寄存器中的位数取决于编码器所选定的索引精密度。过程接下来继续执行步骤832。
在步骤832,解码器312对新索引寄存器中的内容进行检查。解码器312检验所收到的索引是字符串结束码还是溢出码。如果所收到的索引是溢出码,则按照结合图7对编码器310所做的说明对解码表进行初始化处理。如果收到的索引是字符串结束码,则过程全部完成。如果收到的索引既不是字符串结束码,也不是溢出码,则解码器将确定这一新索引是否有效。如果该新索引有效,则过程继续执行步骤834。如果该新索引无效,则过程继续执行步骤836。
在步骤834,解码器312将这一新索引的解码结果存储在代码库的解码字符串寄存器中。过程接下来继续执行步骤840。
在步骤836,新索引被确认是无效的。解码器312将旧索引的解码结果存储在解码字符串寄存器中。过程接下来继续执行步骤838。
在步骤838,解码器312设定解码字符串等于解码字符串与符号的加合。过程接下来继续执行步骤840。
在步骤840,解码器312将某一符号寄存器的内容设定为解码字符串中的第一个符号。过程接下来继续执行步骤842。
在步骤842,存储于代码库308旧索引位置上的字符串与该符号进行加合,加合的结果存储于代码库的下一个序列索引上。过程接下来继续执行步骤818。
图9表明的是输入字符串、输入字符串502被处理后编码器中代码库308中的内容以及编码字符串。图9将结合图5和图6进行说明。
在步骤600,代码库308通过将字符串结束码存储在索引“0”位置上以及将溢出码存储在索引“1”位置上进行初始化。在所示实施方案中,符号的宽度被固定在2个字母(16位)。然而,符号的宽度并不限于16位,符号宽度可按已经说明的进行动态修改。输入字符串502含有多个符号9041-90410。输入字符串502第1个16位宽的符号9041是“/w”,最后一个16位宽的符号90410是“t/”。
在步骤601,控制逻辑500对输入字符串502进行解析,并将第1个符号9041“/w”从输入字符串502中提取出来。从输入字符串502提取的符号取决于字符串指针寄存器514中的内容。字符串指针寄存器514中的内容最初指向输入字符串502中的第1个符号9041,字符串寄存器512是空置的。控制逻辑500将符号9041与空置字符串寄存器512中的内容加合起来。
在步骤602,控制逻辑500将字符串寄存器512中的内容作为搜索索引504发送给编码表300。编码表300在代码库308搜寻符号9041。在步骤604,在代码库308中没有找到符号9041。在步骤606,编码表300通过将符号9041存储在代码库308的下一个序列索引即索引“2”上来获悉符号9041,并表明符号9041是通过获悉项508而获悉的。在步骤608,存储于字符串502中的符号数量为“1”,因此过程继续执行步骤610。在步骤610,控制逻辑500将编码单词9061在编码字符串314中发送出去,这样解码器3 12可以获悉符号9041。编码单词9061含有无格式符号9041,正如结合图4A所说明的,9041前面带有被设定为“0”的前缀位404。
在无格式符号9041被发送后,控制逻辑500在步骤616、617和618对各寄存器进行修改。在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容,并将当前字符串长度518设定为“1”。在步骤617,控制逻辑将字符串寄存器512设定为空置。
在步骤622,控制逻辑500确定在输入字符串502是否还有有效符号(不是字符串结束码),过程继续执行步骤601以便继续对输入字符串502进行解析。
在步骤601,输入字符串指针寄存器514中的内容仍然指向输入字符串502中的第1个符号9041。控制逻辑500再次提取第1个符号9041,并将该符号与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容作为搜索索引504发送给编码表300。编码表300在代码库308搜寻符号9041。在步骤604,在代码库308找到符号9041,因为符号9041在执行步骤601-622过程中已经存储于代码库308中。
在步骤620,符号9041被找到,控制逻辑500推动输入字符串指针向前,使该指针指向输入字符串502中的下一个符号9042。在步骤621,控制逻辑500增加存储于字符串寄存器512中符号的数量。在步骤622,控制逻辑500从输入字符串502确定是否有更多的符号要编码。过程继续执行步骤601,输入字符串指针指向输入字符串502的第二个符号“ed”以及字符串寄存器512存储第一个符号9041“/w”。
在步骤601,控制逻辑500将符号9041与输入字符串502中下一个符号9042加合起来。在步骤602,控制逻辑500将加合得到的字符串“/wed”作为搜索索引504发送给编码表300。在步骤604,在编码表300未发现符号串“/wed”。在步骤606,通过将符号串“/wed”存储在代码库308的下一个索引位置,即索引“3”上来获悉符号串“/wed”。符号串“/wed”不是以无格式方式进行存储的。相反,符号串“/wed”是以参照其前缀的索引形式进行存储的。符号串“/wed”的前缀是“/w”,该前缀存储在索引“2”的位置上。符号串“/wed”被存储在索引“3”的位置上,正如“/w”存储为表格索引“2”以及“ed”以无格式形式进行存储一样。在步骤608,字符串寄存器512中的符号数量为2。因此,在步骤612,控制逻辑500确定最新添加字符串中最新的符号数量是否为1,在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容,并将当前字符串长度518设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
字符串指针寄存器514中的内容指向符号9042。字符串寄存器512是空的。在步骤601,控制逻辑将输入字符串502中的下一个符号9042与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容,即输入字符串502中的下一个符号9042“ed”作为搜索索引发送给编码表300。编码表300则在代码库308中搜寻符号9042。在步骤604,符号9042没有被找到。在步骤606,编码表300通过将符号9042存储在代码库308的索引“4”上来获悉符号9042。并表明编码表正通过获悉项508在获悉符号9042。在步骤608。存储的符号数量为“1”,因此过程接下来继续执行步骤610。在步骤610,控制逻辑500将编码代码9062在编码字符串314中发送出去,这样解码器便可获悉这一符号。编码代码9062含有无格式符号9042,如前面结合图4A所说明的,无格式符号9042之前加有被设定为“0”的前缀位404。
在发送出无格式符号9042之后,控制逻辑500对各种寄存器进行修改。在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容。当前字符串长度518被设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设定为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
在步骤601,输入字符串指针寄存器514中的内容依然指向输入字符串502中的符号9042。控制逻辑500将符号9042与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号9042。在步骤604,由于符号9042在步骤601~622的前一个循环中已存在于代码库308中,所以在这一步骤中在代码库308找到了该符号。
在步骤620,控制逻辑向前推进输入字符串指针514,使其指向输入字符串502中的下一个符号9043。在步骤621,控制逻辑500增加存储于字符串寄存器512中的符号数量。在步骤622,控制逻辑500确定输入字符串502是否还有符号需要编码。过程接下来继续执行步骤601,此时输入字符串指针指向输入字符串中的下一个符号9043“/w”,字符串寄存器存储有符号9042“ed”。
在步骤601,控制逻辑500将存储于字符串寄存器502中的符号9042与输入字符串502中的下一个符号9043相加合。在步骤602,控制逻辑500将符号串“ed/w”作为搜索索引发送给编码表300。编码表300在代码库308搜寻符号串“ed/w”。
在步骤604,没有找到符号串“ed/w”。在步骤606,通过将该字符串存储在代码库308的索引5位置上来获悉字符串“ed/w”。该字符串不是以无格式方式存储的。相反,字符串“ed/w”是随索引4参考其前缀情况下存储的,因为符号“ed”存储于索引4以及“/w”以无格式方式进行存储是相同的。字符串寄存器512中的字符数量为2。因此,在步骤612,控制逻辑500确定最新添加字符串中的最新符号数量为1,在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容,且当前字符串长度518被设定为1,在步骤617,控制逻辑500将字符串寄存器512设为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号,过程接下来继续执行步骤601。
字符串指针寄存器514中的内容指向符号9043。字符串寄存器512为空置。在步骤601,控制逻辑500半输入字符串502中的下一个符号9043与字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容,即输入字符串502中的符号9043“/w”作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号9043。在步骤604,由于在步骤601-622这一前次循环中“/w”已经存储在代码库308的索引2位置上,所以在步骤604符号9043被找到。
在步骤620,控制逻辑推进输入字符串指针514,使其指向输入字符串502中的下一个符号9044。在步骤621,控制逻辑500将存储于字符串寄存器512中的符号数量增至2个。在步骤622,控制逻辑500确定输入字符串502是否还有符号需要进行编码。过程接下来继续执行步骤601,输入字符串指针514指向输入字符串中的下一个符号9044“e/”,字符串寄存器512存储符号9043“/w”。
在步骤601,控制逻辑500将符号9043与输入字符串502中的下一个符号9044加合起来。在步骤602,控制逻辑500将符号串“/we/”作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号串“/we/”。在步骤604,符号串“/we/”未被找到。在步骤606,符号串“/we/”通过被存储在代码库308索引6上而被获悉。符号串不是以无格式方式进行存储的。由于符号“/w”已存储在索引2上,所以符号串“/we/”在参考索引1的前缀情况下随索引1被存储起来。符号串“/we/”存储在索引6上,“/w”存储在索引2上,“e/”以无格式方式被存储。字符串寄存器512中的符号数量为2。因此,在步骤612,控制逻辑500确定最新添加字符串中的最新符号数量为2,在步骤614,控制逻辑500将编码代码9063在编码字符串314中发送出去。编码代码9063含有索引2,正如结合图4B所说明的,该索引2的前面有被设定为“1”的前缀位。
在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容,且当前字符串长度518被设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
字符串指针寄存器514的内容指向符号9044“e/”。字符串寄存器512是空置的。在步骤601,控制逻辑将输入字符串502中下一个符号9044“e/”与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容,即输入字符串502中的下一个符号9044“e/”作为搜索索引504发送给编码表300。编码表300在代码库308搜寻符号9044。在步骤604,符号9044未被找到。在步骤606,编码表300通过将符号9044存储在代码库308的索引“7”上来获悉符号9044。并表明编码表正通过获悉项508在获悉符号9044。在步骤608,存储的符号数量为“1”,因此过程接下来继续执行步骤610。在步骤610,控制逻辑500将编码代码9064在编码字符串314中发送出去,这样解码器便可获悉这一符号。编码代码9064含有无格式符号9044,如前面结合图4A所说明的,无格式符号9044之前加有被设定为“0”的前缀位404。
在发送出无格式符号9044之后,控制逻辑500对各种寄存器进行修改。在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容。当前字符串长度518被设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设定为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
在步骤601,输入字符串指针寄存器514中的内容依然指向输入字符串502中的符号9044。控制逻辑500将符号9044与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号9044。在步骤604,由于符号9042在步骤601~622的前一个循环中已存在于代码库308中,所以在这一步骤中在代码库308找到了该符号。
在步骤620,控制逻辑向前推进输入字符串指针514,使其指向输入字符串502中的下一个符号9045。在步骤621,控制逻辑500将存储于字符串寄存器512中的符号数量增加至2。在步骤622,控制逻辑500确定输入字符串502是否还有符号需要编码。过程接下来继续执行步骤601,此时输入字符串指针指向输入字符串中的下一个符号9045“we”,字符串寄存器存储符号9044“e/”。
在步骤601,控制逻辑500将符号9044与输入字符串502中下一个符号9045加合起来。在步骤602,控制逻辑500将加合得到的字符串“e/we”作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号串“e/we”。在步骤604,在编码表300未发现符号串“e/we”。在步骤606,通过将符号串“e/we”存储在代码库308的下一个索引位置,即索引“8”上来获悉符号串“e/we”。符号串“e/we”不是以无格式方式进行存储的。相反,符号串“e/we”是参照其前缀的索引形式随索引7进行存储的,因为“e/”存储在索引7上。符号串“e/we”被存储在索引8上,“e/”存储在索引7上,“we”以无格式形式进行存储。字符串寄存器512中的符号数量为2。因此,在步骤612,控制逻辑500确定最新添加字符串中最新的符号数量是否为1,在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容,并将当前字符串长度518设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
字符串指针寄存器514的内容指向符号9045。字符串寄存器512是空置的。在步骤601,控制逻辑将输入字符串502中下一个符号9045“we”与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容,即输入字符串502中的下一个符号9045“we”作为搜索索引504发送给编码表300。编码表300在代码库308搜寻符号9045。在步骤604,符号9045未被找到。在步骤606,编码表300通过将符号9045存储在代码库308的索引9上来获悉符号9045,并表明编码表正通过获悉项508在获悉符号9045。在步骤608,存储的符号数量为“1”,因此过程接下来继续执行步骤610。在步骤610,控制逻辑500将编码代码9065在编码字符串314中发送出去,这样解码器便可获悉这一符号。编码代码9065含有无格式符号9045,如前面结合图4A所说明的,无格式符号9044之前加有被设定为“0”的前缀位404。
在发送出无格式符号9045之后,控制逻辑500对各种寄存器进行修改。在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容。当前字符串长度518被设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设定为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
在步骤601,输入字符串指针寄存器514中的内容依然指向输入字符串502中的符号9045。控制逻辑500将符号9045与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号9045。在步骤604,由于符号9045在步骤601~622的前一个循环中已存在于代码库308中,所以在这一步骤中在代码库308找到了该符号。
在步骤620,控制逻辑向前推进输入字符串指针514,使其指向输入字符串502中的下一个符号9046。在步骤621,控制逻辑500将存储于字符串寄存器512中的符号数量增加至2。在步骤622,控制逻辑500确定输入字符串502是否还有符号需要编码。过程接下来继续执行步骤601,此时输入字符串指针指向输入字符串中的下一个符号9046“/e”,字符串寄存器存储符号9045“we”。
在步骤601,控制逻辑500将符号9045与输入字符串502中下一个符号9046加合起来。在步骤602,控制逻辑500将加合得到的字符串“wee/”作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号串“wee/”。在步骤604,在编码表300未发现符号串“wee/”。在步骤606,通过将符号串“wee/”存储在代码库308的下一个索引位置,即索引10上来获悉符号串“wee/”。符号串“wee/”不是以无格式方式进行存储的。相反,符号串“wee/”是参照其前缀的索引形式随索引9进行存储的,因为“we”存储在索引9上。符号串“wee/”被作为(9,e/)存储在索引10上,“e/”被存储为索引9,“we”以无格式形式进行存储。字符串寄存器512中的符号数量为2。因此,在步骤612,控制逻辑500确定最新添加字符串中最新的符号数量是否为1,在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容,并将当前字符串长度518设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
字符串指针寄存器514的内容指向符号9046。字符串寄存器512是空置的。在步骤601,控制逻辑将输入字符串502中下一个符号9046“e/”与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容,即输入字符串502中的下一个符号9046“e/”作为搜索索引504发送给编码表300。编码表300在代码库308搜寻符号9046。在步骤604,符号9046在索引9处被找到。
在步骤620,控制逻辑向前推进输入字符串指针514,使其指向输入字符串502中的下一个符号9047。在步骤621,控制逻辑500将增加符号的数量。在步骤622,控制逻辑500确定输入字符串502是否还有符号需要编码。过程接下来继续执行步骤601,此时输入字符串指针指向输入字符串中的下一个符号9047“we”,字符串寄存器存储符号9046“e/”。
在步骤620,控制逻辑向前推进输入字符串指针514,使其指向输入字符串502中的下一个符号904。在步骤621,控制逻辑500将增加符号的数量。在步骤622,控制逻辑500确定输入字符串502是否还有符号需要编码。过程接下来继续执行步骤601,此时输入字符串指针指向输入字符串中的下一个符号9047“we”,字符串寄存器存储符号9046“e/”。
在步骤601,控制逻辑500将符号9046与输入字符串502中下一个符号9047加合起来。在步骤602,控制逻辑500将加合得到的字符串“e/we”作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号串“e/we”。在步骤604,在索引8发现了符号串“e/we”。在步骤620,控制逻辑向前推进输入字符串指针514,使其指向输入字符串502中的下一个符号9048。在步骤621,控制逻辑500将存储于字符串寄存器512中的符号数量增加至3。在步骤622,控制逻辑500确定输入字符串502是否还有符号需要编码。过程接下来继续执行步骤601,此时输入字符串指针指向输入字符串中的下一个符号9048“b/”,字符串寄存器512存储符号串“e/we”。
在步骤601,控制逻辑500将符号9048字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容“e/web/”作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号串“e/web/”。在步骤604,符号串“e/web/”未被找到。在步骤606,编码表300符号串“e/web/”存储在代码库308的索引11上来获悉符号串“e/web/”。符号串“e/web/”不是以无格式方式进行存储的。相反,符号串“e/web/”是参照其前缀的索引形式随索引8进行存储的,因为“e/we”存储在索引8上。符号串“e/web/”被作为(8,b/)存储在索引11上,“e/we”存储在索引8上,“b/”以无格式形式进行存储。字符串寄存器512中的符号数量为3。因此,在步骤612,控制逻辑500确定最新添加字符串中最新的符号数量不为1,在步骤614,控制逻辑500在编码字符串314中将编码代码9066发送出去。编码代码9066含有索引8,符号串“e/we” 存储在索引8上,如前面结合图4B所说明的,索引8之前加有被设定为“1”的前缀位。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
字符串指针寄存器514的内容指向符号9048。字符串寄存器512是空置的。在步骤601,控制逻辑将输入字符串502中下一个符号9048“b/”与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容,即输入字符串502中的下一个符号9048“b/”作为搜索索引504发送给编码表300。编码表300在代码库308搜寻符号9048。在步骤604,符号9048未被找到。在步骤606,编码表300通过将符号9048存储在代码库308的索引12上来获悉符号9048,并表明编码表正通过获悉项508在获悉符号9048。在步骤608,存储的符号数量为“1”,因此过程接下来继续执行步骤610。在步骤610,控制逻辑500将编码代码9067在编码字符串314中发送出去,这样解码器便可获悉这一符号。编码代码9067含有无格式符号9048,如前面结合图4A所说明的,无格式符号9048之前加有被设定为“0”的前缀位404。
在发送出无格式符号9048之后,控制逻辑500对各种寄存器进行修改。在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容。当前字符串长度518被设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设定为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
字符串寄存器512为空置。在步骤601,输入字符串指针寄存器514中的内容依然指向输入字符串502中的符号9048。控制逻辑500将符号9048与字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号9048。在步骤604,由于符号9048在步骤601~622的前一个循环中已存在于代码库308中,所以在这一步骤中在代码库308找到了该符号。
在步骤620,控制逻辑向前推进输入字符串指针514,使其指向输入字符串502中的下一个符号9049。在步骤621,控制逻辑500增加符号的数量。在步骤622,控制逻辑500确定输入字符串502是否还有符号需要编码。过程接下来继续执行步骤601,此时输入字符串指针指向输入字符串中的下一个符号9049“we”,字符串寄存器存储符号9048“b/”。
在步骤601,控制逻辑500将符号9048与输入字符串502中下一个符号9049加合起来。在步骤602,控制逻辑500将加合得到的字符串“b/we”作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号串“b/we”。在步骤604,在编码表300未发现符号串“b/we”。在步骤606,通过将符号串“b/we”存储在代码库308的下一个索引位置,即索引13上来获悉符号串“b/we”。该符号串不是以无格式方式进行存储的。相反,符号串“b/we”是参照其前缀的索引形式随索引12进行存储的,因为“b/”存储在索引12上。符号串“b/we”被作为(12,we)存储在索引13上,“b/”被存储为索引12,“we”以无格式形式进行存储。字符串寄存器512中的符号数量为2。因此,在步骤612,控制逻辑500确定最新添加字符串中最新的符号数量是否为1,在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容,并将当前字符串长度518设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
字符串指针寄存器514的内容指向符号9049。字符串寄存器512是空置的。在步骤601,控制逻辑将输入字符串502中下一个符号9049“we”与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容,即输入字符串502中的下一个符号9049“we”作为搜索索引504发送给编码表300。编码表300在代码库308搜寻符号9049。在步骤604,符号9049被找到。
在步骤620,控制逻辑向前推进输入字符串指针514,使其指向输入字符串502中的下一个符号9049。在步骤621,控制逻辑500增加符号的数量。在步骤622,控制逻辑500确定输入字符串502是否还有符号需要编码。过程接下来继续执行步骤601,此时输入字符串指针指向输入字符串中的下一个符号90410“t/”,字符串寄存器存储符号9049“we”。
在步骤601,控制逻辑500将符号9049与输入字符串502中下一个符号90410加合起来。在步骤602,控制逻辑500将加合得到的字符串“wet/”作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号串“wet/”。在步骤604,在编码表300未发现符号串“wet/”。在步骤606,通过将符号串“wet/”存储在代码库308的下一个索引位置,即索引14上来获悉符号串“wet/”。该符号串不是以无格式方式进行存储的。相反,符号串“wet/”是参照其前缀的索引形式随索引9进行存储的,因为“we”存储在索引9上。符号串“wet/”被作为(9,t/)存储在索引14上,“we”被存储为索引9,“t/”以无格式形式进行存储。字符串寄存器512中的符号数量为2。因此,在步骤612,控制逻辑500确定最新添加字符串中最新的符号数量不为1,在步骤614,控制逻辑500在编码字符串314中将编码代码9068发送出去。编码代码9068含有索引9,如前面结合图4B所说明的,索引9之前加有被设定为“1”的前缀位。在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容,并将当前字符串长度518设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
字符串指针寄存器514的内容指向符号90410。字符串寄存器512是空置的。在步骤601,控制逻辑将输入字符串502中下一个符号90410“t/”与空置字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容,即输入字符串502中的下一个符号90410“t/”作为搜索索引504发送给编码表300。编码表300在代码库308搜寻符号90410。在步骤604,在编码表300未发现符号90410。在步骤606,通过将90410存储在代码库308的下一个索引位置,即索引15上来获悉90410,并表明编码表正通过获悉项508在获悉符号9048。在步骤608,存储的符号数量为“1”,因此过程继续执行步骤610。在步骤610,控制逻辑500将编码单词9069在编码字符串314中发送出去,这样解码器312可以获悉符号9069。编码单词9069含有无格式符号9049,正如结合图4A所说明的,9049前面带有被设定为“0”的前缀位404。
在发送出无格式符号90410之后,控制逻辑500对各种寄存器进行修改。在步骤616,控制逻辑500将最新添加长度522设定为当前字符串长度518中的内容。当前字符串长度518被设定为“1”。在步骤617,控制逻辑500将字符串寄存器512设定为空置。
在步骤622,控制逻辑500确定输入字符串502中是否还有有效符号(不是字符串结束码),过程接下来继续执行步骤601。
字符串寄存器512为空置。在步骤601,输入字符串指针寄存器514中的内容依然指向输入字符串502中的符号90410。控制逻辑500将符号90410与字符串寄存器512中的内容加合起来。在步骤602,控制逻辑500将字符串寄存器512中的内容作为搜索索引504发送给编码表300。编码表300在代码库308中搜寻符号90410。在步骤604,由于符号90410在步骤601~622的前一个循环中已存在于代码库308中,所以在这一步骤中在代码库308找到了该符号。
在步骤620,控制逻辑向前推进输入字符串指针514,使其指向输入字符串502中的下一个符号。在步骤621,控制逻辑500增加符号的数量。
在步骤622,控制逻辑500检测到了字符串结束码,过程接下来继续执行步骤624。
在步骤624,控制逻辑500将字符串结束码的索引在编码单词90610中发送出去。
如果假定9041~90410每个符号都是16位宽,则不包括字符串结束码在内且具有10个字符的输入字符串需要160位(10×16)。编码代码串9061-10将发送出去的位数减少到了120位。120位这一数字由如下计算得到9061、9062、9064、9061、9065、9067和9069这7个编码代码的无格式符号为(6×17)位,编码代码9063中的索引2为3位,编码代码9066、9068、90610中的索引8、9、10为5位。与LZW算法相比,这种方法需要更少的内存来存储代码,并且在发送编码数据流314时需要更少的位数。由于符号可被获悉,以及接收到重复或已获悉的字符串,所以这种方法达到了更大的压缩效果。
对编码数据314的处理由解码器使用图8A-8B所表明的方法执行。
虽然本发明是结合优选实施方案进行具体说明的,但本领域中的技术人员应该理解的是,在不脱离本文所附权利要求所涵盖范围的情况下,对本发明的形式和细节可以进行各种各样的修改。
权利要求
1.一种对字符串进行压缩的方法,该压缩方法包括以下步骤在代码库中搜寻接收字符串中的符号;一旦发现该符号未存储在代码库中,通过将该符号存储在代码库中来获悉该符号;将该符号以编码单词的形式发送出去。
2.根据权利要求1的方法,还包括以下步骤一旦发现该符号存储在代码库中,则以编码代码的方式将代码库该符号存储位置的索引发送出去。
3.根据权利要求1的方法,还包括以下步骤一旦发现符号串未存储于代码库中,则发送出一个索引,该符号串的最长前缀存储于代码库的该索引处。
4.根据权利要求1的方法,其中符号的宽度是可变的。
5.根据权利要求1的方法,其中编码代码含有前缀区。
6.根据权利要求5的方法,其中前缀区的状态标志着编码代码中的内容。
7.根据权利要求6的方法,其中前缀区的状态表明了该编码代码是要被获悉的无格式符号还是一项索引。
8.根据如权利要求2的方法,其中索引的宽度是可变的。
9.根据权利要求8的方法,其中索引的宽度取决于存储于代码库串已知项目的数量。
10.根据权利要求1的方法,其中搜寻步骤对某一符号串进行搜寻;获悉步骤通过将某一符号串存储在代码库中来莸悉某一符号串;发送步骤将某一索引以编码代码的形式发送出去,与该符号串相匹配的最长前缀存储于这一索引位置上。
11.一种对字符串进行压缩的装置,该装置包括用于存储接收到的字符串符号的代码库;在代码库中搜寻符号的控制逻辑,一旦发现符号未存储于代码库中,则控制逻辑以编码代码的形式将这一符号发送出去,并通过将这一符号存储在代码库中来获悉这一符号。
12.根据权利要求11的装置,其中一旦发现代码库中存储有这一符号,则控制逻辑将该符号代码库中存储位置索索引以编码代码的形式发出去。
13.根据权利要求11的装置,其中一旦发现字符串未存储代码库中,控制逻辑在编码代码中将某一索引发送出去,在该索引位置中存储着该字符串的最长前缀。
14.根据权利要求12的装置,其中符号的宽度是可以变化的。
15.根据权利要求12的装置,其中编码代码含有前缀区。
16.根据权利要求15的装置,其中前缀区的状态标志着编码代码的内容。
17.根据权利要求16的装置,其中前缀区的状态表明了编码代码是将要被获悉的无格式符号还是某个索引。
18.根据权利要求11的装置,其中索引的宽度是可以变化的。
19.根据权利要求18的装置,其中索引的宽度取决于存储于代码库中已知项目的数量。
20.根据权利要求11的装置,其中控制逻辑在代码库搜寻某一字符串,并在编码代码中将与这一字符串最长相配前缀所存储位置的索引发送出去,控制逻辑通过将该字符串存储在代码库中来获悉这一字符串。
21.一种对字符串进行压缩的装置,该装置包括用于存储接收到的字符串符号的代码库;在代码库中搜寻符号的工具;一旦发现符号未存储于代码库中,则以编码代码的形式将这一符号发送出去的工具;通过将这一符号存储在代码库中来获悉这一符号的工具。
22.根据权利要求21的装置,其中一旦发现符号存储于代码库中,发送工具便将该符存储于代码库中位置的索引发送出去。
23.根据权利要求21的装置,其中符号的宽度是可以变化的。
24.根据权利要求22的装置,其中编码代码含有前缀区。
25.根据权利要求23的装置,其中前缀区的状态标志着编码代码的内容。
26.根据权利要求25的装置,其中前缀区的状态表明了编码代码是将要被获悉的无格式符号还是某个索引。
27.根据权利要求21的装置,其中索引的宽度是可以变化的。
28.根据权利要求27的装置,其中索引的宽度取决于存储于代码库中已知项目的数量。
29.一种对字符串进行压缩的方法,该方法包括以下步骤在代码库中搜寻与符号序列相匹配的最长前缀,其中符号序列的宽度是可变的;一旦发现字符串的符号未存储于代码库中,则以编码代码的形式这一符号发送出去,编码代码含有前缀区,前缀区的状态标志着这一编码代码是将要被获悉的无格式符号还是一项索引,该符号通过被存储在代码库中而被获悉;一旦发现该符号序列存储于代码库中,则将该符号序列存储在代码库中位置的索引发送出去,索引的宽度取决于代码库中已知项目的数量。
30.一种对编码代码序列进行解压缩的方法,该方法包括以下步骤接收编码代码;一旦发现存储于编码代码中的符号,便通过将该符号存储于代码库中来获悉该符号;将该符号解码为数据。
31.根据权利要求30的方法,其中获悉步骤还包括通过将以前获悉的符号同该符号进行加合,并将符号序列存储于代码库中来获悉某一符号序列。
32.根据权利要求30的方法,还包括一旦发现存储于编码代码中的代码库索引,便将该索引解码。
33.根据权利要求32的方法,其中索引的解码结果是某一符号。
34.根据权利要求32的方法,其中索引的解码结果是某一符号序列。
35.根据权利要求30的方法,其中符号的宽度是可变的。
36.根据权利要求30的方法,其中编码代码含有前缀区。
37.根据权利要求36的方法,其中前缀区的状态标志着编码代码的内容。
38.根据权利要求37的方法,其中前缀区的状态表明了编码代码是将要被获悉的无格式符号还是某个索引。
39.根据权利要求32的方法,其中索引的宽度是可以变化的。
40.一种对编码代码序列进行解压缩的装置,该装置包括用于存储接收到的无格式符号的代码库;接收到编码代码、检测存储于编码代码中的无格式符号、将该符号存储于代码库中并将该符号解码成数据的逻辑。
41.根据权利要求40的装置,其中的逻辑通过将以前获悉的符号与存储于编码代码中的无格式符号加合起来并将符号序列存储在代码库中来获悉符号序列。
42.根据权利要求40的装置,还包括一旦发现存储于编码代码中的代码库索引,便将该索引解码。
43.根据权利要求42的装置,其中索引的解码结果是某一符号。
44.根据权利要求42的装置,其中索引的解码结果是某一符号序列。
45.根据权利要求40的装置,其中符号的宽度是可变的。
46.根据权利要求40的装置,其中编码代码含有前缀区。
47.根据权利要求46的装置,其中前缀区的状态标志着编码代码的内容。
48.根据权利要求47的装置,其中前缀区的状态表明了编码代码是将要被获悉的无格式符号还是某个索引。
49.根据权利要求40的装置,其中索引的宽度是可以变化的。
全文摘要
本文提供适合数据压缩的方法和设置。当符号被编码和解码时,编码器和解码器中便适当地建立一个字母和词汇,并在代码库中将其存储起来。每当编码器对一未知符号进行编码时,编码器便将这一符号添加到词库中,并已无格式方式将其在编码字符串中发送出去。编码器所传送的编码字符包括符号和索引。位于编码字符前面的前缀位的状态表明了该编码代码是否是存储于代码库中的无格式符号,还是符号的索引或是一串符号。解码器在收到每个编码代码时对其前缀位进行检验,从而确定该编码代码是否存有无格式符号或索引。如果这一编码代码含有无格式符号,则解码器通过将以前解码符号串与当前所解符号中的第一个符号加合起来并将该符号加入到代码库中来获悉这一符号。如果该编码代码含有索引,则解码器通过提取存储在不同索引位置的符号或符号序列来对该编码代码进行解码。
文档编号H03M7/30GK1593011SQ02806626
公开日2005年3月9日 申请日期2002年2月11日 优先权日2001年2月13日
发明者阿布达特·莫拉德 申请人:莫塞德技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1