Jak radzić sobie z niskim poziomem podstawowym przy użyciu AMDF do ekstrakcji skoku?


11

Używam funkcji średniej różnicy wielkości do oszacowania podstawowej częstotliwości quasi-okresowego sygnału audio. AMDF jest zdefiniowany jako

ren=1N.-nk=nN.-1|S.k-S.k-n|

gdzie N.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:

widmo sygnału audio

W konsekwencji pojawia się problem podwojenia wysokości tonu: wykryte minimum odpowiada połowie okresu sygnału (tj. Drugiej harmonicznej):

AMDF powyższego sygnału

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?


Psychoakustyka i percepcja człowieka wpływają na postrzeganą niepewność wysokości i oktawy. Może to wymagać eksperymentów w celu ustalenia, w jakich warunkach największy pik AMDF robi słyszalną różnicę.
hotpaw2

jak niskie są twoje częstotliwości? czy jest jakiś przykład do słuchania?
ederwander

Odpowiedzi:


10

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) z x[n] w sąsiedztwie próbki x[n0] jest:

Qx[k,n0]1N.n=0N.-1(x[n+n0-N.+k2)] - x[n+n0-N.+k2)+k])2)

jest floor()funkcją i, jeślik jest nawet wtedy k2=k+12=k2.

Teraz rozwiń kwadrat i zastanów się, jak wyglądają podsumowania N (nie to N to dzieje się w nieskończoność, ale daje wyobrażenie, jeśliNjest 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:

Rx[k,n0]=Rx[0,n0]12Qx[k,n0]

gdzie

Rx[0,n0]1N.n=0N.-1(x[n+n0-N.2)])2)

Od Qx[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ą)

x[n+P]=x[n]n

i Qx[mP,n0]=0 i Rx[mP,n0]=Rx[0,n0]Rx[k,n0] dla dowolnej liczby okresów całkowitych (mjest 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,Pniekoniecznie 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 Njest 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ęc Rx[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 Pi 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.

Gdyby x[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ć wzrostyktak że pierwszy szczyt ma niewielką przewagę nad drugim, a drugi nad czwartym (następna oktawa w dół) itp. Jak to robisz?

Robisz to, mnożąc Rx[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

kα Rx[k,n0]

Więc jeśli x[n] były idealnie okresowe z kropką Poraz ignorowanie problemów z interpolacją dla wartości niecałkowitych P, następnie

Rx[2P,n0]=Rx[P,n0]

ale

(2P)αRx[2P,n0]=(2P)αRx[P,n0]<PαRx[P,n0]

Czynnikiem, o który zmniejsza się pik wysokości o jedną oktawę, jest stosunek

(2P)αRx[2P,n0]PαRx[P,n0]=(2P)αPα=2α

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

2α=0.99

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.


1
Aby odpowiedzieć na twoje ostatnie pytanie: jeśli dodasz amplitudę 220 Hz, wysokość będzie wynosić 220 Hz, gdzie 440 Hz jest pierwszą harmoniczną po podstawie (matematycznie). Mój przypadek jest podobny, ale są też wyższe harmoniczne, więc brakująca podstawa nie stanowi problemu z percepcyjnego punktu widzenia. Nie rozumiem, w jaki sposób zamiana AMDF na ASDF mogłaby rozwiązać problem oktawy
odpalenie

ale druga połowa pytania brzmi * „jak to będzie brzmieć”? odpowiedz na to pytanie, a następnie sprawdźmy, co chcesz zrobić za pomocą detektora wysokości.
Robert Bristol-Johnson

spróbuj obliczyć i wykreślić Rx[k,n0]dla tego samego tonu, który zrobiłeś dla AMDF. powinien wyglądać jak AMDF do góry nogami.
Robert Bristol-Johnson

Jeśli nie masz innych wyższych harmonicznych, ale tylko 440 Hz, a ton 220 Hz jest wystarczająco niski, usłyszysz wysokość 440 Hz. Powyżej pewnego poziomu (nie wiem który) usłyszysz także ton 220 Hz, a więc wysokość 220 Hz.
odpal

jest powód, dla którego powiedziałem -60 dB. teraz, co chcesz, by detektor wysokości powiedział, że to dźwięk 220 Hz, 440 Hz lub coś innego?
Robert Bristol-Johnson

0

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.


Jak mogę zastosować wagę? Nie wiem, gdzie jest podstawa. Ponadto mój sygnał jest nutą instrumentu, więc zasięg jest większy
odpalenie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.