Aplikacja mobilna do detekcji nut

Tematem mojej pracy inżynierskiej była aplikacja mobilna do detekcji wysokości nut. Wybrałem techniki przetwarzania sygnałów, które następnie zaimplementowałem i użyłem w zrealizowanej aplikacji mobilnej.

Aplikacja mobilna ma charakter aplikacji pomagającej w nauce gry na pianinie. Użytkownik ma za zadanie grać na instrumencie, próbując zagrać melodię wyświetlaną w aplikacji. Za pomocą mikrofonu nagrywana jest ścieżka dźwiękowa, która jest następnie przetwarzana. Aplikacja rozpoznaje wysokość dźwięku. Rodzaj zagranej nuty jest następnie porównywany z melodią.

Zrzuty ekranu aplikacji mobilnej

Transformata Fouriera

Wybrane przeze mnie algorytmy przetwarzania sygnałów umożliwiają takie przekształcenie ścieżki dźwiękowej, aby kolejne procedury mogły rozpoznać wysokości zagranych dźwięków z jak największym prawdopodobieństwem poprawnej odpowiedzi.

Najważniejszym algorytmem wykorzystywanym przez aplikację jest algorytm obliczania transformaty Fouriera. Teoria stojąca za zasadami działania tej matematycznej operacji bywa trudna do zrozumienia i wymaga dokładniejszego poznania wielu zagadnień. Programistyczna implementacja opiera się na dyskretnej transformacie Fouriera, która ma praktyczne zastosowania i jest prostsza do zrozumienia.

W skrócie: algorytm transformaty Fouriera przekształca dane z dziedziny czasu (np. nagrywane przez mikrofon) na dziedzinę częstotliwości. Oznacza to, że zamiast danych przedstawiających amplitudę w danym momencie czasu, dane przedstawiają natężenie poszczególnych częstotliwości składowych.

Po lewej stronie fragment ścieżki dźwiękowej przedstawiony w domenie czasu a po prawej w domenie częstotliwości.

Analiza częstotliwości

Posiadając informacje o częstotliwościach składowych można już w prosty sposób wywnioskować wysokość zagranej nuty. Nuty o wyższej wysokości są złożone z wyższych częstotliwości niż nuty o niższej wysokości. Porównując dominujące częstotliwości aplikacja mobilna określa jaka nuta została zagrana.

Aby aplikacja dawała lepsze wyniki przed zastosowaniem transformacji Fouriera ścieżka audio jest normalizowana, czyli poziom głośności jest zwiększany. Oprócz normalizacji używane są filtry częstotliwości, usuwające zbyt niskie i zbyt wysokie częstotliwości, które mogą utrudniać analizę wysokości dźwięku.

Technologie

Projekt powstał przy użyciu następujących języków programowania, narzędzi i technologii: Java, Android SDK, Android Studio, repozytorium SVN, LaTex.

Ograniczenia i wyzwania

Zastosowane algorytmy mają problem z poprawnym rozpoznaniem dźwięku, jeżeli oprócz dźwięku nagrane zostały także szumy albo niechciane dźwięki. Interpretacja audio z takimi zakłóceniami bywa skomplikowana i wymaga bardziej zaawansowanych technik przetwarzania sygnałów, a może nawet algorytmów sztucznej inteligencji.

Aplikacja zrealizowana przeze mnie radzi sobie całkiem nieźle z rozpoznaniem wysokości dźwięków gry na pianinie. Niedoskonałości i ograniczenia aplikacji dają pole do dalszego rozwoju projektu.

Kod źródłowy

Kod źródłowy napisanej przeze mnie biblioteki udostępniłem na repozytorium git. Jest to “serce” mojej aplikacji mobilnej, służące do przetwarzania próbek dźwiękowych i rozpoznawaniu na ich podstawie wysokości dźwięku.

github.com/ChrisAraneo/note-recognition-java

Istnieją wydajniejsze biblioteki, rozwijane przez wielu programistów, które mają podobne funkcjonalności. Jednak zapoznanie się z algorytmami DSP i samodzielna implementacja była jedną z części projektu. Podczas tej praktyki wiele nauczyłem się na temat optymalizacji algorytmów, przetwarzania dźwięku, teorii muzyki.