Autocorrelación en análisis de audio.

11

Estoy leyendo sobre Autocorrelación , pero no estoy seguro de entender exactamente cómo funciona y qué resultados debo esperar. Estoy en lo cierto al pensar que debería ingresar mi señal a la función AC y tener una entrada de ventana deslizante. Cada ventana (de 1024 muestras, por ejemplo) generaría un coeficiente entre -1 y 1. El signo simplemente indica si la línea está hacia arriba o hacia abajo y el valor indica qué tan fuerte es la correlación. Para simplificar, digamos que no tengo una superposición y solo muevo la ventana 1024 muestras cada vez. En una muestra de 44100, ¿obtendría 43 coeficientes y necesito mantenerlos todos?

Digamos que realizo esto para una señal de 200 segundos, lo que me da 8600 coeficientes. ¿Cómo usaría estos coeficientes para detectar la repetición y, a su vez, el tempo? ¿Debo crear algún tipo de red neuronal para agruparlos, o es una exageración?

Gracias por cualquier ayuda.

XSL
fuente
44
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]
Hola Dilip, gracias por la ayuda. Todavía no he implementado la función AC, solo estoy tratando de entender la teoría primero. La primera ecuación parece ser la más fácil, pero ¿deberían normalizarse los datos de antemano?
XSL
1
Aquí hay un ejemplo: gist.github.com/255291#L62
endolith el

Respuestas:

23

La idea de la autocorrelación es proporcionar una medida de similitud entre una señal y sí misma en un retraso dado. Hay varias formas de abordarlo, pero a los efectos de la detección de tono / tempo, puede considerarlo como un procedimiento de búsqueda. En otras palabras, pasa por la señal muestra por muestra y realiza una correlación entre su ventana de referencia y la ventana retrasada. La correlación en "lag 0" será el máximo global porque está comparando la referencia a una copia literal de sí mismo. A medida que avanza, la correlación disminuirá necesariamente, pero en el caso de una señal periódica, en algún momento comenzará a aumentar nuevamente y luego alcanzará un máximo local. La distancia entre "retraso 0" y ese primer pico le da una estimación de su tono / tempo. La forma en que yo

Calcular las correlaciones muestra por muestra puede ser muy costoso desde el punto de vista computacional a frecuencias de muestreo altas, por lo que generalmente se utiliza un enfoque basado en FFT. Tomar la FFT del segmento de interés, multiplicarlo por su complejo conjugado , luego tomar la FFT inversa le dará la autocorrelación cíclica . En código (usando numpy ):

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

El efecto será disminuir la cantidad de ruido en la señal (que no está correlacionada consigo misma) en relación con los componentes periódicos (que son similares a ellos por definición). La repetición de la autocorrelación (es decir, la multiplicación conjugada) antes de tomar la transformación inversa reducirá el ruido aún más. Considere el ejemplo de una onda sinusoidal mezclada con ruido blanco. La siguiente gráfica muestra una onda sinusoidal de 440 Hz, la misma onda sinusoidal "corrompida" por el ruido, la autocorrelación cíclica de la onda ruidosa y la autocorrelación cíclica doble:

Autocorrelación

Observe cómo el primer pico de ambas señales de autocorrelación se ubica exactamente al final del primer ciclo de la señal original. Ese es el pico que estás buscando para determinar la periodicidad (tono en este caso). La primera señal de autocorrelación sigue siendo un poco "ondulada", por lo que para realizar la detección de picos, se requeriría algún tipo de suavizado. La autocorrelación dos veces en el dominio de frecuencia logra lo mismo (y es relativamente rápido). Tenga en cuenta que con "ondulado", quiero decir cómo se ve la señal cuando se acerca mucho, no la caída que se produce en el centro de la trama. La segunda mitad de la autocorrelación cíclica siempre será la imagen especular de la primera mitad, por lo que ese tipo de "inmersión" es típico. Para ser claros sobre el algoritmo, así es como se vería el código:

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

La necesidad de hacer más de una autocorrelación depende de cuánto ruido haya en la señal.

Por supuesto, hay muchas variaciones sutiles en esta idea, y no voy a entrar en todas ellas aquí. La cobertura más completa que he visto (en el contexto de la detección de tono) está en el procesamiento digital de señales de voz de Rabiner y Schafer.


Ahora, en cuanto a si la autocorrelación será suficiente para la detección de tempo. La respuesta es sí y no. Puede obtener cierta información de tempo (dependiendo de la señal fuente), pero puede ser difícil entender lo que significa en todos los casos. Por ejemplo, aquí hay una gráfica de dos bucles de un breakbeat, seguida de una gráfica de la autocorrelación cíclica de toda la secuencia:

Breakbeat Autocorrelation

Como referencia, aquí está el audio correspondiente:

Efectivamente, hay un buen pico justo en el medio correspondiente al punto de bucle, pero proviene del procesamiento de un segmento bastante largo. Además de eso, si no fuera una copia exacta (por ejemplo, si hubiera instrumentación con ella), ese pico no sería tan limpio. La autocorrelación definitivamente será útil en la detección de tempo, pero probablemente no sea suficiente por sí sola para material fuente complejo. Por ejemplo, incluso si encuentra un pico, ¿cómo sabe si es un compás completo, un cuarto de nota, una media nota u otra cosa? En este caso, es suficientemente claro que es una medida completa, pero ese no siempre será el caso. Sugeriría jugar con el uso de AC en señales más simples hasta que el funcionamiento interno se aclare, luego hacer otra pregunta sobre la detección de tempo en general (ya que es un "más grande"

Datageist
fuente
2
Espera, ¿es esa la autocorrelación de la señal de audio en sí? Eso ciertamente no es muy útil para la detección de tempo de cualquier cosa que no sean bucles digitales. La autocorrelación de alguna envolvente RMS debería funcionar mucho mejor en general, preferiblemente para múltiples bandas de frecuencia por separado.
Leftaroundabout
1
La autocorrelación del STFT en la dirección del tiempo funciona bastante bien, siempre que la música tenga algún tipo de ritmo. Esto es esencialmente lo mismo que ejecutar la autocorrelación de muchas bandas de frecuencia y luego sumarlas juntas.
Endolith
2
@leftroundabout Correcto, hay muchas cosas que deberían hacerse para la detección de tempo (pre, postprocesamiento) además de la autocorrelación por sí misma. Principalmente respondo a la primera oración de la pregunta del OP (es decir, "cómo funciona la autocorrelación"), luego le sugiero que haga otra pregunta sobre la detección de tempo, porque habrá otros procesos involucrados.
Datageist
@endolith, ¿qué quieres decir aquí con Autocorrelation of the STFT in the time direction? Específicamente la parte de la dirección del tiempo
popctrl
1
@popctrl Significado para calcular la autocorrelación de cada fila del STFT
endolito
3

Suena como si quisieras usar la autocorrelación para detectar latidos. Puede hacer esto, pero le sugiero que reduzca enormemente la muestra de audio. Está buscando una señal entre 1 y 3 Hz (60 bpm a 180 bpm), por lo que no necesita ni desea una resolución de 44100 hz. Una autocorrelación correctamente calculada y normalizada es 1.0 en el retraso 0 (la señal se correlaciona perfectamente consigo misma). Para una señal periódica, la CA cae por debajo de cero, luego vuelve a subir en un pico en el retraso correspondiente a la frecuencia fundamental, con picos más pequeños en los armónicos. Debe elegir un rango razonable en el que buscar este pico. Para el ruido, la autocorrelación cae y, básicamente, las líneas planas en garabatos alrededor de cero. Como regla general, si tiene un pico> 0.5 en la CA normalizada, tiene una señal periódica.

Cuenta
fuente
1

La auto correlación es simplemente la correlación cruzada de una señal consigo misma. Una manera fácil de calcularlo es hacer una convolución entre la señal original y una versión de la señal de tiempo invertido. Si tiene una señal de 1000 muestras, su correlación automática tiene 1999 (2 * N-1) muestras distintas de cero. Solo 1000 de esas muestras son únicas porque la correlación automática (para una señal real) siempre es simétrica en el tiempo, es decir, ac [n] = ac [-n].

Las señales continuas deben dividirse en segmentos finitos. Eso es similar a la Transformada de Fourier: técnicamente necesita integrar de -inf a + inf pero dividirlo en segmentos (con superposición y / o ventanas según sea necesario) también produce resultados útiles. La elección de la longitud, forma y superposición de la ventana depende de la aplicación.

Hilmar
fuente