编码/纠错挑战

时间:2010-03-06 17:21:35

标签: algorithm math encoding error-correction

在数学上可行的是将4字节消息编码并初始化为8字节,如果8字节中的一个完全丢弃而另一个错误重建初始4字节消息?没有办法重新传输也不会知道丢弃字节的位置。

如果使用Reed Solomon纠错,并在4“数据”字节的末尾添加4个“奇偶校验”字节,例如DDDDPPPP,则最终得到DDDEPPP(其中E是错误)和奇偶校验字节已被删除,我不相信有一种方法可以重建最初的消息(虽然如果我错了,请纠正我)...

如何用常数乘以(或执行另一个数学运算)初始4字节消息,然后利用逆数学运算的属性来确定丢弃的字节。或者,对消息的结构施加一些约束,因此每隔一个字节需要是奇数而其他字节需要是偶数。

或者,也可以是4个十进制数字,而不是字节,它可以以某种方式编码成8个十进制数字,其中可以检测到错误。在上述相同的情况下纠正 - 没有重传,丢弃的字节的位置是未知的。

我正在寻找任何人可能拥有的任何疯狂想法......有什么想法吗?

编辑:

这可能有点做作,但我试图解决的情况是你有一个错误的打印机,它将重要数字打印到表格上,然后邮寄给加工公司它使用OCR来读取表单。 OCR不会是完美的,但它应该只有数字才能读取。有故障的打印机可能是一个更大的问题,它可能会丢弃一个整数,但没有办法知道它会丢弃哪一个,但它们将始终以正确的顺序出现,不会有任何数字交换。

表单可以更改,以便始终在最初的四个数字和错误更正数字之间打印一个空格,即1234 5678,这样就可以知道1234初始数字是否被删除或5678错误更正数字是否被删除,如果这使问题更容易解决。我的想法与他们如何通过算法验证信用卡号码有些相似,但是有四位数字块。

希望这能为我正在寻找的东西提供一些澄清......

7 个答案:

答案 0 :(得分:4)

在没有“漂亮”的代数结构的情况下,我怀疑很难找到一个简洁的方案,让你一直到10 ** 4个代码字,因为从理论上来说,信息并不是很多松弛。 (下面的那个可以使用GF(5)5 ** 5 = 3125.)幸运的是,问题足够小,你可以尝试Shannon的贪婪代码构造方法(找到一个与已经选择的代码字不冲突的代码字,将它添加到集合中。


在GF(128)上编码最多35位作为四次多项式f。在八个预定点x0,...,x7处评估多项式并编码为0f(x0)1f(x1)0f(x2)1f(x3)0f(x4)1f(x5)0f(x6)1f(x7),其中交替的零和1存储在MSB中。

解码时,首先要看MSB。如果MSB与索引mod 2不匹配,那么该字节已损坏和/或它已被删除左移。假设它很好并将其移回右侧(可能在一个点累积多个不同的可能值)。现在我们在已知点处至少有七个四次多项式f的评估,其中至多一个是腐败的。我们现在可以尝试腐败的所有可能性。

编辑:bmm6o提出了我的解决方案的第二部分不正确的说法。我不同意。

让我们回顾一下MSB为0101101的可能性。假设X是发送的字节数组,Y是接收的字节数组。一方面,Y [0],Y [1],Y [2],Y [3]具有正确的MSB并且被假定为X [0],X [1],X [2],X [3] 。另一方面,Y [4],Y [5],Y [6]具有不正确的MSB并且被假定为X [5],X [6],X [7]。

如果X [4]被删除,那么我们有七个正确的f。

评估

如果X [3]被删除而X [4]被破坏,那么我们在3处进行了错误的评估,并进行了6次正确的评估。

如果X [5]被删除而X [4]被破坏,那么我们在5处有一个不正确的评估,并且有六次正确的评估。

除了这些之外还有更多的可能性,但我们从来没有少于六个正确的评估,这足以恢复f。

答案 1 :(得分:3)

我认为您需要研究erasure codes可能为您提供的内容。我自己也不知道任何界限,但也许某种MDS代码可能会实现这一点。

编辑:快速搜索后,我找到了RSCode库,并在example中说明了

In general, with E errors, and K erasures, you will need
* 2E + K bytes of parity to be able to correct the codeword
* back to recover the original message data.

所以看起来Reed-Solomon代码确实是答案,你实际上可以从8,4代码中的一个擦除和一个错误中恢复。

答案 2 :(得分:1)

奇偶校验码只要两个不同的数据字节不受错误或丢失的影响,并且只要错误不等于任何数据字节而奇偶校验字节丢失,就会有效。

答案 3 :(得分:1)

错误纠正码一般可以处理删除,但在文献中,假设删除的位置是已知的。在大多数情况下,当信心很低,可以从信道中检索到正确的数据时,解调器将引入擦除。例如,如果信号不明显为0或1,则设备可以指示数据丢失,而不是冒着引入错误的风险。由于擦除本质上是一个已知位置的错误,因此它们更容易修复。

我不确定你的情况是什么,你可以丢失单个值,你仍然可以确信剩余的值是以正确的顺序传递的,但这不是经典编码理论所解决的情况。

上面提出的算法主义者是这样的:如果您可以将自己限制为仅7位信息,则可以用0和1交替填充每个字节的第8位,这样您就可以知道丢失字节的位置。也就是说,在字节0,2,4,6的高位中加0,在其他位的高位中加1。在接收端,如果只接收7个字节,则丢失的一个字节将从高位匹配的字节之间删除。不幸的是,这不太正确:如果擦除和错误相邻,则无法立即知道丢弃了哪个字节。例如,高位0101101可能是由于丢弃第4个字节,或者是从第4个字节中的错误中丢失第3个字节,或者是从第4个字节中的错误中丢失并且丢弃第5个字节。

您可以使用线性代码:

1 0 0 0  0 1 1 1
0 1 0 0  1 0 1 1
0 0 1 0  1 1 0 1
0 0 0 1  1 1 1 0

(即您将发送数据,如(a,b,c,d,b + c + d,a + c + d,a + b + d,a + b + c)(其中添加了XOR,因为a,b,c,d是GF(128))的元素。它是距离为4的线性代码,因此可以纠正单字节错误。您可以使用syndrome decoding进行解码,并且由于代码是自对偶的,因此矩阵H将与上面相同。

在丢弃字节的情况下,您可以使用上述技术确定它是哪一个。一旦你确定了,你实际上是在解码一个不同的代码 - 通过删除给定字节创建的“打孔”代码。由于穿孔代码仍然是线性的,因此您可以使用校正子解码来确定错误。您必须为每个缩短的代码计算parity-check matrix,但您可以提前完成此操作。缩短的代码具有距离3,因此它可以纠正任何单字节错误。

答案 4 :(得分:0)

在十进制数字的情况下,假设一个数字为第一个数字,第二个数字为偶数,第三个数字为奇数等 - 有两个数字,则得到00-99,可以用3个奇数/偶数/奇数字表示(总共125个组合) - 00 = 101,01 = 103,20 = 181,99 = 789等。因此,将两组十进制数字编码为6位总数,然后最后两位数字表示关于第一组2的数字数字或某种校验和......我猜,倒数第二个数字可能是每个初始2位数初始消息的某种奇数/偶数指示符(1 =偶数前2位数,3 =奇数前2位数)数字)并遵循奇怪的模式。然后,最后一个数字可以是各个数字之和的位置,这样如果数字丢失,它将立即显现并且可以在假设最后一个数字正确的情况下进行纠正。虽然,如果最后两位数中的一个被删除,它会抛弃它......

答案 5 :(得分:0)

如果我们在错误的字节中假设1位错误,理论上看起来是可能的。我们需要3位来识别丢弃的字节,3位用于识别错误的字节,3位用于识别错误的位。我们有3倍的额外比特。

但是如果我们需要在错误的字节中识别任意数量的位错误,那么它将达到30位。即使这看起来有可能是32位,虽然32有点太靠近我的舒适。

但是我不知道编码得到那么热。试试涡轮编码?

答案 6 :(得分:0)

实际上,正如克里斯蒂安所说,当你纠正一个RS码时,消息和"奇偶校验"只要你有v + 2e<字节就会被纠正。 (n-k)其中v是删除的数量(你知道位置),e是错误的数量。这意味着如果您只有错误,则可以纠正最多(nk)/ 2个错误或(nk-1)个删除(大约是错误数量的两倍),或两者的混合(参见{{3} }和Blahut's article: Transform techniques for error control codes)。

更好的是,您可以检查校正是否成功:通过检查校正子多项式仅包含0个系数,您知道消息+奇偶校验字节都是正确的。您可以在检查消息是否需要任何更正之前执行此操作,并且还可以在解码后执行检查以检查消息和奇偶校验字节是否已完全修复。

约束v + 2e< (n-k)是最优的,你不能做得更好(这就是为什么Reed-Solomon被称为最佳纠错码)。实际上,使用强力方法可以超越此限制,使用A universal Reed-Solomon decoder可以达到某一点(每8个符号可以增加1或2个符号),但它仍然可以在一个处于起步阶段的领域,我不知道任何有效的实际实现。