Questo è ciò che chiamiamo nel biz di rilevazione di intonazione, il " problema di ottava ".
Prima di tutto, cambierei l'AMDF in ASDF. E non ridurrei le dimensioni della finestra all'aumentare del ritardo. (Inoltre, sto cambiando la notazione in quello che considero più convenzionale. " " è un segnale a tempo discreto.)x[n]
La funzione di differenza quadrata media (ASDF) di nelle vicinanze del campione x [ n 0 ] è:x[n]x[n0]
Qx[k,n0]≜1N∑n=0N−1(x[n+n0−⌊N+k2⌋] − x[n+n0−⌊N+k2⌋+k])2
è lafunzione e, se k è pari, allora ⌊ k⌊⋅⌋floor()
k .⌊k2⌋=⌊k+12⌋=k2
Ora espandi il quadrato e considera come appaiono le sommazioni come (non che N sta andando all'infinito, ma per darti un'idea se N è grande). L'ASDF è direttamente correlato all'autocorrelazione. È essenzialmente l'autocorrelazione capovolta. Questi passaggi ti lascerò. dai un'occhiata a questa risposta.N→∞N N
Quindi ora consideriamo questa "autocorrelazione" a lunghezza finita (in prossimità del campione ) definita dall'ASDF:x[n0]
Rx[k,n0]=Rx[0,n0]−12Qx[k,n0]
dove
Rx[0,n0]≜1N∑n=0N−1(x[n+n0−⌊N2⌋])2
Poiché e Q x [ k , n 0 ] ≥ 0 per tutti i ritardi k , ciò significa che R x [ k , n 0 ] ≤ R x [ 0 , n 0 ] per tutti i ritardi k .Qx[0,n0]=0Qx[k,n0]≥0kRx[k,n0]≤Rx[0,n0]k
Supponiamo per un minuto che sia periodico con il periodo P (e P sembra essere un numero intero), quindix[n]PP
x[n+P]=x[n]∀n
e e R x [ m P , n 0 ] = R x [ 0 , n 0 ] ≥ R x [ k , n 0 ] per qualsiasi numero intero di periodi ( m è un numero intero). Quindi ottieni un picco a k = 0 e k uguale a qualsiasi altro multiplo di P se xQx[mP,n0]=0Rx[mP,n0]=Rx[0,n0]≥Rx[k,n0]mk=0kP è periodico. Se x [ n ] nonèperfettamente periodico, quello che potremmo aspettarci è il picco più grande in k = 0 , un altro picco (ma leggermente più piccolo) in k = P (il periodo che stiamo cercando) e picchi progressivamente più piccoli per multipli più grandi di P .x[n]x[n]k=0k=PP
Quindi il problema dell'ottava si presenta per un paio di ragioni. Prima di tutto, non è necessariamente un numero intero. Questo è un problema di interpolazione, non un grosso problema. P
La seconda ragione e il problema più difficile è quello della submonmonica . Considera che stai ascoltando un bel tono periodico esattamente A-440 Hz e suona come una A che è 9 semitoni sopra il centro C. Ora supponi che qualcuno aggiunga a quel tono un'ampiezza molto piccola (come giù 60 dB) A -220? Come suonerà e matematicamente qual è il periodo "vero"?
Scelta del picco "giusto" per il periodo.
Diciamo che esegui la nota attraverso un filtro di blocco DC, in modo che la media di sia zero. Si scopre che fa sì che la media dell'autocorrelazione R x [ k , n 0 ] per ogni n 0 sia anche zero (o vicino ad essa se N è grande). Ciò significa che R x [ k , n 0 ] deve essere sommato (su k ) per essere circa zero, il che significa che c'è un'area sopra lo zero di sotto.x[n]Rx[k,n0]n0NRx[k,n0]k
Va bene, quindi rappresenta la potenza di x [ n ] nelle vicinanze intorno a n = n 0 e deve essere non negativo. R x [ k , n 0 ] non supera mai R x [ 0 , n 0 ] ma può ingrandirsi quando x [ n ] è periodico. R x [ P , n 0 ]Rx[0,n0]x[n]n=n0Rx[k,n0]Rx[0,n0]x[n] se x [ n + P ] = x [ n ] . Quindi se x [ n ] è periodico con il periodo P e hai un sacco di picchi distanziati da P e hai un'idea di quanto dovrebbero essere alti quei picchi. E se il componente DC di R x [ k , n 0 ] è zero, ciò significa tra i picchi,deveavere valori negativi.Rx[P,n0]=Rx[0,n0]x[n+P]=x[n]x[n]PPRx[k,n0]
Se era "quasi periodico", un ciclo di x [ n ] assomiglierà molto a un ciclo adiacente, ma non tanto a un ciclo di x [ n ] più in basso nel segnale nel tempo. Ciò significa che il primo picco R x [ P , n 0 ] sarà maggiore del secondo a R x [ 2 P , n 0 ] o il terzo R x [ 3 P , n 0 ]x[n]x[n]x[n]Rx[P,n0]Rx[2P,n0]Rx[3P,n0]. Si potrebbe usare la regola per scegliere sempre il picco più alto e aspettarsi che il picco più alto sia sempre il primo. Ma, a causa della submonmonica impercettibile, a volte non è così. a volte il secondo o forse il terzo picco è oh-così-leggermente più alto. Inoltre, poiché il periodo probabilmente non è un numero intero di campioni ma k in R x [ k , n 0 ] è sempre un numero intero, quindi il picco vero sarà probabilmente tra i valori interi di k . Anche se dovessi interpolare dove si trova il picco regolare (che raccomando e l'interpolazione quadratica è abbastanza buona), e quanto è alto davvero tra il numero intero kPkRx[k,n0]kk, la tua interpolazione potrebbe rendere un picco leggermente più alto o leggermente più basso di quello che è realmente. Quindi la scelta del picco assolutamente più alto può comportare la scelta spuria del secondo sul primo picco (o viceversa) quando si voleva davvero l'altro.
Quindi in qualche modo devi ostacolare i picchi all'aumentare di modo che il primo picco abbia un leggero vantaggio sul secondo, e il secondo sul quarto (la prossima ottava in basso), ecc. Come lo fai?k
Fate che moltiplicando con una funzione decrescente di k in modo che il picco a k = 2 P è diminuito di qualche fattore, rispetto ad un picco identico a k = P . Si scopre che la funzione di alimentazione (non l'esponenziale) lo fa. così calcolareRx[k,n0]kk=2Pk=P
k−α Rx[k,n0]
Quindi, se fosse perfettamente periodico con il periodo P e ignorando i problemi di interpolazione per P non intero , allorax[n]PP
Rx[2P,n0]=Rx[P,n0]
ma
(2P)−αRx[2P,n0](2P)−αRx[P,n0]=<P−αRx[P,n0]
Il fattore di riduzione del picco per un'intonazione di un'ottava inferiore è il rapporto
(2P)−αRx[2P,n0]P−αRx[P,n0]=(2P)−αP−α=2−α
α
2−α=0.99
Questo è il modo coerente per ponderare, de-enfatizzare o ostacolare il picco corrispondente al tono subarmonico di un'ottava sotto.
α