Sound processing I

Pierwszy post z serii o przetwarzaniu i modulowaniu dźwięku.

Niedługo pojawi się wersja wideo.

Zapraszam!


Jak dźwięk odbiera komputer?

Źródło ilustracji: https://processing.org/tutorials/sound/

Zmiana ciśnienia zamieniana jest na prąd zmienny będący odpowiednikiem fali akustycznej, potem trafia on do przetwornika analogowo-cyfrowego (ADC) który generuje z niego sygnał cyfrowy (czyli to etap w którym fala dźwiękowa odwzorowana jest już w postaci zer i jedynek), dalej trafia to do pamięci komputera i… Proces odwrotny.

Te fakty przydadzą się nam dalej, być może już się domyśliłeś, że skoro konkretna montonna częstotliwość wygeneruje charakterystyczny tylko dla niej ciąg zer i jedynek, to można przesłać w ten sposób zakodowaną informację, dla przykładu:

1000 Hz – litera A

2000 Hz – litera B.

Załóżmy też, że dla niezawodności, częstotliwość będzie modulowana przez dokładnie jedną sekundę, takie też będą przerwy pomiędzy emisjami. Wtedy, aby przesłać wyraz ABBA, przez sekundę generowane byłoby 1kHz, potem sekundowa przerwa, 2kHz, przerwa, 2kHz, przerwa 1kHz. Na ten moment by to zadziałało, chociaż celowo pominąłem pewne aspekty o których wspomnę później.

Na tej stronie możesz wygenerować monotonną falę dźwiękową o podanej częstotliwości i ją usłyszeć.

Być może przypomniało ci to kodowanie Morse’a, bardzo dobra analogia.

Skoro cała magia już odczarowana, przesiadamy się do następnego wagonu.

Jak działa modem.

W bardziej zaawansowanej formie, to co przeczytałeś w poprzednim paragrafie było jeszcze jakiś czas temu implementowane w modemach telefonicznych aby przesyłać internet.

Szum i zbieranina dziwnych dźwięków to słyszalne dla człowieka odwzorowanie danych które są w tym momencie przesyłane, zupełnie jak w przykładzie powyżej.

Gdyby interesowała cię dokładna definicja, to za Wikipedią:

Modem (od modulator-demodulator) – urządzenie elektroniczne, które moduluje sygnał w celu zakodowania informacji cyfrowych, tak by mogły być przesyłane w wybranym medium transmisyjnym, a także demoduluje tak zakodowany sygnał w celu dekodowania odbieranych danych.

Najbardziej znanym przykładem jest modem akustyczny zamieniający cyfrowe dane z komputera osobistego na modulowany sygnał elektryczny w zakresie częstotliwości akustycznej kanału telefonicznego. Te sygnały mogą być przekazywane przez linie telefoniczne i demodulowane przez inny modem po stronie odbiornika, aby odzyskać dane cyfrowe.

Jak przesyłana jest informacja.

W sieci komputerowej zera i jedynki kodowane są przez niskie i wysokie napięcia. W dźwiękowym odwzorowaniu które napiszemy, będą to możliwie wysokie częstotliwości. Dlaczego?

Zauważ jak duże zanieczyszczenie dźwięków może być w tle. Rozmowy ludzi, szuranie po podłodze, przejazd tramwaju/samochodu obok będzie zarejestrowany na komputerze, jeśli w tym czasie będzie odbierał transmisję, może mu to sporo namieszać (będzie miał problemy z interpretacją wiadomości). Teraz pytanie główne, ile z naturalnych źródeł dźwięku generuje wysokie częstotliwości, powiedzmy powyżej 2kHz? (sprawdź koniecznie jak brzmią 2kHz stroną z paragrafu I)

No właśnie. Dlatego korzystamy z takiej częstotliwości, by możliwie jak najmniej szumu mogło się wkraść, ale nadal byłaby słyszalna dla zwykłego mikrofonu i możliwa do wygenerowania zwykłymi głośnikami.

O czym zapomnieliśmy?

W sieci komputerowej informacja kodowana jest za pomocą standardu Ethernet. Jest to umowa (protokół komunikacji) pomiędzy komputerami, w jaki sposób dane będą podróżowały po sieci. Z czego więc składa się taki umowny pakiet danych poza właściwą informacją którą chcemy przesłać?

Źródło ilustracji: https://pl.wikipedia.org/wiki/Ethernet#Ramka_sieci_Ethernet
Ramka sieci Ethernet wersja 1
  • Preambuła – składająca się z 7 bajtów złożonych z naprzemiennych jedynek i zer:
10101010101010101010101010101010101010101010101010101010

co w zapisie szesnastkowym daje:

AAAAAAAAAAAAAA

Taki ciąg liczb pozwala na szybką synchronizację odbiorników.

  • SFD – (ang. start frame delimiter), czyli znacznik początkowy ramki w postaci sekwencji 8 bitów (1 bajt):
10101011

w zapisie szesnastkowym

AB
  • typ (2 bajty) – jeżeli wartość jest równa lub większa od 1536 (w zapisie szesnastkowym 0x0600), to określa typ protokołu który jest używany, jeżeli mniejsza to oznacza długość danych w ramce
  • dane (46 – 1500 bajtów) – jeżeli dane mniejsze niż 46 bajtów, to uzupełniane są zerami
  • suma kontrolna (4 bajty) CRC[1]

W sieci może być wiele komputerów, dorzucamy więc kto przesyła i do kogo. Do tego suma kontrolna, która jest znacznikiem dla komputera, wskazującym, czy podczas przesyłania coś poszło nie tak i otrzymał zepsutą porcję danych (np. z powodu zakłóceń).

W pierwszej wersji naszego pomysłu pominiemy te problemy, ponieważ przesyłanie po mikrofonie i głośnikach danych jednocześnie przez dwa albo więcej komputerów byłoby… Powiedzmy, że kłopotliwe, biorąc pod uwagę ile szumów by wygenerowały i ograniczoną liczbę wystarczająco różniących się od siebie częstotliwości.

Będzie więc jeden nadawca i jeden odbiorca.

 Pomysł i pierwszy szkic tzw. proof of concept naszego programu.

Samo wykrywanie częstotliwości dźwięku jest na tyle złożonym problemem, że poświęcę temu osobny post, tymczasem skorzystam z gotowego rozwiązania udostępnionego na Githubie.

Wynik działania programu zamieściłem tutaj:

Jak widać program bez problemu obliczał wysokie częstotliwości z bardzo dużą dokładnością, chociaż przy ~400Hz i > 4kHz zaczynał mieć problemy.

Kod programu z powyższego filmu umieściłem tutaj.

Co dalej?

W następnym poście z tej serii napiszę i nagram na Youtubie proces pisania pierwszej wersji backendu do naszej gry na podstawie TarsosDSP i podejmę próbę przesłania porcji danych pomiędzy komputerami, do tego trochę teorii na temat wykrywania częstotlwiości.

W dalszej przyszłości – piszę grę którą obsłuży nasz dźwiękowy system wymiany informacji.

Działające projekty innych osób.

https://www.youtube.com/watch?v=gNddvmLRhvc

https://www.youtube.com/watch?v=ZgyWEFu8_HQ

https://github.com/quiet/quiet-lwip

 Odnośniki:

https://github.com/dbeef/soundcoding

https://processing.org/tutorials/sound/

https://pl.wikipedia.org/wiki/Ethernet#Ramka_sieci_Ethernet

dsp2017-1.png

Leave a comment