Używam funkcji średniej różnicy wielkości do oszacowania podstawowej częstotliwości quasi-okresowego sygnału audio. AMDF jest zdefiniowany jako
gdzie to długość sygnału. Ta funkcja wykazuje minimum, gdy sygnał jest przesuwany o wartość równą jego okresowi.
Oto kod, którego używam do wyodrębnienia wysokości tonu (w Matlabie):
a = amdf(f);
a = a/max(a);
[p l] = findpeaks(-a, 'minpeakprominence', 0.6);
pitch = round(sample_freq/l(1);
Mam jednak do czynienia z sygnałem audio, w którym częstotliwość podstawowa jest bardzo niska:
W konsekwencji pojawia się problem podwojenia wysokości tonu: wykryte minimum odpowiada połowie okresu sygnału (tj. Drugiej harmonicznej):
Próbowałem wydobyć największy szczyt, a nie tylko pierwszy, ale czasami ten problem pozostaje. Jak mogę poprawić swój kod i / lub funkcję AMDF, aby radzić sobie z niskimi podstawami?
audio
pitch
fundamental-frequency
firion
źródło
źródło
Odpowiedzi:
To właśnie nazywamy w wykrywaniu wysokości dźwięku, „ problemem oktawy ”.
Przede wszystkim zmieniłbym AMDF na ASDF. I nie zmniejszałbym rozmiaru okna wraz ze wzrostem opóźnienia. (Zmieniam też notację na coś, co uważam za bardziej konwencjonalne ”.x[n] „to sygnał czasu dyskretnego.)
Funkcja średniej kwadratowej różnicy (ASDF) zx[n] w sąsiedztwie próbki x[n0] jest:
floor()
funkcją i, jeśliTeraz rozwiń kwadrat i zastanów się, jak wyglądają podsumowaniaN→∞ (nie to N to dzieje się w nieskończoność, ale daje wyobrażenie, jeśliN jest wielki). ASDF jest bezpośrednio związany z autokorelacją. Zasadniczo autokorelacja wywróciła się do góry nogami. Te kroki pozostawię wam. spójrz na tę odpowiedź.
Rozważmy teraz tę „autokorelację” o skończonej długości (w sąsiedztwie próbkix[n0] ) zdefiniowane w ASDF:
gdzie
OdQx[ 0 ,n0] = 0 i Qx[ k ,n0] ≥ 0 dla wszystkich opóźnień k , oznacza to, że Rx[ k ,n0] ≤Rx[ 0 ,n0] dla wszystkich opóźnień k .
Załóżmy, że przez chwilęx[n] jest okresowy z kropką P (i P tak się składa, że jest liczbą całkowitą)
iQx[mP,n0]=0 i Rx[mP,n0]=Rx[0,n0]≥Rx[k,n0] dla dowolnej liczby okresów całkowitych (m jest liczbą całkowitą). Więc masz szczyt wk=0 i o k równa dowolnej innej wielokrotności P gdyby x[n] jest okresowy. Gdybyx[n] nie jest idealnie okresowy, możemy się spodziewać największego szczytuk=0 , kolejny pik (ale nieco mniejszy) przy k=P (okres, którego szukamy) i stopniowo mniejsze szczyty dla większych wielokrotności P .
Więc problemem oktawę chodzi o uwagi z kilku powodów. Po pierwsze,P niekoniecznie jest liczbą całkowitą. To problem interpolacji, nic wielkiego.
Drugim powodem i trudniejszym problemem są subharmoniczne . Weź pod uwagę, że słuchasz ładnego dźwięku okresowego z dokładnie A-440 Hz i brzmi on jak A, który jest o 9 półtonów powyżej środkowej C. Teraz załóżmy, że ktoś dodaje do tego tonu bardzo niewielką amplitudę (jak poniżej 60 dB) A -220? Jak to będzie brzmieć i matematycznie jaki jest „prawdziwy” okres?
Wybór „właściwego” szczytu okresu.
Załóżmy, że przepuszczasz notatkę przez filtr blokujący DC, aby uzyskać średniąx[n] wynosi zero. Okazuje się, że powoduje średnią autokorelacjęRx[k,n0] dla każdego n0 równa się zero (lub blisko niego, jeśli N jest wielki). To znaczyRx[k,n0] musi sumować (ponad k ) wynosi około zero, co oznacza, że obszar powyżej zera jest tyle samo, co poniżej.
Dobrze, więcRx[0,n0] reprezentuje moc x[n] w pobliżu n=n0 i musi być nieujemny. Rx[k,n0] nigdy nie przekracza Rx[0,n0] ale może być tak duża, jak wtedy x[n] jest okresowy. Rx[P,n0]=Rx[0,n0] gdyby x[n+P]=x[n] . Więc jeślix[n] jest okresowy z kropką P i masz kilka pików oddalonych od siebie P i masz pomysł, jak wysokie powinny być te szczyty. A jeśli składnik DC zRx[k,n0] wynosi zero, co oznacza, że pomiędzy pikami musi mieć wartości ujemne.
Gdybyx[n] był „quasi-okresowy”, jeden cykl x[n] będzie wyglądać jak sąsiedni cykl, ale nie tak bardzo jak cykl x[n] w miarę upływu czasu sygnał. To oznacza pierwszy szczytRx[P,n0] będzie wyższy niż drugi o Rx[2P,n0] lub trzeci Rx[3P,n0] . Można użyć reguły, aby zawsze wybierać najwyższy szczyt i oczekiwać, że najwyższy szczyt będzie zawsze pierwszy. Ale z powodu niesłyszalnych subharmonicznych czasami tak nie jest. czasami drugi lub być może trzeci pik jest nieco wyższy. Również dlatego, że okresP prawdopodobnie nie jest liczbą całkowitą próbek, ale k w Rx[k,n0] jest zawsze liczbą całkowitą, więc prawdziwy pik najprawdopodobniej znajdzie się pomiędzy wartościami całkowitymi wynoszącymi k . Nawet jeśli interpolujesz w miejscu, w którym znajduje się gładki pik (co polecam, interpolacja kwadratowa jest wystarczająco dobra) i jak wysoko jest naprawdę między liczbą całkowitąk , Twój algorytm interpolacji może sprawić, że pik będzie nieco wyższy lub nieco niższy niż jest w rzeczywistości. Zatem wybranie absolutnie najwyższego szczytu może skutkować fałszywym wybraniem drugiego nad pierwszym pikiem (lub odwrotnie), kiedy naprawdę chcesz drugiego.
Więc w jakiś sposób musisz utrudniać wzrostyk tak że pierwszy szczyt ma niewielką przewagę nad drugim, a drugi nad czwartym (następna oktawa w dół) itp. Jak to robisz?
Robisz to, mnożącRx[k,n0] z funkcją malejącą k tak że szczyt przy k=2P jest zmniejszona o jakiś czynnik, w stosunku do identycznego piku przy k=P . Okazuje się, że robi to funkcja mocy (a nie wykładnicza). więc oblicz
Więc jeślix[n] były idealnie okresowe z kropką P oraz ignorowanie problemów z interpolacją dla wartości niecałkowitych P , następnie
ale
Czynnikiem, o który zmniejsza się pik wysokości o jedną oktawę, jest stosunek
Jeśli więc chcesz dać swojemu pierwszemu pikowi wzmocnienie 1% w stosunku do drugiego piku, co oznacza, że nie wybierzesz wysokości dźwięku jako wysokości sub-harmonicznej, chyba że autokorelacja wysokości sub-harmonicznej jest co najmniej 1% większa niż pierwsza szczyt, dla którego byś rozwiązałα od
Jest to konsekwentny sposób ważenia, zmniejszania lub zmniejszania piku odpowiadającego wysokości subharmonicznej o jedną oktawę poniżej.
Nadal pozostaje ci problem progowy. Masz wybórα dobrze. Jest to jednak konsekwentny sposób podkreślania pierwszego piku nad drugim, który jest o oktawę niższy, ale nie tak bardzo, że jeśli nuta jest naprawdę oktawą niższa, ale energia we wszystkich parzystych harmonicznych była silna, w porównaniu do nieparzystej harmonicznych, pozostawi to możliwość wyboru drugiego piku.
źródło
Heurystycznie podstawowa częstotliwość mowy dźwięcznej będzie się mieścić w przedziale [70, 400] Hz. Pierwszym krokiem byłoby zastosowanie filtra pasmowoprzepustowego, aby w przybliżeniu odizolować to pasmo.
Po drugie, można zastosować funkcję ważenia do spektrum mocy. W pobliżu podstawy ciężar powinien być bliski 1, a bliżej końca pasma ciężar powinien być bliski 0. To ważenie jest oczywiście znormalizowane. Poleciłbym coś superliniowego: kwadratowy, kwartalny itp. - aby naprawdę zabić oktawy.
źródło