冗余编码?

时间:2010-01-28 19:43:43

标签: encoding redundancy information-theory

这更像是一个计算机科学/信息理论问题,而不是简单的编程问题,所以如果有人知道有更好的网站发布这个问题,请告诉我。

假设我有一个N位数据将在M个消息中冗余发送,其中至少M-1个消息将被成功接收。我对以每个消息更少的比特编码N比特数据的不同方式感兴趣。 (这类似于RAID但是在更小的水平上,其中N = 8或16或32)

示例:假设N = 16且M = 4.那么我可以使用以下算法:

1st and 3rd message: send "0" + bits 0-7
2nd and 4th message: send "1" + bits 8-15

如果我能保证4个消息中的3个消息将通过,则每个组中至少有一条消息将通过。因此,我可以用9位或更少的位来完成这项工作,可能有一种方法可以用更少的总位来做到这一点,但我不确定如何。

是否有一些简单的编码/解码算法来做这种事情? 这个问题有名字吗?(如果我知道它叫什么,我可以谷歌吧!)

注意:在我的特定情况下,消息要么正确到达,要么根本没有到达(没有消息到达时有错误)。

(编辑:将第二部分移到另一个问题)

5 个答案:

答案 0 :(得分:5)

(不完整的答案如下。我可能稍后再添加。)

您可能感兴趣的术语是信道编码:向源添加冗余,以便在通过噪声信道传输时使其稳健。在信息理论中,信道编码的补充问题是源编码:减少源中的冗余以使用更少的比特来表示它。 (这两个问题的组合称为联合源 - 信道编码。)

您的第一个问题是要求查找频道代码。您提供的简单示例类似于重复代码,即您发送相同的消息超过两次(通常是奇数次),然后最常接收的消息被接受为原始消息。

此代码效率低下。为了使用标准符号,设k =原始消息中的比特数,n =发送消息中的比特数。对于您的示例,k = 16且n = 36. 编码效率的度量是k / n,其中更高意味着更高效。在你的情况下,k / n = 0.44。这很低。

重复码是一种简单的块码,即,将冗余添加到每个k比特块以创建n比特的码字。其他人提到的 Hamming Reed-Solomon 代码也是如此。使用一些基本的线性代数,汉明码相对容易理解。

这些应该足以让您自己搜索。祝你好运。

答案 1 :(得分:2)

我不确定我是否正确理解了你问题的所有细节,但你的问题绝对是设计某种error correcting code。这是一个广泛的计算机科学领域,并且已经写了很多关于它的书。从维基百科开始,看看你是否可以在你的情况下使用任何简单的方案(如汉明或里德 - 所罗门代码)。

如果你不仅要处理符号损坏,还要删除符号,你应该看看erasure codes,这绝对是一项更困难的任务,但在很多情况下都存在很好的方法。

编辑:This material from hackersdelight.org似乎是一个很好的介绍。

答案 2 :(得分:1)

请参阅erasure codes

答案 3 :(得分:1)

您正在寻找数据包擦除代码。只有两个有用的数据包擦除代码并没有完全受到专利的阻碍,并且只有一个开源库可以实现这些代码。在此处找到它:http://planete-bcast.inrialpes.fr/rubrique.php3?id_rubrique=5

答案 4 :(得分:1)

这是一个简单的简单方案,效率几乎是你的例子的两倍。

您将消息切换为(N / M)* 2位的块。而是将其切割成N /(M-1)位块。 (必要时将其四舍五入。)第一个块src[0]自身编码:enc[0]=src[0]。最后一个块也是如此:enc[M-1]=src[M-1]。每个其他块与其左邻居进行异或:enc[i]=src[i-1]^src[i]

使用log(M)位序列号对每个编码块进行前缀,基本上与您一样,因此接收器可以判断丢弃了哪个。 (如果你可以确定无论哪个块到达都会按顺序到达,那么一个1位的序列号就可以了。只需交替0和1。)

要从左侧和右侧连续XOR解码,直到您击中掉落的块。例如。 src[1] == enc[0]^enc[1]。 (丢弃其中一个端点块不是特殊情况 - 例如,如果第一个块被丢弃,则右边的扫描会恢复它,而左边的扫描的长度为0。)