在Python中使用纠错码纠正消息



我正在使用Python开发一个数据隐藏方法。我发送最多16位的信息——0和1。有时,原始消息在通往解码器的途中被弄乱了,所以我试图实现一种错误纠正。

我成功地实现了汉明码,但只有在消息中只有一个错误时才有意义。下面是一个典型的7位消息的例子。

# Original message
message_encoder = [1, 0, 0, 1, 1, 0, 1] 
### COMMUNICATION CHANNEL ###
### COMMUNICATION CHANNEL ###
### COMMUNICATION CHANNEL ###
# Message at the decoder
message_decoder = [1, 0, 0, 0, 1, 0, 0]

所以,在这个例子中,我有两个错误,一个是Bit Error Ratio = 2/7。有没有一种方法可以实现比汉明码更好的纠错?

谢谢!

嗯,是的,但是这个兔子洞相当深。

无论实现是什么,传输速率都将服从香农定理。没有人知道哪个纠错码"更好"。-你能纠正的比特越多,开销就越大。有太多太多的设计需要考虑……

例如,如果你正在处理一个数据流,位翻转不会是你唯一的问题。你变聪明了,为转变的开始和结束引入了标记?它们有多大,有多复杂?如果您正在处理对抗性攻击,并且它们可以欺骗您的系统从错误的位置开始转录,该怎么办?(一天中很酷的事实-这是大自然母亲广泛使用的)。

此外,纠正多个位翻转很快变得非常复杂。学者们写了(最近的)关于解码的论文(23,12,7)好吧,这不是你通常会在周末无聊的时候做的事情。一个更现代的解决方案是LDPC。

一个效率较低但更容易理解的代码的例子是Reed-Muller。它作为一个包(reedmuller)提供,您可以在这里查看代码。

既然你已经要求的代码示例,这里是一个使用reedmuller库:

from reedmuller import reedmuller
rm = reedmuller.ReedMuller(2, 5)
message = r'1100110101010101'
encoded = ''.join(map(str, rm.encode(list(map(int, message)))))
# encoded =           r'10111000011101000001110111010001'
encoded_with_errors = r'10111010011101000101010111010001'
decoded = ''.join(map(str, rm.decode(list(map(int, encoded_with_errors)))))
assert(decoded == message)

(注意:只需要list(map(int(...))),因为我将消息视为字符串。在你的表述中,它们已经是整型数的列表了。

最新更新