A idéia da autocorrelação é fornecer uma medida de semelhança entre um sinal e ele próprio em um determinado atraso. Existem várias maneiras de abordá-lo, mas, para fins de detecção de afinação / andamento, você pode pensar nisso como um procedimento de pesquisa. Em outras palavras, você percorre o sinal amostra por amostra e executa uma correlação entre a janela de referência e a janela atrasada. A correlação em "lag 0" será o máximo global porque você está comparando a referência a uma cópia literal dela mesma. À medida que você avança, a correlação necessariamente diminui, mas, no caso de um sinal periódico, em algum momento ele começará a aumentar novamente, atingindo o máximo local. A distância entre o "atraso 0" e o primeiro pico fornece uma estimativa do seu tom / andamento. Do jeito que eu
O cálculo de correlações amostra a amostra pode ser muito caro em termos computacionais, com altas taxas de amostragem; portanto, normalmente é usada uma abordagem baseada na FFT. Tomando a FFT do segmento de interesse, multiplicando-a pelo seu complexo conjugado , depois tomando a FFT inversa, você terá a autocorrelação cíclica . No código (usando numpy ):
freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))
O efeito será diminuir a quantidade de ruído no sinal (que não está correlacionado com ele mesmo) em relação aos componentes periódicos (que são semelhantes a si mesmos por definição). Repetir a autocorrelação (isto é, multiplicação conjugada) antes de realizar a transformação inversa reduzirá ainda mais o ruído. Considere o exemplo de uma onda senoidal misturada com ruído branco. O gráfico a seguir mostra uma onda senoidal de 440hz, a mesma onda senoidal "corrompida" pelo ruído, a autocorrelação cíclica da onda barulhenta e a dupla autocorrelação cíclica:
Observe como o primeiro pico dos dois sinais de autocorrelação está localizado exatamente no final do primeiro ciclo do sinal original. Esse é o pico que você está procurando para determinar a periodicidade (passo neste caso). O primeiro sinal de autocorrelação ainda é um pouco "complicado", portanto, para realizar a detecção de pico, seria necessário algum tipo de suavização. A autocorrelação duas vezes no domínio da frequência realiza a mesma coisa (e é relativamente rápida). Observe que, com "wiggly", quero dizer como o sinal fica quando o zoom é ampliado, e não a queda que ocorre no centro do gráfico. A segunda metade da correlação automática cíclica sempre será a imagem espelhada da primeira metade, de modo que esse tipo de "mergulho" é típico. Apenas para esclarecer o algoritmo, veja como seria o código:
freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)
A necessidade de fazer mais de uma autocorrelação depende da quantidade de ruído no sinal.
Claro, existem muitas variações sutis nessa idéia, e eu não vou entrar em todas elas aqui. A cobertura mais abrangente que eu já vi (no contexto da detecção de afinação) está no processamento digital de sinais de fala de Rabiner e Schafer.
Agora, se a autocorrelação será suficiente para a detecção do andamento. A resposta é sim e não. Você pode obter algumas informações de andamento (dependendo do sinal da fonte), mas pode ser difícil entender o que isso significa em todos os casos. Por exemplo, aqui está um gráfico de dois loops de um breakbeat, seguidos por um gráfico da autocorrelação cíclica de toda a sequência:
Para referência, aqui está o áudio correspondente:
Com certeza, há um bom pico no meio correspondente ao ponto do loop, mas veio do processamento de um segmento bastante longo. Além disso, se não fosse uma cópia exata (por exemplo, se houvesse instrumentação), esse pico não seria tão limpo. A autocorrelação será definitivamente útil na detecção de tempo, mas provavelmente não será suficiente por si só para material fonte complexo. Por exemplo, mesmo que você encontre um pico, como você sabe se é uma medida completa, semínima, semínima ou outra coisa? Nesse caso, é claro o suficiente que é uma medida completa, mas nem sempre será esse o caso. Sugiro que você use AC em sinais mais simples, até que o funcionamento interno fique claro, e faça outra pergunta sobre a detecção de tempo em geral (como é um "maior"