Autocorrelazione nell'analisi audio


11

Sto leggendo su Autocorrelation , ma non sono sicuro di capire esattamente come funziona e quale output dovrei aspettarmi. Ho ragione nel pensare che dovrei inserire il mio segnale nella funzione AC e avere un ingresso a finestra scorrevole. Ogni finestra (di 1024 campioni, ad esempio) produrrebbe un coefficiente tra -1 e 1. Il segno indica semplicemente se la linea è verso l'alto o verso il basso e il valore indica quanto è forte la correlazione. Per semplicità, diciamo che non ho una sovrapposizione e sposto ogni volta la finestra 1024 campioni. In un campione di 44100, otterrei 43 coefficienti e devo mantenerli tutti?

Diciamo che eseguo questo per un segnale di 200 secondi, dandomi 8600 coefficienti. Come utilizzerei questi coefficienti per rilevare la ripetizione e, a sua volta, il tempo? Dovrei creare una sorta di rete neurale per raggrupparli o è eccessivo?

Grazie per qualsiasi aiuto.


4
1024x[1],x[2],,x[1024]i=11024(x[i])21024R[k]R[k]=i=11024kx[i]x[i+k]1024R[k]R[k]=i=11024kx[i]x[i+k]+i=1kx[1024k+i]x[i]

Ehi Dilip, grazie per l'aiuto. Non ho ancora implementato la funzione AC, sto solo cercando di capire prima la teoria. La prima equazione sembra essere la più semplice, ma i dati dovrebbero essere normalizzati in anticipo?
XSL

1

Risposte:


23

L'idea di autocorrelazione è quella di fornire una misura di somiglianza tra un segnale e se stesso in un determinato ritardo. Esistono diversi modi per affrontarlo, ma ai fini del rilevamento di tonalità / tempo, puoi considerarlo come una procedura di ricerca. In altre parole, si passa attraverso il segnale campione per campione ed si esegue una correlazione tra la finestra di riferimento e la finestra ritardata. La correlazione a "ritardo 0" sarà il massimo globale perché stai confrontando il riferimento con una copia testuale di se stesso. Man mano che avanzi, la correlazione diminuirà necessariamente, ma nel caso di un segnale periodico, ad un certo punto inizierà nuovamente ad aumentare, quindi raggiungerà un massimo locale. La distanza tra "lag 0" e quel primo picco ti dà una stima del tuo pitch / tempo. Il modo in cui io

Il calcolo delle correlazioni campione per campione può essere molto costoso dal punto di vista computazionale a frequenze di campionamento elevate, quindi in genere viene utilizzato un approccio basato su FFT. Prendere la FFT del segmento di interesse, moltiplicandolo per il suo coniugato complesso , quindi prendere la FFT inversa ti darà l' autocorrelazione ciclica . Nel codice (usando numpy ):

freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))

L'effetto sarà di ridurre la quantità di rumore nel segnale (che non è correlato con se stesso) rispetto alle componenti periodiche (che sono simili a loro stesse per definizione). La ripetizione dell'autocorrelazione (ovvero la moltiplicazione del coniugato) prima di effettuare la trasformazione inversa ridurrà ulteriormente il rumore. Considera l'esempio di un'onda sinusoidale mista a rumore bianco. Il diagramma seguente mostra un'onda sinusoidale da 440 Hz, la stessa onda sinusoidale "corrotta" dal rumore, l'autocorrelazione ciclica dell'onda rumorosa e la doppia autocorrelazione ciclica:

autocorrelazione

Notare come il primo picco di entrambi i segnali di autocorrelazione si trova esattamente alla fine del primo ciclo del segnale originale. Questo è il picco che stai cercando per determinare la periodicità (tono in questo caso). Il primo segnale di autocorrelazione è ancora un po '"sinuoso", quindi per eseguire il rilevamento di picco sarebbe necessario un qualche tipo di livellamento. L'autocorrelazione due volte nel dominio della frequenza realizza la stessa cosa (ed è relativamente veloce). Nota che per "wiggly" intendo come appare il segnale quando ingrandito, non il calo che si verifica al centro della trama. La seconda metà dell'autocorrelazione ciclica sarà sempre l'immagine speculare della prima metà, quindi quel tipo di "tuffo" è tipico. Giusto per essere chiari sull'algoritmo, ecco come sarebbe il codice:

freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)

La necessità di eseguire più di una autocorrelazione dipende dalla quantità di rumore presente nel segnale.

Naturalmente, ci sono molte sottili variazioni su questa idea e non ho intenzione di approfondirle tutte qui. La copertura più completa che ho visto (nel contesto del rilevamento del tono) è in Digital Processing of Speech Signals di Rabiner e Schafer.


Ora, se l'autocorrelazione sarà sufficiente per il rilevamento del tempo. La risposta è sì e no. È possibile ottenere alcune informazioni sul tempo (a seconda del segnale sorgente), ma potrebbe essere difficile capire cosa significhi in tutti i casi. Ad esempio, ecco un diagramma di due anelli di un breakbeat, seguito da un diagramma dell'autocorrelazione ciclica dell'intera sequenza:

Breakbeat Autocorrelation

Per riferimento, ecco l'audio corrispondente:

Abbastanza sicuro, c'è un bel picco nel mezzo corrispondente al punto del loop, ma è venuto dall'elaborazione di un segmento piuttosto lungo. Inoltre, se non fosse una copia esatta (ad esempio se fosse presente una strumentazione), quel picco non sarebbe altrettanto pulito. L'autocorrelazione sarà sicuramente utile nel rilevamento del tempo, ma probabilmente non sarà sufficiente da sola per materiale sorgente complesso. Ad esempio, anche se trovi un picco, come fai a sapere se è una misura completa, o una nota da un quarto, una mezza nota o qualcos'altro? In questo caso è abbastanza chiaro che si tratta di una misura completa, ma non sarà sempre così. Suggerirei di giocare con l'uso di AC su segnali più semplici fino a quando i meccanismi interni non saranno chiari, quindi fare un'altra domanda sul rilevamento del tempo in generale (poiché è un "più grande"


2
Aspetta, è l'autocorrelazione del segnale audio stesso? Questo non è certamente molto utile per il rilevamento del tempo di nient'altro che loop digitali. L'autocorrelazione di alcuni inviluppi RMS dovrebbe funzionare molto meglio in generale, preferibilmente per più bande di frequenza separatamente.
circa il

1
L'autocorrelazione della STFT nella direzione del tempo funziona abbastanza bene, purché la musica abbia un qualche tipo di battito. Questo è essenzialmente lo stesso di eseguire l'autocorrelazione di molte bande di frequenza e quindi di sommarle.
endolith

2
@leftroundabout Esatto, ci sono molte cose che dovrebbero essere fatte per il rilevamento del tempo (pre, post elaborazione) oltre all'auto-correlazione da sola. Sto principalmente rispondendo alla prima frase della domanda del PO (ovvero "come funziona l'autocorrelazione"), quindi suggerendo che faccia un'altra domanda sul rilevamento del tempo, poiché saranno coinvolti altri processi.
datageist

@endolith cosa intendi qui con Autocorrelation of the STFT in the time direction? In particolare la parte della direzione del tempo
popctrl

1
@popctrl Significato per calcolare l'autocorrelazione di ogni riga della STFT
endolith

3

Sembra che tu voglia usare l'autocorrelazione per fare il rilevamento delle battute. Puoi farlo, ma ti suggerisco di effettuare un downsampling massiccio dell'audio. Stai cercando un segnale tra 1 e 3 Hz (da 60 bpm a 180 bpm), quindi non hai bisogno o vuoi una risoluzione di 44100 hz. Un'autocorrelazione correttamente calcolata e normalizzata è 1.0 al ritardo 0 (il segnale si correla perfettamente con se stesso). Per un segnale periodico, ac scende al di sotto di zero, quindi ritorna al picco in corrispondenza del ritardo corrispondente alla frequenza fondamentale, con picchi più piccoli alle armoniche. Devi scegliere un intervallo ragionevole in cui cercare questo picco. Per il rumore, l'autocorrelazione si abbassa e sostanzialmente si piega in pieghe intorno allo zero. Come regola generale, se si ha un picco> 0,5 nell'AC normalizzata, si ha un segnale periodico.


1

L'auto correlazione è semplicemente la correlazione incrociata di un segnale con se stesso. Un modo semplice per calcolarlo è fare una convoluzione tra il segnale originale e una versione del segnale capovolta nel tempo. Se si dispone di un segnale lungo 1000 campioni, la sua correlazione automatica ha campioni diversi da 1999 (2 * N-1). Solo 1000 di questi campioni sono unici perché la correlazione automatica (per un segnale reale) è sempre simmetrica nel tempo, ovvero ac [n] = ac [-n].

I segnali continui devono essere suddivisi in segmenti finiti. È simile alla trasformata di Fourier: tecnicamente è necessario integrare da -inf a + inf, ma suddividendolo in segmenti (con sovrapposizione e / o finestre a seconda delle necessità) produce anche risultati utili. La scelta della lunghezza, della forma e della sovrapposizione della finestra dipende dall'applicazione.

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.