Czy mogę używać FFT do rozpoznawania nut na pianinie?

13

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ść:

  1. Nagraj moją próbkę grania nuty
  2. Konwertuj sygnał do dziedziny częstotliwości za pomocą szybkiej transformacji Fouriera
  3. Znajdź częstotliwość, która jest najbardziej obecna (w zasadzie argmax danych w dziedzinie częstotliwości)
  4. 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?

michaelsnowden
źródło
Byłoby miło, gdybyś mógł być bardziej szczegółowy w tytule. Próbowałem zawrzeć trochę informacji na temat rozpoznawania wysokości fortepianu, ale mój (nie-rodzimy) angielski najwyraźniej mnie dzisiaj zawodzi.
rura
1
@pipe ok, zmieniłem to
michaelsnowden
1
Twoja „próbka” grania nuty powinna już być falą amplitudy i czasu. Zasadniczo punkt 2 jest zbędny. W przypadku stosunkowo prostej implementacji powyższe kroki powinny być w porządku.
user2943160,
@ user2943160 Dodałem go, aby był jawny. Dźwięk może być przechowywany w wielu formatach i zwykle potrzeba trochę zniekształceń, aby z czasem uzyskać dobrą amplitudę.
michaelsnowden
@michaelsnowden: Używany jest określenie "amplituda" nieprawidłowo, amplitudę funkcji sinusoidalnej jest . Jest to maksimum sygnału (napięcie, przemieszczenie, ...) i jest stałe (lub powoli zmienia się w zależności od częstotliwości). Masz na myśli tylko sygnał . W przeciwnym razie uważam, że „amplituda w czasie” oznacza obwiednię sygnału, ale o ile rozumiem, że nie. A y ( t )y(t)=Asin(ωt)Ay(t)
Curd

Odpowiedzi:

23

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.

JRE
źródło
Jeśli zaczniemy od założenia, że ​​próbki pochodzą z konkretnego instrumentu, problem może być nieco łatwiejszy do rozwiązania, prawda?
mkeith,
To wygląda naprawdę dobrze. Kolejne pytanie brzmi: czy można użyć algorytmu Goertzela do wykrycia dwóch dźwięków granych jednocześnie?
michaelsnowden
Może służyć do wykrywania jednoczesnych dźwięków. Czy to wystarczy do wykrycia jednoczesnych notatek, to inne pytanie, nad którym wciąż pracuję. Mam wykrywacz dźwięków gitarowych oparty na Goertzel, z którym od lat małpuję.
JRE
2
@mkeith: Sortuj. Możesz przetestować nuty i sprawdzić, czy wykrycie dominującego tonu jest odpowiednie dla konkretnego instrumentu (a może tylko interesujące nuty). O ile mi wiadomo, nie ma ogólnego rozwiązania dla wykrywania wszystkich nut ze wszystkich instrumentów.
JRE
3

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.

steve_stackex
źródło
1

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%.

alephzero
źródło
0

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”.

  1. Opóźnienie - jeśli zamierzasz robić rzeczy w czasie rzeczywistym, może to stanowić problem.

  2. 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.

  3. 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.

AbstractDissonance
źródło