2011-09-19 8 views
6

Aktualnie pracuję nad kodem do przesyłania wiadomości/plików/i innych danych za pomocą laserów z wykorzystaniem transformacji audio. Mój obecny kod wykorzystuje funkcję hexlify z modułu binascii w pythonie, aby przekonwertować dane na binarne, a następnie emituje ton dla 1 i inny ton dla 0. To teoretycznie działa, chociaż nie jest najszybszym sposobem kodowania/dekodowania , ale w testach okazuje się, że jest kilka błędów.Binarne przesunięcie fazowe w Pythonie

  1. dźwięki generowane są nie na miejscu, to znaczy: emitujące 150Hz może okazać się 145-155Hz w miejscu docelowym, to nie jest to ogromny problem, jak można po prostu ustawić granice na końcu odbierającym niższy lub wyższy.

  2. prawdziwym problemem jest to, że jeśli emitować dźwięk, a to jest grać, komputer w miejscu docelowym może ją przeczytać kilka razy, czy nie czytać w ogóle w oparciu o kurs próbek IT przychodzące audio. Próbowałem odtwarzać dźwięki z taką samą szybkością, jaką próbują, ale to bardzo niepewne.

W sumie miałem kilka udanych uruchomień przy użyciu krótkich wiadomości, ale jest to bardzo niewiarygodne i niedokładne ze względu na wyżej wymienione problemy.

Zajrzałem do tego dalej i rozwiązanie tego wygląda na to, że może obejmować BPSK lub Binary Phase Shift Keying, chociaż nie jestem pewien, jak to wdrożyć. Wszelkie sugestie lub próbki kodu będą mile widziane!

Mój kod do projektu można znaleźć here, ale główne pliki, nad którymi pracuję, są przeznaczone do binarnego dekodowania i kodowania, które są here i here. Nie jestem ekspertem od pythona, więc proszę wybacz mi, jeśli cokolwiek, co powiedziałem, jest złe, mój kod nie jest najlepszy, lub jeśli przeoczyłem coś podstawowego.

Dzięki! :-)

Odpowiedz

7

Zobacz Radio GNU!

http://gnuradio.org/redmine/projects/gnuradio/wiki

GNU Radio jest projekt do zrobienia, w oprogramowaniu, jak wiele możliwości transmisji sygnału radiowego lub odbioru. Ponieważ radio używa już kluczowania z przesunięciem fazowym, faceci GNU Radio już rozwiązali problem dla ciebie, a GNU Radio jest już projektem Pythona! A skomplikowane materiały DSP są napisane w C++ dla szybkości, ale są zapakowane do użycia w Pythonie.

Oto strona omawiająca projekt z wykorzystaniem mechanizmu różnicowania binarnego z przesunięciem fazowym (DBPSK)/różnicowego kwadraturowego kluczowania z przesunięciem fazowym (DQPSK) do przesyłania danych binarnych (w przykładzie obraz JPEG). Kod źródłowy Pythona jest dostępny do pobrania.

http://www.wu.ece.ufl.edu/projects/softwareRadio/

widzę, że projekt jest na licencji MIT. GNU Radio jest na licencji GPL3, co może być problemem dla Ciebie. Musisz dowiedzieć się, czy możesz używać GNU Radio bez potrzeby przekształcania projektu w pracę pochodną, ​​co zmusza do zmiany licencji. Powinno być możliwe utworzenie samodzielnego "demona wysyłającego" i samodzielnego "demona odbiorczego", z których oba mają kod źródłowy GPL3, a następnie połączenie się z nim za pomocą MIT przez gniazdo lub coś podobnego.

Nawiasem mówiąc, jeden z moich poszukiwań, że to bardzo jasne wyjaśnienie, w jaki sposób działa: BPSK

http://cnx.org/content/m10280/latest/

powodzenia!

+0

Dzięki, to bardzo pomoże! – sbrichards

4

w odpowiedzi na pierwszym numerze dotyczących częstotliwości:

Patrząc na dekoderze, widzę, że częstotliwość próbkowania wynosi 44100 a rozmiar fragmencie jest 2048. Jeśli czytam tego prawa, co oznacza, że ​​twój rozmiar FFT jest 2048. To spowodowałoby, że twój rozmiar FFT wynosił ~ 21 Hz. Czy próbowałeś wyzerować podkładkę FFT? Zero-padding FFT nie zmieni częstotliwości, ale da lepszą rozdzielczość. Widzę, że używasz interpolacji kwadratowej, aby poprawić oszacowanie częstotliwości. Nie użyłem tej techniki, więc nie jestem zaznajomiony z poprawą, którą z niej uzyskujesz. Być może równowaga między zerowym wypełnieniem a interpolacją kwadratową zapewni lepszą dokładność częstotliwości.

Ponadto, w zależności od sprzętu wykonującego transmisję i odbiór, błąd częstotliwości może wynikać z różnych zegarów sterujących A/D - Jeden lub oba zegary nie mają dokładnie 44100 Hz. Coś takiego może wpłynąć na częstotliwość widzianą na wyjściu FFT.

+0

+1 przy zerowym wypełnieniu. Jeszcze lepiej, jeśli możesz po prostu zwiększyć rozmiar porcji i przetworzyć więcej danych. http://zone.ni.com/devzone/cda/tut/p/id/4880 – steveha

+0

Dziękuję również! nie może jednak przyjąć dwóch odpowiedzi: / – sbrichards