Wykrywanie ludzkiej podziałki w czasie rzeczywistym

11

Próbuję wdrożyć grę śpiewającą, która będzie analizować dane wejściowe mikrofonu i mówić graczowi, jak dobrze śpiewa. To musi być zrobione w czasie rzeczywistym.

Natknąłem się na wiele wątków zadających to samo pytanie, ale wciąż nie jestem w stanie tego zrobić, prawdopodobnie z powodu mojego braku doświadczenia w tej dziedzinie i małej wiedzy matematycznej. Wdrożyłem algorytm oparty na artykule DSPDimension w artykule dotyczącym zmiany wysokości boiska: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

Wyodrębniam prawdziwą częstotliwość i wielkość, tak jak wyjaśnia to artykuł, ale nie wiem, jak znaleźć częstotliwość podstawową. Próbowałem uzyskać bin z największą wielkością, ale to daje mi tylko dobre wyniki dla sygnałów o wyższej częstotliwości, nie ma znaczenia, którego współczynnika nadpróbkowania używam Nadal otrzymuję złe dane dla sygnałów o niskiej częstotliwości. Czy to podejście jest całkowicie niewłaściwe, czy jestem na dobrej drodze, ale czegoś brakuje?

Z góry dziękuję,

EDYCJA: Zapomniałem wspomnieć, że interesuję się tylko klasą boiska, więc nie ma problemu, jeśli brakuje podstawy, ale mam silną nutę w próbce.

EDIT2: Dzięki wszystkim właśnie ukończyłem wersję algorytmu, która działa jak urok. Problem z oszacowaniem niskiej częstotliwości wynikał z mojego testu wejściowego. Kiedy zaśpiewałem notatkę, pasowała ona poprawnie. Rozważam teraz wszystkie harmoniczne, a nie tylko najwyższy szczyt.

Felipe Lira
źródło
Wikipedia ma pewne informacje.
Emre

Odpowiedzi:

9

Próbowałem uzyskać bin z największą wielkością, ale to daje mi tylko dobre wyniki dla sygnałów o wyższej częstotliwości, nie ma znaczenia, którego współczynnika nadpróbkowania używam Nadal otrzymuję złe dane dla sygnałów o niskiej częstotliwości.

Jest tak, ponieważ harmoniczne większe niż podstawowe. Wykreśl swoje spektrum, a zobaczysz. Lepszym sposobem na znalezienie prawdziwej podstawy jest autokorelacja. Następnie „przesuwasz” przeszłość fali i znajdujesz opóźnienia, w których kształt fali pokrywa się z samym sobą.

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

Czy naprawdę chcesz, aby śpiewali dokładną nutę, czy jest w porządku, jeśli śpiewają oktawę powyżej lub poniżej, w zależności od rejestru głosu?

endolit
źródło
Masz rację, zapomniałem wspomnieć, że interesuje mnie tylko klasa boiska. Korzystam z tej strony, aby przetestować moje narzędzie: seventhstring.com/tuningfork/tuningfork.html . Dla wejścia A (220 Hz) zwraca E (660 Hz) jako znalezioną klasę częstotliwości. Spojrzałem na sprectum i rzeczywiście tam jest 220 Hz, ale o mniejszej wielkości niż 660 Hz. Po odfiltrowaniu wartości poniżej minimalnej wielkości i częstotliwości czapek w moim pożądanym zakresie, sprektum, które z tego uzyskam, ma 4 piki. [pik, mag] = [220, 0,0203], [618, 0,0142], [660, 0,0668], [703, 0,0497].
Felipe Lira
Właśnie pomyślałem, że być może powinienem wziąć pod uwagę przesunięcie fazowe podczas obliczania wielkości, tak jak robię, aby uzyskać prawdziwą częstotliwość. Czy to ma sens? Mam na myśli to, że gdybym miał przesunięcie fazowe wynoszące około 90º dla bin, „szczyt” byłby na poziomie 0, prawda?
Felipe Lira
@elipedrl: Więc zasadniczo piszesz tuner gitarowy. :) Jak rozumiem, filtr dolnoprzepustowy oczyszcza kształt fali, a następnie zlicza piki, aby uzyskać wysokość. electronicdesign.com/article/articles/... aboutmicrocontroller.blogspot.com/2008/04/... Są lepsze sposoby, chociaż, jeśli idziesz do dokładności zamiast taniość gist.github.com/255291
endolit
@elipedrl: Przesunięcie fazowe dla bin powinno być nieistotne dla wysokości tonu. Każdy przedział jest liczbą zespoloną, a interesuje Cię wartość bezwzględna lub wielkość tej liczby. en.wikipedia.org/wiki/Absolute_value#Complex_numbers
endolith
1
a jeśli z jakiegoś powodu zdarzy się, że masz 2 krótsze FFT (opóźnienie, kwanty czasu itp.), obliczenie wokodera fazowego jest mniejszym obliczeniem niż wykonanie jeszcze dłuższej FFT i interpolacja tego.
hotpaw2
6

Tak, użycie estymatora częstotliwości szczytowej dla wysokości tonu jest nieprawidłowe. Skok jest zjawiskiem psychoakustycznym, więc wykrywanie lub szacowanie wysokości tonu różni się od szacowania częstotliwości. W poprzednich odpowiedziach na podobne pytania podano wiele metod szacowania wysokości tonu. Do wyboru masz więcej niż 1.

Oto jeden: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 i inny: Wskazówki dotyczące poprawy wykrywania skoku

DODANO 1: Pytania podobne do tego są zadawane tak często, że pisałem dłuższy post na blogu na ten temat: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft- częstotliwość.html

hotpaw2
źródło
Zaktualizowałem pytanie informacją, że jestem zainteresowany jedynie klasą boiska. Naprawdę mam nadzieję, że FFT z postprocessingiem wystarczy do tego, jestem daleko w tyle za moim harmonogramem, a zmiana podejścia byłaby dla mnie okropna.
Felipe Lira
@elipedrl: FFT powinno wtedy działać. Zdobycie kilku szczytów, a następnie inteligentne wybranie jednego z nich powinno wystarczyć. Pamiętaj, że prawidłowe piki będą bliskie (ale nie do końca) całkowitych wielokrotnościach fundamentu, podczas gdy fałszywe piki nie będą. Musisz unikać wybierania fałszywych pików i unikania wybierania trzeciej harmonicznej itp., Które nie są o oktawę od nuty, której szukasz.
endolith
Jest możliwe, choć być może mało prawdopodobne, aby żaden szczyt częstotliwości nie znajdował się na częstotliwości dźwięku. Niektóre samogłoski męskie mogą być do tego bliskie, pozostały tylko wysokie podteksty po filtrowaniu według formantów samogłoskowych.
hotpaw2
Metoda spektralnego produktu harmonicznego może być odpowiednia do znalezienia najniższego wspólnego mianownika LCD dla grupy pików widmowych, po przetworzeniu początkowych wyników FFT.
hotpaw2