Wskazówki dotyczące poprawy wykrywania skoku

21

Pracuję nad prostą aplikacją internetową, która pozwala użytkownikowi nastroić gitarę. Jestem prawdziwym początkującym w przetwarzaniu sygnałów, więc nie oceniaj zbyt mocno, jeśli moje pytanie jest niewłaściwe.

Tak więc udało mi się uzyskać częstotliwość podstawową za pomocą algorytmu FFT i w tym momencie aplikacja jest w jakiś sposób funkcjonalna. Jest jednak miejsce na ulepszenia, teraz wysyłam nieprzetworzone pcm do algorytmu FFT, ale myślałem, że może istnieją pewne algorytmy / filtry przed / po, które mogą poprawić wykrywanie. Czy możesz coś zasugerować?

Moim głównym problemem jest to, że gdy wykryje określoną częstotliwość, pokazuje tę częstotliwość przez 1-2 sekundy, a następnie przeskakuje na inne częstotliwości losowe i wraca ponownie itd., Nawet jeśli dźwięk jest ciągły.

Interesuje mnie również każdy inny rodzaj optymalizacji, jeśli ktoś ma takie doświadczenie.

Valentin Radu
źródło

Odpowiedzi:

20

Zgaduję, że inne częstotliwości, które dostaje, to harmoniczne fundamentalne? Czy grasz w 100 Hz, a zamiast tego wybierasz 200 Hz lub 300 Hz? Po pierwsze, powinieneś ograniczyć przestrzeń wyszukiwania do częstotliwości, na których może znajdować się gitara. Znajdź najwyższy poziom, którego prawdopodobnie potrzebujesz, i ogranicz się do tego.

Autokorelacja będzie działać lepiej niż FFT przy znajdowaniu podstawy, jeśli podstawa ma mniejszą amplitudę niż harmoniczne (lub w ogóle jej brakuje, ale to nie jest problem z gitarą):

wprowadź opis zdjęcia tutaj

Możesz także spróbować wyważyć niższe częstotliwości, aby podkreślić podstawowe i zminimalizować harmoniczne, lub użyć algorytmu wyboru pików, a następnie wybrać najniższą częstotliwość.

Ponadto, powinieneś wyeksponować swój sygnał przed zastosowaniem FFT. Po prostu pomnóż go przez okna , która zwęża początek i koniec kształtu fali, aby widmo częstotliwości było czystsze. Wtedy dostajesz wysokie wąskie skoki dla komponentów częstotliwości zamiast szerokich.

Możesz także użyć interpolacji, aby uzyskać dokładniejszy pik. Weź dziennik widma, a następnie dopasuj parabolę do szczytu i dwóch sąsiednich punktów i znajdź prawdziwy szczyt paraboli. Jednak może nie być tak dokładna.

Oto mój przykładowy kod Python do tego wszystkiego .

endolit
źródło
Właśnie tego szukałem, bardzo dobra odpowiedź, dziękuję!
Valentin Radu,
2
Pomnożenie przez zwężającą się funkcję okna spowoduje rozmycie wszelkich linii widmowych w sygnale, dzięki czemu będą one szersze. To, co może ci kupić, to zakres dynamiczny, pozwalający na przykład zidentyfikować linię widmową o bardzo niskiej mocy w obecności tonu zakłócającego dużej mocy.
Jason R
@JasonR, biorąc pod uwagę fakt, że jest on przeznaczony do pracy w środowisku, w którym prawdopodobieństwo wystąpienia zakłóceń o dużej mocy jest naprawdę niskie, czy sugerujesz, że lepiej nie używać okna Hamminga?
Valentin Radu,
1
Mogę potwierdzić, że korzystanie z okna Hamminga zbliżyło mnie do celu, jakim jest utrzymywanie odczytów na stałym poziomie. W tej chwili, kiedy gram na A4, otrzymuję 440 Hz i tylko bardzo rzadko otrzymuję dokładny odczyt, jak na przykład 650 Hz. Zgaduję, że to są harmoniczne? Ponadto nie mogłem nie zauważyć, że dla wyższych częstotliwości aplikacja działa bez zarzutu, a dla niższych zaczyna się ona zawodzić. Prawdopodobnie dlatego, że używam FTT do wykrywania bin częstotliwości szczytowej wielkości i dla niższych częstotliwości, które nie zawsze są fundamentalne?
Valentin Radu,
1
@ rozmyślanie: 660 Hz nie jest harmoniczną 440 Hz, ale jest to harmoniczna 220 Hz, czyli doskonała piąta powyżej 440. Może to być kolejna struna rezonująca lub zniekształcająca, czy coś takiego? O wiele łatwiej jest rozwiązywać takie problemy, jeśli możesz nakreślić FFT i spojrzeć na to. Tak, niskie częstotliwości mogą być filtrowane i redukowane w stosunku do wyższych, albo przez efekty mechaniczne, albo przez obwód analogowy.
endolith,
12

Skok nie jest taki sam jak przedział częstotliwości wielkości szczytowej FFT. Pitch to ludzkie zjawisko psychoakustyczne. Dźwięk wysokości dźwięku może mieć brakującą lub bardzo słabą podstawę (wspólną dla niektórych brzmień głosu, pianina i gitary) i / lub wiele mocnych tonów w swoim spektrum, które przytłaczają częstotliwość wysokości dźwięku (ale nadal są słyszane jako nuta wysokości przez człowieka) . Zatem żaden detektor częstotliwości szczytowej FFT (nawet w tym niektóre okienkowanie i interpolacja) nie będzie niezawodną metodą szacowania wysokości tonu.

To pytanie dotyczące przepełnienia stosu zawiera listę alternatywnych metod szacowania wysokości dźwięku, które mogą dawać lepsze wyniki.

DODANO: Jeśli robisz to dla dźwięków gitary, zwróć uwagę, że najniższe struny gitary mogą faktycznie wytwarzać lekko nieharmoniczne podtony, co jeszcze bardziej utrudnia oszacowanie wysokości tonu, ponieważ ludzkie ucho może słyszeć częstotliwość tonu bliższą pod-wielokrotnościom tonów zamiast rzeczywistej podstawowej częstotliwości drgań struny.

DODANO # 2: Zadaje się to tak często, że napisałem dłuższy post na blogu na ten temat: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html

hotpaw2
źródło
właśnie odwiedził (i skomentował) blog, do którego nas odesłałeś.
Robert Bristol-Johnson
5

Spędziłem wiele lat badając wykrywanie wysokości dźwięku w muzyce polifonicznej - jak wykrywanie nut gitarowego solo w nagraniu mp3. Napisałem również sekcję na Wikipedii, która zawiera krótki opis tego procesu (spójrz na podsekcję „Wykrywanie podziałki” w linku poniżej).

Po naciśnięciu jednego klawisza na pianinie słyszymy nie tylko jedną częstotliwość wibracji dźwięku, ale kompozyt z wielu wibracji dźwiękowych występujących na różnych częstotliwościach związanych matematycznie. Elementy tego kompozytu wibracji o różnych częstotliwościach nazywane są harmonicznymi lub częściowymi. Na przykład, jeśli naciśniemy środkowy klawisz C na pianinie, poszczególne częstotliwości harmonicznych kompozytu zaczną się od 261,6 Hz jako częstotliwości podstawowej, 523 Hz to druga harmoniczna, 785 Hz to trzecia harmoniczna, 1046 Hz być czwartą harmoniczną itp. Późniejsze harmoniczne są całkowitymi wielokrotnościami częstotliwości podstawowej 261,6 Hz (np. 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046).

Używam zmodyfikowanej transformacji logarytmicznej DFT, aby najpierw wykryć możliwe harmoniczne, szukając częstotliwości o poziomach szczytowych (patrz schemat poniżej). Ze względu na sposób, w jaki zbieram dane dla mojego zmodyfikowanego dziennika DFT, NIE muszę stosować funkcji okienkowania do sygnału ani dodawać i nakładać się . Stworzyłem DFT, więc jego kanały częstotliwości są logarytmicznie rozmieszczone w celu bezpośredniego wyrównania z częstotliwościami, w których harmoniczne są tworzone przez nuty na gitarze, saksofonie itp.

Teraz, kiedy jestem na emeryturze, zdecydowałem się wydać kod źródłowy mojego silnika wykrywania wysokości dźwięku w bezpłatnej aplikacji demonstracyjnej o nazwie PitchScope Player . Program PitchScope Player jest dostępny w Internecie i można pobrać plik wykonywalny dla systemu Windows, aby zobaczyć, jak działa mój algorytm na wybranym pliku mp3. Poniższy link do GitHub.com doprowadzi cię do mojego pełnego kodu źródłowego, w którym możesz zobaczyć, jak wykrywam harmoniczne za pomocą niestandardowej transformacji logarytmicznej DFT, a następnie szukać cząsteczek (harmonicznych), których częstotliwości spełniają prawidłową relację całkowitą, która definiuje „ smoła'.

Mój algorytm wykrywania skoku jest w rzeczywistości procesem dwuetapowym: a) Najpierw wykrywany jest ScalePitch („ScalePitch” ma 12 możliwych wartości wysokości: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) i po określeniu ScalePitch, wówczas oktawę oblicza się, badając wszystkie harmoniczne dla 4 możliwych nut oktawy-kandydata. Algorytm ma na celu wykrycie najbardziej dominującej wysokości (nuty) w dowolnym momencie w polifonicznym pliku MP3. Zwykle odpowiada to nutom solo instrumentalnego. Osoby zainteresowane kodem źródłowym C ++ dla mojego algorytmu 2-etapowego wykrywania wysokości mogą chcieć rozpocząć od funkcji Estimate_ScalePitch () w pliku SPitchCalc.cpp na GitHub.com.

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

Poniżej znajduje się obraz Logarytmicznego DFT (utworzonego przez moje oprogramowanie C ++) na 3 sekundy solo na gitarze na polifonicznym nagraniu mp3. Pokazuje, jak harmoniczne wyglądają dla poszczególnych nut na gitarze podczas gry solo. Dla każdej nuty na tym logarytmicznym DFT możemy zobaczyć, jak wiele harmonicznych rozciąga się pionowo, ponieważ każda harmoniczna będzie miała tę samą szerokość czasową. Po określeniu oktawy nuty znamy częstotliwość Fundamentu.

wprowadź opis zdjęcia tutaj

Poniższy schemat pokazuje algorytm wykrywania oktawy, który opracowałem, aby wybrać prawidłową notatkę oktawę-kandydata (to znaczy prawidłową podstawę), po ustaleniu Skalowania dla tej nuty. Ci, którzy chcą zobaczyć tę metodę w C ++, powinni przejść do funkcji Calc_Best_Octave_Candidate () w pliku o nazwie FundCandidCalcer.cpp, który jest zawarty w moim kodzie źródłowym na GitHub.

wprowadź opis zdjęcia tutaj

James Paul Millard
źródło
James, czy Twój detektor wysokości DFT wykrywa nuty z brakującą (lub słabą) podstawą?
robert bristow-johnson
Tak, mój 2-stopniowy algorytm wykrywania wysokości wykrywa nuty, nawet jeśli sygnał ma „brakującą (lub słabą) podstawę” - to duża siła tego 2-etapowego procesu. Podstawa jest określana w drugim etapie, gdy detekcja oktawy jest wykonywana na szerokościach czasu, które widzisz dla notatek na logarytmicznym schemacie DFT. Ponieważ ta funkcja wykrywania wysokości dźwięku działa w pomieszaniu z polifonicznym sygnałem mp3, wykrywa nuty, w których brakuje wielu harmonicznych, w tym podstawy. Właśnie dodałem do tej odpowiedzi drugi schemat wyjaśniający mój algorytm wykrywania oktawy.
James Paul Millard,