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:
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:
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"