Encoding 冗余编码?

Encoding 冗余编码?,encoding,redundancy,information-theory,Encoding,Redundancy,Information Theory,这更像是一个计算机科学/信息理论问题,而不是一个简单的编程问题,所以如果有人知道一个更好的网站来发布这篇文章,请让我知道 假设我有一个N位的数据块,它将在M条消息中冗余发送,其中至少有M-1条消息将被成功接收。我对在每条消息中以较少的比特数对N位数据段进行编码的不同方式感兴趣。(这类似于但级别小得多,其中N=8或16或32) 示例:假设N=16,M=4。然后我可以使用以下算法: 1st and 3rd message: send "0" + bits 0-7 2nd and 4th messag

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

假设我有一个N位的数据块,它将在M条消息中冗余发送,其中至少有M-1条消息将被成功接收。我对在每条消息中以较少的比特数对N位数据段进行编码的不同方式感兴趣。(这类似于但级别小得多,其中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位或更少的位来完成这项工作,可能有一种方法可以用更少的总位来完成这项工作,但我不确定如何完成

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

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


(编辑:将第二部分移至一个单独的问题)

请参见。

我不确定是否正确理解了您问题的所有细节,但您的问题肯定是关于设计某种产品。这是计算机科学的一个广阔领域,关于这一领域的著作很多。从wikipedia开始,看看你是否能在你的案例中找到任何简单的方案(如Hamming或Reed-Solomon代码)

如果您不仅想处理符号损坏,还想删除符号,您应该看看,这肯定是一项更困难的任务,但在许多情况下都有很好的方法

编辑:似乎是一个很好的介绍。

(下面是不完整的答案。我以后可能会补充更多。)

您可能感兴趣的术语是信道编码:为信源添加冗余,以使其在噪声信道上传输时具有鲁棒性。在信息论中,信道编码的补充问题是信源编码:减少信源中的冗余以使用较少的比特来表示它。(这两个问题的结合称为联合信源信道编码。)

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

这个代码效率很低。要使用标准符号,让k=原始消息中的位数,n=传输消息中的位数。例如,k=16,n=36。编码效率的度量是k/n,其中越高意味着效率越高。在你的例子中,k/n=0.44。这太低了

重复码是一种简单的块码,即,对k位的每个块添加冗余以创建n位的码字。其他人提到的汉明和里德-所罗门密码也是如此。汉明码相对容易理解一些基本的线性代数


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

你正在寻找数据包擦除代码。只有两个有用的数据包擦除代码没有完全被专利所束缚,而且只有一个开源库来实现这些代码。在这里找到它:

这里有一个非常简单的方案,其效率几乎是您的示例的两倍

您将消息切分为(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]

在每个编码的块前面加上一个日志(M)位序列号,基本上和你做的一样,这样接收器就可以知道哪个被丢弃了。(如果您可以确定到达的块将按顺序到达,则可以使用1位序列号。只需交替使用0和1。)


要解码,从左到右依次进行异或运算,直到碰到丢弃的块为止。例如,
src[1]==enc[0]^enc[1]
。(删除一个端点块不是特例——例如,如果删除了第一个块,则从右侧开始的扫描将恢复它,从左侧开始的扫描长度为0。)

(顺便说一句,这不是家庭作业)消息是否以随机顺序到达(困难)?或者我们可以假设正确到达的消息总是按照发送的顺序到达(更容易)?这是两年前的事了,我再也不知道了-(OP应该有一个“不再相关”的关闭按钮)在他的例子中,n=36,而不是64。(4*9=36)我不知道我从哪里得到了64。