2011-01-05 12 views
7

Czytam strumień stratny i potrzebuję sposobu na odzyskanie jak największej ilości danych. Na miejscu 1 może być 1 zamiast 0 i 0, ale dokładność wynosi prawdopodobnie ponad 80%.Algorytm nadmiarowości do czytania hałaśliwego strumienia bitów

Dodatek byłby, gdyby algorytm mógł zrekompensować brakujące/zbyt wiele bitów.

Źródło z którego czytam jest analogiczne z szumem (mikrofon przez FFT), a czas odczytu może się różnić w zależności od szybkości komputera.

Pamiętam, że czytając o algorytmach używanych w CD-ROMach robi się to w 3? warstwy, więc zgaduję, że używanie kilku warstw to dobra opcja. Nie pamiętam jednak szczegółów, więc jeśli ktokolwiek może podzielić się pomysłami, które byłyby świetne! :)

Edit: Dodane dane przykładowe

 
Best case data: 
in: 0000010101000010110100101101100111000000100100101101100111000000100100001100000010000101110101001101100111000101110000001001111011001100110000001001100111011110110101011100111011000100110000001000010111 
out: 0010101000010110100101101100111000000100100101101100111000000100100001100000010000101110101001101100111000101110000001001111011001100110000001001100111011110110101011100111011000100110000001000010111011 

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

Edit2: jestem w stanie Controll dane są wysyłane. Obecnie próbuje wdrożyć proste sprawdzanie XOR (choć to nie wystarczy).

+0

Czy możesz kontrolować, co jest napisane w strumieniu? Jeśli nie, Twój przykład CD nie ma zastosowania, ponieważ wymaga zapisania danych razem z kodami korekcji błędów. – CodesInChaos

+5

Nie rozumiem tego pytania. Czy próbujesz stworzyć jakiś protokół komunikacyjny na nierzetelnym kanale? Lub próbując znaleźć jakiś magiczny algorytm, który jest w stanie, z cienkiego powietrza, odgadnąć, co jest nie tak czy nie? – Euphoric

+0

Próbuję komunikować się przez dźwięk (głośnik + mikrofon). Używam określonej częstotliwości do wysyłania bitów, więc aplikacja szuka tej konkretnej częstotliwości. –

Odpowiedz

2

Musisz użyć forward error correction. Kontrola parzystości XOR wykryje tylko, gdy wystąpi błąd. Prostym algorytmem korekcji błędów byłoby wysłanie każdego fragmentu danych wielokrotnie (co najmniej 3) i podjęcie decyzji większości.

Wybór algorytmu zależy od kilku czynników:

  • wykorzystanie kanału (jeśli masz dużo wolnego czasu, nie trzeba wydajnego kodowania)
  • rodzaje błędów: Bity są złe losowo rozstawione czy też występują zwykle w rzędzie
  • tworzenie czas: Kod złożoność jest ograniczona, jeśli transmisja danych musi być szybki
+0

Zgadzam się, Xor nie zajdzie daleko (i jest trochę droższy). –

2

Istnieje wiele możliwości, patrz: http://en.wikipedia.org/wiki/Error_detection_and_correction

To może pomóc zmienione bity, ale może być nieodpowiedni do sprawdzenia, gdy masz wszystkie bity.

W końcu prawdopodobnie zajmie to więcej niż kilka linii prostego kodu.

+0

Nice .. Wygląda na to, że chcę http://en.wikipedia.org/wiki/Cross-interleaved_Reed-Solomon_coding .. Ale nie mogę znaleźć biblioteki .Net dla Reed-Solomon. Wygląda trochę skomplikowanie, aby się zrealizować. –

3

Jeśli rozumiem zostanie poprawnie, masz dwie potrzeby:

  1. Moduluje sygnał na dźwięk, a następnie demoduluje go.
  2. Zastosuj korektę błędów, ponieważ kanał jest niewiarygodny.

Modulacja i demodulacja to znana aplikacja, która służy do modulowania informacji za pomocą several ways.

Po drugie, korekcja błędów jest również znana i ma kilka możliwości. Który z nich dotyczy, zależy od poziomu błędu i od tego, czy masz funkcję dupleksu, aby móc poprosić o ponowne wysłanie. Jeśli masz przyzwoitą jakość i możesz poprosić o ponowne wysłanie, warto skorzystać z takiego podejścia, jak ten, którego używa TCP.

W przeciwnym razie trzeba będzie przejść do wykrywania błędów i algorytmów korekcji błędów, takich jak te używane na płytach CD-ROM.

Edit po komentarzu

mającego modulacji/demodulacji zrobić i nie ma możliwości Wyślij ponownie zawęża problem. Jeśli masz problemy z synchronizacją, nadal zalecałbym zapoznanie się z istniejącymi metodami modulacji (de) modulacji, ponieważ istnieją sposoby automatycznego resynchronizacji z nadajnikiem i zwiększenia stosunku sygnału do szumu.

Do sedna problemu; korekcja błędów będzie musiała dodać bity parzystości do strumienia wyjściowego, aby móc wykryć błędy. Zaczynając od artykułu o korekcji błędów na sekundę @Justin sugeruje, że schemat, który wygląda dość prosto, ale nadal jest potężny, to schemat Hamming(7,4).

+0

Modulacja i demodulacja są już gotowe. Generuję falę sinusoidalną o częstotliwości 1000 Hz i wykorzystuję szybką transformatę Fouriera do odczytu określonej częstotliwości i amplitudy. Nie jest to komunikacja dwukierunkowa, więc nie mogę prosić o ponowne wysłanie lub wysłać potwierdzenia. –