Chcę stworzyć narzędzie, które rozpoznaje kilka nut (wiem, że to na nowo wymyśla koło). Grałbym więc na środkowym C, D i E na pianinie i powinno być w stanie sklasyfikować te nuty. Oto, jak myślę, że powinienem do tego podejść:
- Nagraj moją próbkę grania nuty
- Konwertuj sygnał do dziedziny częstotliwości za pomocą szybkiej transformacji Fouriera
- Znajdź częstotliwość, która jest najbardziej obecna (w zasadzie argmax danych w dziedzinie częstotliwości)
- Załóżmy, że częstotliwość pochodzi z granej nuty i użyj jej do sklasyfikowania nuty
Jeszcze tego nie próbowałem, ponieważ nie chcę zaczynać złą ścieżką. Czy teoretycznie to zadziała?
signal-processing
fourier
michaelsnowden
źródło
źródło
Odpowiedzi:
Pomysł jest dobry, ale przekonasz się, że nie jest on tak prosty w praktyce.
Skok nie jest po prostu dominującym tonem, więc jest problem numer 1.
Pojemniki częstotliwości FFT nie mogą jednocześnie uderzać we wszystkie (lub nawet wielokrotne) tony skali muzycznej.
Sugeruję grę z programem audio (na przykład Audacity), który zawiera analizator FFT i generator brzmień, aby poczuć, co może (i nie może) zrobić, zanim spróbujesz wdrożyć określone zadanie za pomocą FFT.
Jeśli potrzebujesz wykryć tylko kilka konkretnych dźwięków, algorytm Goertzela może okazać się łatwiejszy i szybszy.
Wykrywanie podziałki jest skomplikowane i nadal trwają badania w tej dziedzinie. Wykrywanie tonów jest dość proste, ale może nie dać ci tego, czego chcesz.
źródło
Powiedziałbym, że zastosowanie multimodalnego okna obserwacji sygnału byłoby lepsze. Coś w stylu falkowej dekompozycji twojego sygnału audio, która pozwoli ci zidentyfikować wiele tonów wewnątrz nuty. Tak, właściwie Wavelets, powiedziałbym, że jest to właściwa droga.
Jest to bardzo ogólny podział falek, ale pomyśl o nich jak o oknie wielorozdzielczym, które przechodzi nad twoim sygnałem jak STFT. Dzięki temu możesz zidentyfikować różne sinusoidy, które występują w różnych lokalizacjach czasowych w obrębie twojego sygnału. jest to również ważne, ponieważ nuta, którą grasz, nie jest sygnałem stacjonarnym, jest odtwarzana, a następnie zanika. Nie jestem muzykiem, jednak uważam, że dominacja brzmienia zmienia się w trakcie zaniku nuty.
oczywiście po rozkładzie falki konieczne będzie wdrożenie algorytmów identyfikujących nuty i dźwięki peryferyjne.
Myślę, że falki naprawdę rozwiązują problemy, o których rozmawiali ludzie, jeśli chodzi o identyfikację wysokości dźwięku.
jeśli chcesz dowiedzieć się, jak działają falki, jest to wspaniały oficjalny dokument wydany przez HP na ten temat :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf i Wprowadzenie do falek
do wdrożenia MATLAB ma narzędzie falkowe i jestem pewien, że istnieje mnóstwo innych pakietów dostępnych dla platform takich jak R itp.
źródło
Myślę, że myślisz o dźwiękach granych w środku zakresu fortepianu (powiedzmy między 200 a 500 Hz), ale nawet w tym zakresie jedna nuta będzie miała wiele tonów, które nie są dokładnymi wielokrotnościami częstotliwości podstawowej, a także znaczna ilość szumów szerokopasmowych na początku każdej nuty, a być może także na końcu.
W przypadku głośnych dźwięków na dolnym końcu zakresu dźwięków okaże się, że bardzo niewiele energii dźwiękowej (mniej niż 1%) faktycznie znajduje się w podstawowej wysokości dźwięku.
Innym problemem jest to, że naiwna interpretacja FFT zakłada, że sygnał, który próbujesz wykryć, ma stałą amplitudę. Nie dotyczy to nut fortepianowych, w których amplituda faktycznie następuje po kilku nałożonych na siebie rozkładach wykładniczych - początkowa część zaniku ma stosunkowo krótką stałą czasową, ale późniejsza część ma dłuższą stałą czasową.
Być może lepiej badasz metody transformacji Fouriera w krótkim czasie, na przykład transformata Gabora lub metody oparte na falkach.
Zauważ, że ponieważ podstawowa wysokość kolejnych dźwięków wzrasta o około 6% dla każdej nuty, niekoniecznie potrzebujesz bardzo wysokiej dokładności w identyfikowaniu częstotliwości harmonicznych w dźwięku. Prawidłowe rozpoznanie nut nie jest tym samym problemem, co ustalenie, czy nuty są dokładnie dopasowane do skali muzycznej, gdzie częstotliwości mogą wymagać pomiaru z dokładnością większą niż 0,1%.
źródło
Tak, właśnie o to chodzi w FFT! Aby podać Ci spektrum częstotliwości karmionych danych. Jak wspomniałeś, trudną częścią są szczegóły implementacji.
W zależności od tego, co chcesz zrobić, dokładnie zmienia odpowiedź.
Jeśli chcesz po prostu przeanalizować własną muzykę, istnieje już oprogramowanie, które to umożliwia. Możesz spojrzeć na korektory, które pokazują odpowiedź (w zasadzie FFT), lub uzyskać „muzyczny korektor”, który pokazuje również wysokości. Możesz uzyskać dźwięk do VST midi, które konwertują to, co grasz na właściwe nuty midi. Jeśli twoja klawiatura to midi, po prostu pomiń VST i bezpośrednio nagraj midi.
Jeśli chcesz nauczyć się FFT i tego, jak odnosi się on do muzyki, lepiej zdobyć coś takiego jak Matlab, w którym możesz obliczyć FFT dowolnych danych. Ma możliwość nagrywania, a także odtwarzania wraz z czytaniem plików wav i tym podobnych. Będą one naprawdę łatwe w użyciu. Jeśli znasz składnię, możesz wykreślić wykresy audio i dość szybko przeprowadzić wszelkiego rodzaju analizy.
Jeśli chcesz zbudować takie urządzenie, jest to dość skomplikowane. Do wykonania obliczeń będziesz potrzebować uC / dsp / fpga / etc. Najpopularniejsze urządzenia mają już kod FFT, więc nie musisz go kodować samodzielnie (również skomplikowane).
Musisz zbudować zespół obwodów i tak dalej. Nie jest to trudne, ale w zależności od twojego doświadczenia / wiedzy może to zająć sporo czasu i ma stromą krzywą uczenia się. Zależy to również od jakości produktu końcowego.
Matematycznie idealna nuta składa się z geometrycznej serii „fundamentalnej”.
Załóżmy, że F0 jest częstotliwością podstawową, wówczas większość nut zostanie przybliżona przez F (t) + F0 * suma (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 +. ...
A_k to tylko siła tych wyższych częstotliwości F_k, a F_k to tylko pewna wielokrotność F0. Jeśli a_k = 0 dla wszystkich k, mamy czystą sinusoidę. Skok tego jest łatwy do wykrycia. Wystarczy znaleźć maksimum FFT, a ta częstotliwość jest podstawą tonu = nuty.
Kiedy bierzesz FFT, dostajesz dane i po prostu wykonujesz matematykę. Zasadniczo jest to rachunek różniczkowy.
Wszystko to jest stosunkowo łatwe.
Niektóre problemy, z którymi będziesz musiał sobie poradzić. Pamiętaj, że nie wszystkie z nich są „rozwiązane”.
Opóźnienie - jeśli zamierzasz robić rzeczy w czasie rzeczywistym, może to stanowić problem.
Wiele nut - Trudno jest określić grupę nut z powodu wszystkich dodatkowych harmonicznych. Jeśli odtwarzanie A = 440 Hz i A '= 880 Hz, większość harmonicznych będzie się nakładać. Możesz łatwo uzyskać A = 440 Hz, ale uzyskanie A '= 880 Hz jest trudniejsze. Kiedy myślisz o akordach, szybkich biegach itp., Może być bardzo trudno dokładnie uzyskać wszystkie informacje (notatki). Podczas gdy wszystko jest ogólnie matematycznie możliwe, same dane zawierają błędy i aberracje, aw niektórych przypadkach równania są niedokładnie zdefiniowane.
Hałas - Hałas w sygnale może dawać fałszywe wyniki. Jeśli pojawi się dźwięk muzyczny, może to popsuć wyniki. Wymagane byłyby wtedy lepsze algorytmy = czas + pieniądze + wiedza.
źródło