2011-09-30 14 views
5

Obecnie pracuję nad projektem, który do tej pory był stosunkowo łatwy. Podstawowym projektem jest przesyłanie danych/wiadomości za pomocą laserów za pomocą transformacji audio. W skrócie proces ten jest obecnie jak toPython Audio Transfer przez lasery

  1. użytkownik wprowadzi wiadomość
  2. Wiadomość zostanie przekształcony binarny
  3. Na każdy 1 i 0 w komunikacie binarnym, odgrywa odpowiedni sygnał do sygnału, który to jest, w moim przypadku 250 Hz dla 1 i 450 Hz dla 0.
  4. Sygnał wyjściowy jest przesyłany kablem stereo do transformatora audio przymocowanego do lasera. Panel słoneczny działa jak mikrofon i rejestruje przychodzące "dźwięk" jako plik
  5. Po odtworzeniu pliku odczytuje on sygnały i próbuje dopasować 250 i 450 Hz do 1 lub 0 (na czym polega mój problem).

Aż do faktycznego przetworzenia dźwięku jest w porządku, mój obecny numer jest następujący.

Odtwarzam tony po raz x, na końcu odbiorczym jest nagrywany dla czasu y, czas y jest wycinany próbkowany wielokrotnie, a następnie analizowana próbka według próbki, która następnie rejestruje każdą częstotliwość. Jest to nieskuteczne i niedokładne. Miałem wiele problemów niezależnie od czasu, w którym odtwarzam dźwięki, ponieważ często słyszę dźwięk dwukrotnie lub zupełnie go nie słyszę, co całkowicie odrzuca całe wiadomości.
Próbowałem dopasować szybkość, z jaką pobiera próbki z czasem odtwarzania każdego dźwięku, ale jeśli nie jest odpowiednio wyjustowany, to nie działa. Miałem tylko kilka udanych testów dla wiadomości takich jak "test" i "cześć". Zajrzałem już do bpsk i fsk, ale czuję się tak, jakbym już robił coś takiego, ale mam zły odbiór, żeby to wszystko rozszyfrować.

To wszystko jest napisane w Pythonie i byłbym bardzo wdzięczny za wszelkie wskazówki, sugestie lub możliwe implementacje, które możesz dostarczyć. Również do emisji dźwięku używam pyaudiere i do nagrywania używam pyaudio.

Dzięki!

-Steve

+3

Dobre pytanie - jest bardziej powiązane z DSP niż związane z programowaniem, więc możesz spróbować http://DSP.stackexchange.com –

+0

Jak długo jest każdy ton i jakiej metody obecnie używasz do wykrywania? –

+0

możliwy duplikat [Binary Phase Shift Keying w Pythonie] (http://stackoverflow.com/questions/7466715/binary-phase-shift-keying-in-python) –

Odpowiedz

2

To brzmi jak problem ze sprzętem. Jestem pewien, że jest to zadanie dla FSK. Większość współczesnych systemów typu FSK używa PLL (Phase-Locking Loop chips) do faktycznego wykrywania. Mogą być również stosowane układy częstotliwości do napięcia lub częstotliwości do prądu.

Widziałem praktyczne tory w dziesiątkach książek hobbystycznych oraz w arkuszach danych i na stronach internetowych.Oto kilka z nich:

Circuit for demodulating an FSK signal

PLL Tutorial

Mam nadzieję, że to nie jest po prostu kolejną podróż w dół króliczej nory dla siebie - powodzenia!

0

izolujący, mierząc reprezentacji sygnału, takich jak Manchester code. W ten sposób czas musi być "wystarczająco dobry", a przede wszystkim martwić się o wykrycie zmiany, w tym przypadku częstotliwości. W powiązanym artykule wysokie i niskie poziomy odnoszą się do napięcia, ale nie ma powodu, aby musieli. Możesz równie łatwo korzystać z wysokiej i niskiej częstotliwości lub włączać/wyłączać pojedynczy laser.

+0

Manchester to dobra sugestia, ale wciąż pozostaje kwestia faktycznego wykrycia tonu. –

+0

Możesz rzucić sieć neuronową na problem, podając mu przesuwające się okno próbek i pytając przy każdym cyklu zegara, jaka jest natura sygnału w tym momencie. Będziesz musiał podejmować te decyzje ręcznie na danych treningowych. – wberry

1

Czy wykonałeś kontrolę poprawności, słuchając plików dźwiękowych (zarówno nadawanych, jak i odbieranych) lub oglądając przebiegi za pomocą edytora audio, aby sprawdzić, czy z grubsza brzmią lub wyglądają tak samo? W ten sposób możesz zawęzić problem do błędów wywołanych kanałem w porównaniu do analizy oprogramowania.

Twoje oprogramowanie do dekodowania/demodulacji będzie wymagać metody synchronizacji, która może określić i śledzić czasy, w których sygnał audio zmienia się z jednej częstotliwości modulacji na inną, następnie musisz osobno przetestować tę metodę synchronizacji na błędy przesunięcia.

1

Zajmę się końcem odbiorczym za pomocą dwóch filtrów FIR, po jednym dla każdej częstotliwości, którą próbujesz wykryć. Współczynniki filtrów są po prostu kopią poszukiwanego sygnału (tj. 250 Hz w jednym przypadku i 450 Hz w drugim). Będziesz musiał spojrzeć na wyjście panelu słonecznego, aby zdecydować, czy jest to fala prostokątna, sinusoidalna czy coś pośredniego. Długość filtru odpowiada czasowi trwania tonu (tj. "X" w pytaniu). Próbki są podawane do obu filtrów równolegle.

Dane wyjściowe każdego filtra należy poprawić (tj. Przyjąć wartość bezwzględną) i wygładzić. Wygładzanie można wykonać za pomocą prostej średniej kroczącej w okresie około pół x (można poeksperymentować, aby znaleźć najlepszą wartość). Następnie, jeśli porównasz wygładzone wartości (tj. Jest> b lub b> a), powinieneś otrzymać strumień 0 i 1.

Rzeczy, o których należy pamiętać: Zakłada się, że kanał zachowuje się tak samo dla obu częstotliwości (tzn. Uzyskuje się podobny snr i tłumienie). Być może trzeba będzie nieco poprawić częstotliwość, ponieważ 450 Hz jest dość zbliżone do 500 Hz, co jest harmonią 250 Hz.