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.
Respuestas:
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 ):
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:
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:
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:
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"
fuente
Autocorrelation of the STFT in the time direction
? Específicamente la parte de la dirección del tiempoSuena 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.
fuente
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.
fuente