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.
źródło
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
źródło
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.
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.
źródło