Autocorrelação na análise de áudio


11

Estou lendo sobre Autocorrelação , mas não sei se entendi exatamente como funciona e que saída devo esperar. Estou certo ao pensar que devo inserir meu sinal na função CA e ter uma entrada na janela deslizante. Cada janela (de 1024 amostras, por exemplo) produziria um coeficiente entre -1 e 1. O sinal simplesmente indica se a linha está para cima ou para baixo e o valor indica o quão forte é a correlação. Por uma questão de simplicidade, digamos que não tenho sobreposição e mova a janela 1024 amostras de cada vez. Em uma amostra de 44100, obteria 43 coeficientes e preciso manter todos eles?

Digamos que eu faça isso por um sinal de 200 segundos, me dando 8600 coeficientes. Como eu usaria esses coeficientes para detectar repetições e, por sua vez, andamento? Devo criar algum tipo de rede neural para agrupá-los ou isso é um exagero?

Obrigado por qualquer ajuda.


4
Suponha que suas amostras sejam . Você poderia nos dizer o que sua função CA retorna? As respostas possíveis podem ser: "Retorna " ou "Retorna números onde "ou" Retorna números onde ". Todas as três respostas sugeridas são compatíveis com a noção de autocorrelação. x [ 1 ] , x [ 2 ] , , x [ 1024 ] 1024 i = 1 ( x [ i ] ) 2 1024 R [ k ] R [ k ] = 1024 - k ] R [ k ] = 1024 - k i = 1 x [ i ]1024x[1],x[2],...,x[1024]Eu=11024(x[Eu])21024R[k]1024R[kR[k]=Eu=11024-kx[Eu]x[Eu+k]1024R[k]R[k]=Eu=11024-kx[Eu]x[Eu+k]+Eu=1kx[1024-k+Eu]x[Eu]
Dilip Sarwate

Ei Dilip, obrigado pela ajuda. Ainda não implementei a função AC, apenas estou tentando entender a teoria primeiro. A primeira equação parece ser a mais fácil, mas os dados precisariam ser normalizados antecipadamente?
XSL

1
Aqui está um exemplo: gist.github.com/255291#L62
endolith

Respostas:


23

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:

Autocorrelação

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:

Autocorrelação Breakbeat

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"


2
Espera aí, é a autocorrelação do sinal de áudio? Isso certamente não é muito útil para a detecção do andamento de qualquer coisa, exceto loops digitais. A autocorrelação de alguns envelopes RMS deve funcionar muito melhor em geral, de preferência para várias bandas de frequência separadamente.
leftaroundabout

1
A autocorrelação do STFT na direção do tempo funciona muito bem, desde que a música tenha algum tipo de ritmo. Isso é essencialmente o mesmo que executar a autocorrelação de muitas bandas de frequência e, em seguida, juntá-las.
endolith 10/10

2
@leftroundabout Certo, há várias coisas que precisariam ser feitas para a detecção de andamento (pré, pós-processamento), além da autocorrelação por si só. Estou respondendo principalmente à primeira frase da pergunta do OP (ou seja, "como funciona a autocorrelação") e depois sugiro que ele faça outra pergunta sobre a detecção de tempo, porque outros processos estarão envolvidos.
datageist

@ endolith o que você quer dizer com aqui Autocorrelation of the STFT in the time direction? Especificamente a parte da direção do tempo
popctrl 11/03/19

1
@popctrl Significado para calcular a autocorrelação de cada linha da STFT
endolith

3

Parece que você deseja usar a autocorrelação para detectar a batida. Você pode fazer isso, mas eu sugiro que você reduza enormemente o seu áudio. Você está procurando um sinal entre 1 e 3 Hz (60 bpm a 180 bpm) para não precisar ou querer uma resolução de 44100 hz. Uma autocorrelação normalizada e computada corretamente é de 1,0 no atraso 0 (o sinal se correlaciona perfeitamente com ele mesmo). Para um sinal periódico, a CA cai abaixo de zero e volta a um pico no atraso correspondente à frequência fundamental, com picos menores nas harmônicas. Você deve escolher um intervalo razoável para pesquisar esse pico. Para o ruído, a autocorrelação diminui e basicamente as linhas planas em rabiscos ao redor de zero. Como regra geral, se você tem um pico> 0,5 na CA normalizada, recebe um sinal periódico.


1

A correlação automática é simplesmente a correlação cruzada de um sinal consigo mesma. Uma maneira fácil de calcular é fazer uma convolução entre o sinal original e uma versão do sinal com inversão de tempo. Se você tiver um sinal com 1000 amostras de comprimento, sua correlação automática terá amostras diferentes de zero em 1999 (2 * N-1). Apenas 1000 dessas amostras são únicas porque a correlação automática (para um sinal real) é sempre simétrica no tempo, ou seja, ac [n] = ac [-n].

Sinais contínuos precisam ser divididos em segmentos finitos. Isso é semelhante à Transformada de Fourier: tecnicamente, você precisa integrar de -inf a + inf, mas dividi-lo em segmentos (com sobreposição e / ou janelas conforme necessário) também produz resultados úteis. A escolha do comprimento, forma e sobreposição da janela depende da aplicação.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.