我正在读一个有损的比特流,我需要一种方法来恢复尽可能多的可用数据。可以有1代替0和0代表1的位置,但准确度可能超过80%。
如果算法可以补偿缺失/太多位,则可以获得奖励。
我正在读取的信号源是噪声模拟(麦克风通过FFT),读取时序可能因计算机速度而异。
我还记得读过CD-ROM中使用的算法吗?层,所以我猜测使用几个层是一个不错的选择。我不记得细节,所以如果有人可以分享一些很棒的想法! :)
修改:添加了示例数据
Best case data: in: 0000010101000010110100101101100111000000100100101101100111000000100100001100000010000101110101001101100111000101110000001001111011001100110000001001100111011110110101011100111011000100110000001000010111 out: 0010101000010110100101101100111000000100100101101100111000000100100001100000010000101110101001101100111000101110000001001111011001100110000001001100111011110110101011100111011000100110000001000010111011 Bade case (timing is off, samples are missing): out: 00101010000101101001011011001110000001001001011011001110000001001000011000000100001011101010011011001 in: 00111101001011111110010010111111011110000010010000111000011101001101111110000110111011110111111111101
编辑2:我可以控制发送的数据。目前正在尝试实施简单的XOR检查(虽然这还不够)。
答案 0 :(得分:3)
如果我理解正确,您有两个需求:
调制和解调是一个众所周知的应用程序,several ways用来调制信息。
第二,错误纠正也是众所周知的,有几种可能性。哪一个适用取决于错误率以及您是否具有双工操作,以便您可以请求重新发送。如果你有良好的质量并且可以请求重新发送类似于TCP正在使用的方法值得探索。
否则,您将不得不采用错误检测和纠错算法,例如CDROM上使用的算法。
在评论后修改
完成调制/解调并且没有重发可能性缩小了问题。如果您遇到时序问题,我仍然建议您阅读现有的(de)调制方法,因为有方法可以自动与发送器重新同步并提高信噪比。
解决核心问题;纠错时,您必须将奇偶校验位添加到输出流,以便能够检测错误。从@Justin建议的前向纠错文章开始,一个看似非常简单但仍然强大的方案是Hamming(7,4)方案。
答案 1 :(得分:2)
有很多可能性,请参阅:http://en.wikipedia.org/wiki/Error_detection_and_correction
这可以帮助您更改位,但是如果您拥有所有位,则可能不适合检查。
最后,它可能需要的不仅仅是几行简单的代码。
答案 2 :(得分:2)
您需要使用forward error correction。 XOR奇偶校验仅检测何时发生错误。一个简单的纠错算法是多次(至少3次)发送每个数据块并作出多数决定。
算法的选择取决于几个因素: