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−⌊N2⌋])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.