Rozpoznawanie dźwięku

Po ostatnim wpisie o IMARE Reg zapytał o szczegóły techniczne rozpoznawania.

Postanowiłem więc odpowiedzieć w tym wpisie. Sprawa jest dość skomplikowana. Na początek trzeba zastanowić się nad tym co mamy i co chcemy osiągnąć. Otóż mamy sygnał:

No i już tutaj zaczyna być ciekawie ponieważ sygnał zapisany w postaci cyfrowej jest niekompletny. W celu zapisania cyfrowej informacji o dźwięku musimy przeprowadzić próbkowanie sygnału. Polega ono po prostu na pomiarze poziomu badanego sygnału w określonych odstępach czasu:

Jeżeli częstotliwość próbkowania wybierzemy zbyt dużą to pomiar będzie za rzadki i w przypadku gdzie sygnał będzie mocno zróżnicowany możemy po prostu pominąć jego istotne części:

Widzimy tutaj, że sygnał dyskretny nie odpowiada sygnałowi oryginalnemu. Z drugiej strony jeśli wybierzemy zbyt wysoką częstotliwość to będziemy mieli całe mnóstwo próbek i szybko skończy nam się dostępna pamięć.

Dodatkowo w grę wchodzi rozdzielczość pojedynczej próbki, czyli ilość poziomów kwantyzacji. Zmierzona wartość może być zapisana np. przy pomocy 1 bajta wówczas mamy 256 poziomów kwantyzacji. Zazwyczaj jednak operujemy plikami WAVE, w których próbki mają 2 lub 3 bajty. Zdarzają się także próbki 4-bajtowe. Prawdopodobne jest również istnienie większych rozdzielczości, ale nie jestem pewien czy będzie to robiło istotną różnicę…

W IMARE naszym celem było wykrycie nut (dźwięków) czających się w tych wszystkich próbkach i zapisanie ich w postaci nut na pięciolinii. Pierwsze próby polegały na wykorzystaniu transformacji Fouriera w celu wykrycia siedzących w samplach częstotliwości. Transformata liczona była dla małych przedziałów czasowych. Takie podejście było jednak niewystarczające ze względu na fakt gęstego upakowania dźwięków o niskiej częstotliwości w transformacie Fouriera. Nie pozwalało to odróżnić ich od siebie wystarczająco dobrze i w efekcie skłoniło nas do szukania alternatywy.

Kolega, który był głównym twórcą modułu rozpoznawania wynalazł w sieci informacje o transformacji Constant Q. Pozwala ona utrzymać stałą jakość transformaty dla każdej częstotliwości z danego przedziału. W wynikowym widmie częstotliwości następnie wyszukiwane są maksima. Wyznaczają one częstotliwości dominujące. Po przeliczeniu ciągu takich transformacji dla kolejnych kawałków pliku audio otrzymujemy różne ciągi częstotliwości.

Tutaj zaczyna się dopiero jazda bez trzymanki. Algorytm rozpoznawania jest odpowiedzialny za wyznaczenie dla każdego dźwięku jaki potencjalnie znaleźliśmy częstotliwości podstawowej. Następnie eliminuje wielokrotności tej częstotliwości, które przeszkadzają w dalszej pracy. Później podobne kawałki częstotliwości (z ciągu transformat ConstQ) łączone są w dłuższe fragmenty.

Po tym wszystko trafia do modułu transkrypcji, który na podstawie zadanych łańcuchów częstotliwości tworzy informacje o dźwięku oraz jego czasie początkowym i długości. Na koniec zostaje wybrana „najodpowiedniejsza” zdaniem algorytmu (bo zdarza się, że można wybrać lepiej) tonacja. Ostatecznie wszystko wędruje na panel wyświetlający nuty.

Opisałem tutaj sposób ogólny działania tego modułu. Gdyby chcieć opisać to nieco dokładniej i poprzeć kilkoma wzorami i rozważaniami powstałaby zacna książeczka 😉 Jeśli chodzi o przetwarzanie plików MP3 – program radzi sobie całkiem nieźle jednak wynik jest słabszy niż w przypadku plików WAVE. Głównie dlatego, że MP3 nie zawiera wszystkich częstotliwości i jest ogólnie kiepskie do takich zabaw 😛

Reg: Mam nadzieję, że zaspokoiłem chociaż troszkę Twoją ciekawość w tej kwestii? Jeśli ktoś ma jeszcze jakieś pytania to proszę śmiało je zadawać w komentarzach – jeśli wystarczy mi czasu to postaram się odpowiedzieć. Oczywiście o ile moje zorientowanie w temacie będzie wystarczające 😉

Reklamy

4 myśli nt. „Rozpoznawanie dźwięku

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s