用于读取噪声比特流的冗余算法

时间:2011-01-05 18:41:56

标签: c# .net algorithm

我正在读一个有损的比特流,我需要一种方法来恢复尽可能多的可用数据。可以有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检查(虽然这还不够)。

3 个答案:

答案 0 :(得分:3)

如果我理解正确,您有两个需求:

  1. 将信号调制为声音,然后对其进行解调。
  2. 应用错误更正,因为通道不可靠。
  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次)发送每个数据块并作出多数决定。

算法的选择取决于几个因素:

  • 频道利用率(如果您有大量的空闲时间,则不需要有效的编码)
  • 错误类型:是随机分布的坏位还是通常连续出现
  • 处理时间:如果数据传输需要快速,则代码复杂性有限