2011-01-05 4 views
7

私は損失のあるビットストリームを読んでおり、できるだけ多くの使用可能なデータを回復する方法が必要です。 0の代わりに1があり、1の位置に0がありますが、精度はおそらく80%を超えています。ノイズの多いビットストリームを読み取るための冗長アルゴリズム

アルゴリズムが足りない/多すぎるビットを補うことができる場合は、ボーナスになります。

私が読んでいる音源は、ノイズ(アナログエフェクトによるマイク)であり、読み込みのタイミングはコンピュータのスピードによって異なります。

CD-ROMで使用されているアルゴリズムについて、3でこれを読んでいるのを覚えていますか?私はいくつかの層を使用して推測しているので、良い選択です。私は詳細を覚えていないので、誰かが素晴らしいアイデアを共有することができれば! :)

編集:追加サンプルデータ

 
Best case data: 
in: 0000010101000010110100101101100111000000100100101101100111000000100100001100000010000101110101001101100111000101110000001001111011001100110000001001100111011110110101011100111011000100110000001000010111 
out: 0010101000010110100101101100111000000100100101101100111000000100100001100000010000101110101001101100111000101110000001001111011001100110000001001100111011110110101011100111011000100110000001000010111011 

Bade case (timing is off, samples are missing): 
out: 00101010000101101001011011001110000001001001011011001110000001001000011000000100001011101010011011001 
in: 00111101001011111110010010111111011110000010010000111000011101001101111110000110111011110111111111101 

EDIT2:私が送信されたデータをcontrollすることができています。現在、簡単なXORチェックを実装しようとしています(それだけでは不十分です)。

+0

ストリームに書き込まれる内容を制御できますか?そうでない場合は、エラー訂正コードとともにデータが書き込まれる必要があるため、CDの例は適用されません。 – CodesInChaos

+5

私はこの質問を理解していません。信頼性の低いチャネルで何らかの通信プロトコルを作成しようとしていますか?または、何か悪い魔法のアルゴリズムを見つけることを試みている、それは、細い空気から、何が間違っているか正しいと思いますか? – Euphoric

+0

私は音(スピーカー+マイク)で通信しようとしています。私はビットを送信するために特定の周波数を使用しているので、アプリケーションはこの特定の周波数を探しています。 –

答えて

2

forward error correctionを使用する必要があります。 XORパリティチェックは、エラーが発生したときのみ検出します。単純な誤り訂正アルゴリズムは、データの各チャンクを複数回(少なくとも3回)送信し、多数決をとることです。

アルゴリズムの選択は、いくつかの要因に依存する

  • チャネル利用
  • エラー・タイプ(あなたは自由な時間がたくさんある場合は、あなたが効率的なコーディングは必要ありません):不良ビットがランダムです間隔または彼らは通常
  • 処理時間の行で発生します:データ送信は私が正しくあなたを理解していれば
+0

私は同意する、Xorは遠くに(そして少し高価です)得ることはありません。 –

2

は、多くの可能性は、参照があります。これは、変更されたビットのお手伝いをすることができますが、すべてのビットを持っている時はいつでも確認することは不適当かもしれhttp://en.wikipedia.org/wiki/Error_detection_and_correction

最終的には、数行以上の単純なコードが必要になるでしょう。

+0

ニース..私はhttp://en.wikipedia.org/wiki/Cross-interleaved_Reed-Solomon_codingを望んでいるようです。しかし、Reed-Solomonの.Netライブラリは見つかりません。自分自身を実装するために少し複雑に見えます。 –

3

速くする必要がある場合は、コードの複雑さが制限され、次の2つのニーズを持っています:

  1. 信号をサウンドに変調して復調します。
  2. チャネルが信頼できないため、エラー訂正を適用してください。

変調および復調は周知のアプリケーションであり、情報を変調するためにseveral waysである。

2番のエラー訂正もよく知られており、いくつかの可能性があります。どちらが適用可能かは、エラーレートと、再送を要求できるようにデュプレックス動作をしているかどうかによって異なります。適切な品質があり、再送信を要求できる場合は、TCPが使用しているようなアプローチを検討する価値があります。

そうしないと、CDROMで使用されているエラー検出アルゴリズムやエラー訂正アルゴリズムに落とさなければなりません。行われ、変調/復調なし再送可能性を持つコメント

編集は問題が狭くなります。タイミングの問題がある場合は、送信者と自動的に再同期して信号対雑音比を高める方法があるため、既存の(変調)変調方式を読むことをお勧めします。

コアの問題に至りました。エラー訂正を行うには、パリティビットを出力ストリームに追加してエラーを検出する必要があります。前方誤り訂正記事で始まる@Justinは、非常にシンプルだが強力なスキームがHamming(7,4)スキームであることを示唆しています。

+0

変復調は既に行われています。私は1000Hzの正弦波を生成し、特定の周波数と振幅を読み取る高速フーリエ変換を使用しています。それは双方向コミュニケーションではないので、私は再送信を要求したり、ackを送ることはできません。 –

関連する問題