Come gestire i fondamentali bassi quando si utilizza AMDF per l'estrazione del pitch?


11

Sto usando la funzione differenza magnitudo media per stimare la frequenza fondamentale di un segnale audio quasi periodico. L'AMDF è definito come

Dn=1Nnk=nN1|SkSkn|

dove N è la lunghezza del segnale. Questa funzione mostra un minimo quando il segnale viene spostato di una quantità pari al suo periodo.

Questo è il codice che sto usando per estrarre il tono (in Matlab):

 a = amdf(f);
 a = a/max(a);
 [p l] = findpeaks(-a, 'minpeakprominence', 0.6);
 pitch = round(sample_freq/l(1);

Tuttavia, ho a che fare con un segnale audio in cui la frequenza fondamentale è molto bassa:

spettro del segnale audio

Di conseguenza, sorge un problema di raddoppio del tono: il minimo rilevato corrisponde alla metà del periodo del segnale (cioè la seconda armonica):

AMDF del segnale sopra

Ho cercato di estrarre il picco più grande e non solo il primo, ma a volte questo problema rimane. Come posso migliorare il mio codice e / o la funzione AMDF per gestire i fondamentali bassi?


La psicoacustica e la percezione umana influenzano l'incertezza percepita del tono e dell'ottava. Potrebbe essere necessaria una sperimentazione per determinare in quali condizioni il picco AMDF più grande fa una differenza udibile.
hotpaw2,

quanto sono basse le tue frequenze? c'è qualche esempio per me da ascoltare?
ederwander,

Risposte:


10

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]1Nn=0N1(x[n+n0N+k2]  x[n+n0N+k2+k])2

è lafunzione e, se k è pari, allorakfloor()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.NN 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]1Nn=0N1(x[n+n0N2])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.

α


1
Per rispondere alla tua ultima domanda: se aggiungi un'ampiezza di 220 Hz, l'intonazione sarà di 220 Hz in cui 440 Hz è la prima armonica dopo quella fondamentale (matematicamente parlando). Il mio caso è simile ma ci sono anche armoniche più elevate, quindi il fondamentale mancante non è un problema dal punto di vista percettivo. Non capisco come la sostituzione di AMDF con ASDF potrebbe risolvere il problema dell'ottava
firion

ma l'altra metà della domanda è * "come suonerà"? rispondi e poi vediamo cosa vuoi che faccia il tuo rivelatore di intonazione.
robert bristow-johnson

Rx[k,n0]

Se non si hanno altre armoniche più alte ma solo quella a 440 Hz e il tono a 220 Hz è sufficientemente basso, si udirà un tono a 440 Hz. Sopra un certo livello (non so quale), sentirai anche il tono a 220 Hz e quindi un tono a 220 Hz.
firion

c'è un motivo per cui ho detto -60 dB. ora cosa vuoi che dica il tuo rivelatore di intonazione, che è una nota da 220 Hz o 440 Hz o qualcos'altro?
robert bristow-johnson,

0

Euristicamente, la frequenza fondamentale del parlato espresso si troverà nell'intervallo [70, 400] Hz. Quindi, il primo passo sarebbe quello di applicare un filtro passa-banda per isolare approssimativamente quella banda.

In secondo luogo, è possibile applicare una funzione di ponderazione allo spettro di potenza. Vicino al fondamentale, il peso dovrebbe essere vicino a 1, mentre più vicino alla fine della banda, il peso dovrebbe essere vicino a 0. Questa ponderazione è ovviamente normalizzata. Consiglierei qualcosa di super-lineare: quadratico, quartico ecc. Per uccidere davvero le ottave.


Come posso applicare il peso? Non so dove sia il fondamentale. Inoltre, il mio segnale è una nota dello strumento, quindi la gamma è più ampia
firion
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.