生成与读出可变长度代码字数据流地方法和设备 本发明涉及用可变长度代码字进行的编码,具体地说,是涉及生成与读取传输中抗差错能力强的具有可变长度代码字的数据流。
例如,按照MPEG层3标准工作的现代音频编码或解码方法能够对音频信号的数据率压缩例如因数12,而不会使其质量明显下降。为实现这种高数据率的缩减,对一个音频信号进行采样,以获得一个时间离散的采样值序列。如业内所知的,对该时间离散的采样值序列取一窗口以便获得有界的时间采样值组。然后,一个时间窗采样值组通过滤波器组(filter bank)、修正余弦离散变换(MDCT)或其他适合的设备被转换成频率范围,以便获得整体上表示音频信号的频谱值,即在该频率范围内由时间离散的采样值组确定的时间段。通常,通过MDCT生成相互间重迭50%的时间组值,并且该时间值组被转换成频率范围,由于MDCT的特性,例如1024个时间离散的采样值总是产生1024个频谱值。
众所周知,人的听力取决于音频信号本身的瞬间频谱。这种依赖性属于所谓的心理听觉模式,通过该模式,在相当长的时间里依据该瞬间频谱对掩蔽阈值进行计算一直是可行的。掩蔽(masking)意指在例如相邻的频谱范围,具有相对较高的能量的情况下,一个特定的单音或一个频谱分量被掩蔽起来。为了尽可能接近地量化转换之后出现的频谱值,掩蔽的这一作法得到了应用。因此该目的一方面在于避免重新编码的音频信号中的可听见的干扰,另一方面在于使用尽可能少的位来编码或者,在这一情况下,来量化音频信号。由量化引起的干扰,即量化噪声,应当低于掩蔽阈值,因此,是听不见的。根据已知的方法,对所谓的比例系数频带(scale factor bands)中的频谱值进行分类,这种分类应与人耳的临界频带,即频率组相符。一个比例系数组中的频谱值乘以一个比例系数以便对一个比例系数频带中的频谱值进行整体换算。经比例系数换算的比例系数频带则被量化,以此生成经过量化的频谱值。可以理解,比例系数频带的分组并非关键性的。然而,它却在MPEG层3标准或者在MPEG 2 AAC标准(AAC=先进音频编码)中得到应用。
数据缩减的一个根本的方面在于量化之后的平均信息量编码。Huffman(霍夫曼)编码通常用于平均信息量编码。Huffman编码被理解为它意味着用一个可变长度来进行编码,即被编码的值的代码字的长度取决于它出现的概率。从逻辑上讲,概率最大的字符被分配给最短的代码,即最短的代码字,以便通过Huffman编码实现良好的冗余缩减。一个公知的用一般长度进行编码的例子是Morse代码。
在音频编码领域,Huffman代码用于对经过量化的频谱值进行编码。现代的音频编码器,例如根据MPEG 2 AAC标准工作的编码器,使用不同的Huffman代码表对量化的频谱值进行编码,而该代码表是以逐段进行为基础按照某些条件分配给该频谱的。在这一过程中,总是把2个或4个频谱值一起编码于一个代码字中。
根据MPEG 2 AAC的方法与根据MPEG层3的方法之间的一个差别是不同的比例系数频带,即不同的频谱值,被分组归入任意数量的频谱段。对于AAC,一个频谱段包括至少4个频谱值,但最好是多于4个频谱值。这些频谱值的整个频率范围因此而被分成相临的频段,一个频段表示一个频带,这样,所有的频段就共同覆盖了由经转换后的频谱值合成的整个频率范围。
比如在MPEG层3方法中,一个频段被分配给一个选自多个这种表格的所谓的“Huffman表”,以便实现最大的冗余缩减。在AAC方法的通常含有1024个频谱值的位流中,现在是按照频率的上升顺序排列的频谱值的Huffman代码字。每个频段中使用的表上的信息以从属信息的形式传送。这种情形在图6中示出。
图6示出了位流包括10个Huffman代码字的示例。在一个代码字总是由一个频谱值形成的情况下,这里就可以对10个频谱值进行编码。然而,通常总是2个或4个频谱值用一个代码字共同编码,这就是图6示出包括20或40个频谱值的一部分编码位流的原因。在每个Huffman代码字包括2个频谱值的情况下,数字1标定的代码字表示前2个频谱值,第一个代码字的长度比较短,这意味着前两个频谱值的值,即两个最小的频率系数,出现的比较频繁。而带有数字2的代码字却有较长的长度,这意味着已编码的音频信号中第3和第4个频谱系数的量值较少,这就是它们被用一个较多的位来编码的原因。还有,从图6中可以清晰地看出,具有数字3、4和5的代码字也出现得较频繁,因为各代码字的长度较小,数字3、4和5表示频谱系数5与6或7与8或9与10。同样的分析合适于带有数字6至10的代码字。
正如已经提到的,从图6中显然可以清晰地看出,在考虑用已知的编码设备生成位流的情况下,用于对频谱值编码的Huffman代码字以与频率相关的线性增长方式被安排在位流中。
在信道出现故障的情况下,Huffman代码的一个主要的缺陷是差错的扩散。例如,可以假定图6中的第二个代码字受到干扰。存在某一个不低的概率,即该差错的第二个代码字的长度也会被改变。因此它就不同于正确的长度。如果,在图6的例子中,第二个代码字的长度由于一个干扰而被改变,对于一个编码器而言就不再可能确定代码字3至10的起点,即所表示的几乎整个音频信号的起点。这就意味着跟随在已被干扰的代码字后面的所有其他代码字就不能再被正确编码,因为不知道这些代码字从哪里开始,并且因为由于该差错而选择了一个不正确的起点。
作为对该差错扩散问题的一个解决方法,欧洲专利0612156号建议将可变长度的代码字的一部分安排在一个栅格(raster)中,并把余下的代码字分散于余下的空隙中,以便安排在一个栅格点(raster point)的一个代码字的起点能在不进行全面解码的情况下或者在不正确传输的情况下更容易找到。
确实,该已知的方法通过重新安排代码字的方式对差错的扩散提供了一些补救。对于某些代码字而言,在位流中确定一个固定位置,余下的空隙供余下的代码字使用。这并不耗费任何附加的位,却能防止在出现差错的情况下差错在重新安排的代码字之间扩散。
然而,该已知方法的效率上的一个决定性的参数取决于在实际应用中确定栅格的方式,即必须使用多少个栅格点,以及该栅格所必须具有的间隔等除了使用一个栅格来抑制差错扩散的一般性建议之外,欧洲专利0612156号并未给出有关如何有效地设计该栅格以便一方面能够进行耐差错的编码另一方面又能够高效编码的任何更为详细的信息。
在本申请提交日之后发布的德国1947119.631号专利申请建议,不是把任何代码字都定位于栅格点上,而是把那些从心里听觉(psycho-acoustic)的角度来看具有特殊意义的代码字,即那些能够对音频信号起重要作用频率值的代码字定位于栅格点上。在图5中示出了由这样的一个编码器生成的一个具有可变长度代码字的数据流。和图6中一样,该数据流也包括10个代码字,画影线的为具有优先权的代码字。第一优先权代码字被定位于在第一栅格点100开始,第二个优先权代码字被定位于在第二个栅格点101开始,第三个优先权代码字被定位于在第三个栅格点102开始,第四个优先权代码字被定位于在第四个栅格点103开始而第五个优先权代码字被定位于在第五个栅格点104开始。第一节(segment)105由栅格点100和101定义。以同样的方式,对第二节106,第三节107,第四节108以及最后一节109进行定义。图5中示出,前两节105和106的长度与107和108两节的长度不同,而且还与最后一节109的长度不同。可以说,无优先权的代码字6,7,8,9与10则在优先权代码字之后被插入该数据流中,以使数据流被填满。如图5中所示,在该后公布的方法中,无优先权的代码字接在被写入的优先权代了之后被连续插入该栅格中。具体地讲,无优先权的第6个代码字跟在无优先权代码字1的后面被写入。105节中剩下的空隔被后随的无优先权代码字7填入,而无优先权代码字7的剩余部分即7b,则紧随在优先权代码字3的后面被写入下一空隔即107节中。无优先权代码字8至10执行同样的过程。
在图5中示出的该后公布的方法的优点是优先权代码字1至5受到保护而免于差错扩散的影响,因为它们的起点与栅格点重合并因此而被知晓。
例如,如果优先权代码字2在传输中受到破坏,则在图6中所示的现有技术中很可能解码器将不能对余下的任何代码字3至10正确地进行解码。然而在图5所示的方法中,下一个代码字,即优先权代码字3,在栅格点102开始,这样,该解码器总会找到代码字3的正确起点。因此,在图5所示的方法中,不会有什么系列差错出现,而只是优先权代码字2将被破坏。因此,该方法对定位于栅格点的优先权代码提供了有效的保护。
然而,对于无优先权代码字没有有效的保护。参见图5,破坏无优先权代码字6,以至解码器把短了一位的一个代码字设想为不正确的代码字6,这将导致不再能够正确地对代码字7进行解码,因为正确的代码字6的最后一位被解释为下一个代码字7的开始。因此,代码字6中的一个差错将导致由于序列差错而非常可能不再能够对跟随在它后面的任何代码字进行正确解码,即使它们并未受到传输差错的影响。
本发明的目的是找出一种写入与读出可变长度代码字数据流的基本原理,以提供防止由于不理想的数据流传输而引起的序列差错的具体保护方法。
通过根据权利要求1的生成一个数据流的方法,及通过根据权利要求15的读出一个数据流的方法,并通过根据权利要求20的生成一个数据流的设备以及根据权利要求21的读出一个数据流的设备,该目的得以实现。
本发明的是基于认识到具有可变长度代码字的一个数据流必须如此配置使得于该数据流中的连续的代码字必须被尽快分开以使解码器不会由于一个传输差错而生成数量非常大的序列差错。为此,将被传输的可变长度的代码字被分成多个集(set)。第一个集可以包括优先权代码字,而第二个集可以包括无优先权代码字。为了也对无优先权代码字提供保护使之免受传输差错的破坏,它们不能像在现有技术中那样被简单地写入未被占用的栅格,而是要被分散于各分立的节中。在对接收器进行已知的固定的分配之后,无优先权代码字被如此地分配到各节,以致每个无优先权代码字即来自第二个集的每个代码字被分配到该数据流的一个不同的节。为使这一做法奏效,每个集只能具有与供该数据流使用的节的数量相同的代码字。因此,第一集的代码字被写入栅格,使第一集的每个代码字从一个栅格点开始。然后进行尝试,把第二个集的每个代码字如此地写入数据流,使第二个集的每个代码字被分配到一个不同的节。由于这种分配,即第二个集的每个代码字被写入一个不同的节,解码器将不再仅连续地对第二个集的代码字进行解码,而是转至在该栅格中为第二个集的每个代码字设置的相应的节以便从该节中提取第二个集的相应的代码字。
如果,第一个集的代码字已被写入一个节之后,该节已满到只有部分空间可供分配给该节的第二集的代码字使用或者根本就没有空间了,则仍有空间的第二集的代码字的那部分被写入所分配的该节,余下部分被储存起来。如果对该代码字已完全没有空间,则该代码字被整个地储存起来,直至第二集的每个代码字的分配已被尝试。只有当此时才进行第二次尝试,把第二个集的被储存的部分的或被储存的完整的代码字按照预定的规则写入仍未被占用的节的部分中。
在栅格的配置使第一个集的代码字中有比该节的长度要长的代码字的情况下,可以尽早地采用相同的方法来写入第一个集的代码字。
一旦一个解码器从数据流中提取了从栅格点开始的第一个集的代码字,它将继续提取第二个集的代码字。在解码器只找到第二集代码字的一部分的代码字的情况下,该部分将被存储起来而该处理则继续在一个不同的节中寻找第二集的下一个代码字。仅在所有的节均在这种第一次尝试中被搜索之后,第二个集的一个代码字的缺失部分将在第二次或以后尝试中被确定,或者其所分配的节已被第一集的代码字占用的第二集的一个代码字被确定。
参见图5,代码字6中的一个差错将因此而不再会导致代码字7中的一个差错,因为代码字7会在一个与节105不同的节中开始,而且代码字6的后面将是一个完全不同的不与其相邻的代码字。
为了进一步地说明,可以使用一个简单的例子。该例子是基于假设存在第一集的两个代码字和第二集的两个代码字,也就是说总共四个可变长度的代码字。为了与现有技术比较,进一步假定代码字1与3加在一起的长度足以填入第一个节,而代码字2与4加在一起的长度,足够完全填入第二个节。在这种情况下,根据现有技术的一个设备与根据本发明的一个设备一样对相同的数据进行写操作。根据现有技术的设备首先会把优先权代码字1与2写入两个栅格点,然后在代码字1的后面写入代码字3并把代码字4写入栅格中未被占用的下一个空隔,也就是说写在代码字2的后面。纯粹是巧合,代码字4因此而不再(至少是部分地)位于第一节中,而是完全位于第二节中。
根据本发明的一个设备一开始将把第一集的代码字写至相应的栅格点并且然后将把第二集的第一个代码字写入第一节中并把第二集的第二个代码字写入第二节中,而无论在第一节中是否仍有空间。根据该发明的该设备无论如何都要因此而尝试把第二集的每个代码字写入不同的节中。
即使由于巧合两个数据流看起来相同,对于将从该数据流中提取可变长度代码字以便根据解码器要求的顺序安放它们的接收器而言仍将出现明显的差别。在现有技术中,一个用于提取的设备一开始将读出第一个栅格点的代码字1和第二个栅格点的代码字2,以便获得第一集的代码字。然后,根据现有技术的一个设备将转至余下的数据流的开端并在那里读取代码字3,并接着读取代码字4。
根据本发明的一个设备,在读取第一集的代码字1与2之后,也将转至余下的数据流的开始端并在那里读取代码字3。然而,根据该发明的设备将在此后跳至下一节以便读取第四个代码字的开始端,即第二集的第二个代码字。
下面,将假设第三个代码字,即在假定的数据流中将被写在第一集的第一个代码字后面的第二集的第一个代码字,已经受到干扰,以致解码器将把这同一个代码字理解为比其实际长度要短的一个代码字。在这种情况下用于读取数据流的该已知设备将读取第三个代码字并将由于该传输差错而非常快地停止并判定实际上属于第三个代码字的余下的一位或多位是第四个代码字的开始端。然而,根据本发明的设备将跳至在第三个代码字被终止后的下一节,并将因此而正确地确定第四个代码字的开端。
通过使用这一简单的例子,从中可以清楚地看出本发明的最重要的优点,即由于把第二集的代码字分到独立的节,而在第二集的代码字,比如说也可以是无优先权代码字中防止序列差错。然而,在现有技术中,正如参照图5所描述的,即使由现有技术以及由本发明生成的可变长度代码字的数据流由于巧合而可能是相同的,序列差错也会出现。
下面将参照附图对本发明的优选实施例进行详细解释,其中:
图1示出了所发明的用于生成一个可变长度代码字数据流的设备;
图2示出了所发明的用于读取具有可变长度代码字的数据流的设备;
图3通过可变长度代码字的三个集示出了所发明的方法的一个程序图;
图4示出了用于说明所发明的读取根据图3生成的一个数据流的方法的一个程序图;
图5示出了由一个已知设备生成的并且其中的优先权代码字受到差错扩散影响的一个数据流;
图6示出了已在其中按照优先权代码字与无优先权代码字进行分类的一个数据流。
在对图1进行更为详细的描述之前,应该注意,在技术上对于可变长度代码字的编码也称作平均信息量编码。平均信息量编码的一个典型例子是所谓的Huffman编码。原则上,在Huffman编码中,对被编码的信息符号进行统计分析以便确定用于比不大频繁出现的信息符号更频繁出现的信号符号的较短的代码字。在一个完整的Huffman代码中,所有的代码字均终止于一棵代码树的端点或分枝。例如,一个Huffman解码器连续地读入一个具有Huffman代码字的数据流,并通过图解的方法,跳至具有它额外读入的每一位的该指定的代码树的一个分枝,在经过一定数量的跳转,即与该代码字的位数亦即该代码字的长度相对应的数量的跳转之后,它到达不再具有进一步分枝的、并因此而是一个代码字的一个枝端。该解码器于是获知一个新的代码字从下一位开始。每有要求,该处理即重复一次,直至该数据流被完全读入为止。每次当Huffman编码器跳回起始点,即该树的根部时,一个代码字即在其始点出现。由于代码字的长度是由代码字自身或由编码器及解码器中已知的代码树默定的,可以看出,数据流中导致一个位错位的一个干扰会在代码树中对解码器产生误导,可以说这将使解码器结束于一个不同的代码字,即可能具有与正确的代码字不同长度的一个错误的代码字。在这种情况下,一旦到达错误的代码字,解码器将向回跳转,而且由于后随的位,再次从代码树中的一个分枝点向另一个分枝点运动。然而,对于该解码器而言,避免序列差错是不可能的,除非其巧合地结束于“正确的跟踪目标”。
因此,差错防护,比如由本发明提供的差错防护,必须进行,以保证耐差错的传输。因此,可以说,根据本发明的用于生成一个可变长度代码字数据流的设备可以作为Huffman编码器的发送或输出级,而用于读取可变长度代码字数据流的设备则可以作为Huffman编码器的接收或输入级。由此可以看出,本发明不仅适用于Huffman编码器,而且也适用于易于出现序列差错的具有可变长度代码字的任何代码。
图1示出了一个所发明的用于生成一个可变长度代码字数据流的设备10,该设备具有一个输入端口和一个输出端14。在输入端12,可变长度代码字生成,而在输出端14,耐差错的数据流被输出。最好设备10的输入端12处的可变长度代码字事先已进行了预分类,使得优先权代码字处于第一集,较不重要的代码字处于第二集而更不重要的代码字处于第三集,等等。
该可变长度代码字被输入到用于把第一集的代码字写入数据流的一个设备16中,这就使第一集的代码字各自从栅格点开始。
此外,该可变长度代码字被输入到用于把第二集的代码字写入数据流的一个设备18中,并为第二集的每个代码字分配一个不同的节。因此,在两个设备16与18之间的数据流中,只有第一集的所有代码字被送至栅格点。在可变长度代码字仅由两个集的代码字组成的情况下,则耐差错的数据流已经出现在设备18的输出端。在存在多于两个集的可变长度代码字的情况下,还有用于把相应集的代码字写入数据流的其他设备,用标号20以符号形式示出。
图2示出了所发明的用于读取在输出端14(图1)输出的耐差错数据流的一个设备22,其具有一个输入端24和一个输出端26。在输入端24输入耐差错的数据流,以便在输出端26输出其顺序与在输入端12(图1)形成的顺序相对应的可变长度代码字。用于读取数据流的设备22包括用于通过跳至栅格点的方式提取第一集的代码字的一个设备28,用于通过跳至余下的数据流的栅格点的方式提取第二集的代码字的一个下游设备30以及,如果必要,用于提取和其他的集一致的代码字的其他设备32,如果存在这样的集的话。
在以图3为基础,通过一个例子对由设备10(图1)实现的方法进行详细解释之前,首先将给出该方法的概要。可用的代码字被分成多个集。除了最后一个之外,每个集包括与所存在的可用的节一样多的代码字。在最佳的情况下,一个集含有与所存在的可用的节一样多的代码字。然而,一个集也可以含有更多或者更少的代码字,正如对于最后一个集而言几乎必将是这种情况,因为可变长度代码字的预定数量必须假定。如果存在M个节而且如果一个集有N个代码字,则被写至栅格点的代码字的数量与M和N中的最小者一致,而在根据该发明的栅格中存放该N个代码字的尝试的次数则与M和N中的最大者一致。
最好是,第一集有最重要的代码字,即表示与其他的信息符号相比更为重要的信息符号的优先权代码字。接下来的集中含有按照由一个预选算法提供的顺序排列的较不重要的代码字,最好是该算法还对优先权代码字和无优先权代码字进行分类。这些集由设备10连续地写入。写入一个集需要几次尝试。在第一次尝试中,当前集的第一个代码字被写入第一节,以此类推,直至当前集的最后一个代码字被写入最后一个节为止。当然,一个代码字可以按照某一确定的规则从第二个,从第三个或从任何其他的节开始继而写入每个节中。
如果一个代码字不能填入一个节,该代码字的余下部分则被储存起来。在第二次尝试中,第一个代码字的余下部分,如果存在的话,则被优先写入第二个节,以此类推,直至最后一个代码字的余下部分被优先地写入第一个节。这样的一种算法还被称为模数位移(moduloshift)。显然,在下一轮,即下一次尝试中,有关一个代码字的余下部分是写入后随的第一个节还是后随的第三个节的预定规则是可以任选的。
一旦一个集被全部写入,就开始写下一个集。为了防止扩散差错,还要根据该发明的一个优选实施例,改变在一个节内的集与集之间的写操作方向。例如,第一集的代码字从左向右写,而第二集的代码字从右向左写,等等。因此,通过本发明,也可以说,根据该优选的实施例,一个栅格点的第二侧端被用于绝对的差错防护。
上面简要概述的系统应用能够非常有力地降低对一个特定代码字的差错扩散概率的值。随着集被连续写入以及随着一个集的每个代码字被赋分配到一个特定的节并被写入该节,如果在该节中仍有空间,那么没有差错从一个集中的一个代码字向该集中的下一个代码字扩散就是可能的,因为一个解码器在解码时总是从一个节跳至一个节而且并不认为一个代码字的开端位于前一个代码字结束的地方,在现有技术中的事实就是如此。如果由于可用的空间不足以完整送入一个代码字该代码字只是部分地被写入该节中,则至少差错扩散的可能性降低了。
根据本发明的一个优选实施例,节宽的选择使优先权代码字完全填入这些节。因此,写第一集只需要一次尝试。然而,这是任意的。通常,由于目的在于大量的栅格点用于一个数据流,即一个节长要尽可能的小,第一集的代码字要长于该节长的情况也可以出现。然而,这种情况会像写第二个集一样对待,即,也按照一个必须为编码器以及为解码器所知的预定规则。
图3通过一个例子解释了所发明的用于写入可变长度代码字的方法。在该例中,有15个可变长度代码字30,被事先分成具有6个代码字1至6的第一集,也有6个代码字7至12的第二集以及具有余下的3个代码字13至15的第三集。如图3中所示,代码字30具有可变长度。
根据本发明的一个优选实施例,节长,即该节的长度,要长于第一集的最长的代码字的长度。第一集的代码字被安置于栅格点41至46,其中,对于最后的一个节6,一个未被使用的栅格点由一条点划线指明,然而,由于该数据流的端点47可以说也能被认为是一个栅格点,于是由一条点划线指明的该栅格点就是多余的了。第一节6因此而长于其他节,然而这与本发明完全无关。一般来讲,节可以有在数据流内变化的任意长度,因为可以理解,一个节的当前长度必须为解码器所知,以便该发明的优点能够得到利用。
首先,第一集的代码字在步骤a)中被写入数据流,这将形成由31标明的不连贯的数据流,其中第一集的代码字如在整个图3中表示写操作的方向的箭头48所指明的那样,从左向右被写入各自相应的节中。由于选择的节长长于第一集的代码字的最大长度,在步骤a)中只要一次尝试。如果节较短,则相应地要求较多的尝试。
现在在步骤b)中把第二集的代码字写入数据流31。为了实现高耐差错,第二集的代码字最好不要像第一集的代码字那样从左向右写,而是如由写方向的相应箭头指明的那样,相应地从第二个栅格点,例如第一个节的栅格点42开始从右向左写。第二集的代码字的写入要按照一个预定的分配法则进行,比如说在选定的例子中,第二集的第一个代码字将被写入第一集的第一个代码字的同一个节中,然而,总是要以在该节中仍有空间为条件。从第一次尝试中形成的数据流32表明,在第一个节中只有供写入代码字7的起始段的空间。
和把代码字第7的第二部分写入第二节的现有技术相比,代码字第7的第二部分,即7b)被储存起来以供在第二次尝试中按照一个预定规则,即按照一个也必须为解码器所知的规则将其写入数据流。图3清晰地显示出,在第二节中,在代码字第2与第8之间仍有足够的空间供代码字第7的最后部分进入。如果没有足够的空间,该代码字的第三部分将被送入第三节。这样,在图3中,用于把代码字第7送入数据流的预定规则就在于在所有的情况下均由一个节进行处理。当然,也可以由两个节或者三个或更多的节进行,这样作的结果,就能使第二个节7b)在下一次尝试中被写入第三个节,被写入第五个节,等等,而不是第二个节。被用于在某个地方接收段7的第二部分的节的顺序是任意的。然而,该顺序对解码器必须是透明的,以便被重新分类的数据流能被重新读取。
现在,第三集的代码字13至15被送入所形成的仍然不连贯的数据流33。从步骤b)类推,这最好按照同一分配规则执行,使第三集的第一个代码字被分配到第一节,第三集的第二个代码字被分配到第二节,第三集的第三个代码字被分配给第三节,等等。对于第三集而言该分配规则完全是任意的并且也可以与用于第二集的分配规则不同,即根据该发明,一个集的每个代码字被分配给一个不同的节。
步骤c)中的第一次尝试仅在把代码字第15的第一段送入,形成一个不连贯的数据流34这一点上是成功的。代码字13,14与代码字15的第二段即15b)被储存起来以供在第二、第三、第四、第五以及第六次尝试中被接纳,其中第二段15b)会在第二次尝试中被接纳于第四节(数据流35),其中在第三次尝试中没有任何东西被接纳,其中代码字14的开始段会在第四次尝试中被接纳(数据流36),其中代码字14的最后一段即14b会在第五次尝试中被接纳(数据流37)而其中,最后,第三集的第一个代码字会在第六次并且是最后一次的尝试中被送入第六节,为在此图示的例子形成耐差错的数据流38。利用图3描述的方法保证该耐差错数据流的长度完全相等于这些可变长度代码字的长度之和,对于用于数据缩减的平均信息量编码而言这是不言而喻的。然而,本发明并不局限于具有最小长度的耐差错数据流,因为耐差错是不受可能出现的任何填充位的影响的。
对于图3中所示的增强型数据流,可以看出代码字8的起点即栅格点43完全独立于代码字7的终点。还有,代码字9的起点即栅格点44完全独立于代码字第8的终点。另外,应该注意到,由于写顺序相反,第一节中代码字第1中的一个数据差错,比如说将由于该数据差错而导致不正确的代码字比正确的代码字第1短一位的数据差错,不会导致代码字7a的起始段的破坏,因为后者是从右向左而不是从左向右写的。如果它从左向右写,解码器会把从一开始的正确代码字第1余下的一位看作是代码字第7的起始位,这将导致从1至7的序列差错。然而,该序列差错不会扩散至8,因为由于代码字8所选的写顺序是从右向左因而它还是完全独立于代码字7的。如果代码字第8的写顺序与第一集的代码字的写顺序相同,差错就不会从7向8扩散并且,因为代码字8会由于分配规则而挨着代码字2写在第二部分7b的前面,并且因此而不受不正确段7b的影响。
通过一个恰当的例子,图4示出了用于读取耐差错数据流38的设备的运行状况。一开始,在步骤a)从耐差错的数据流提取第一集的代码字。为此,可以与Huffman解码器配对使用的所发明的该设备从第一个栅格点41开始读取第一集的代码字,从第二个栅格点42开始读取第一集的代码字第2,等等,直至第一集的所有代码字1至6被读入为止。用于读取数据流的设备选择与用于生成数据流的设备所使用的方向相同的方向,这是不言而喻的。
接着,在步骤b)从余下的数据流50提取第二集的代码字。这里,解码器跳至第一节的第二个栅格点42获取第二集的代码字7的起始段,随后,它并不读入第二段7b,而是首先储存7a,以便接着从第二节的第二个栅格点开始读入第二集的第二个代码字,等等。其结果是一个残余的数据流51,其中的第一节已被完全腾空。由于该解码器现在并不连续读取代码字7,而总是根据用于生成该数据流的设备的分配规则逐节地读取,则已被描述的能够有力地降低序列差错扩散的耐差错就得到了保证。
在提取第二集代码字的第二次尝试中,代码字7b的第二部分根据现有的写方向被读入第二节中,于是,仅有第三集的代码字余留于由此产生的数据流52中。(第二节现在是空的。)这些代码字是在步骤c)中提取的,其中代码字15的起始段一开始已在第一次尝试中被确定,然而并不必储存,因为在第三节中未曾发现代码字15是完整的。第三节现在也是空的,然而,栅格点仍然存在,以便解码器能够用它们为自己定向。在第二次尝试中,能够发现代码字15是完整的。然而,通过数据流54可以看出,在节3中对代码字14以及在节14中对代码字15的搜索仍未成功。尽管如此,在第四次尝试中,在第5节中对代码字14的搜索产生肯定的结果。然而,代码字14是不完整的,这就是起始段14a被储存以便在第五次尝试中对余下的数据55进行检查,并且在最后的第六次尝试中全部地读入数据流56的原因,现在数据56仅由第六节并和代码字13组成。
虽然在前面的例子中,通过举例,仅对把代码字分成起始段与结束段的一个方法进行了说明,但是原则上讲,任何类型的方法均是可行的。只要解码器遵循把第二集的或者第三级的以及其他集的代码字分别地分配给不同的节,耐差错的编码就会得到保证。而且,进入数据流的代码字的结束段的分类是任意的,只要解码器或者解码器的上游读入电路确知在编码器中执行了哪一个预定规则。