A correlação cruzada e a convolução estão intimamente relacionadas. Em resumo, para fazer convolução com FFTs, você
- zere os sinais de entrada (adicione zeros no final para que pelo menos metade da onda fique "em branco")
- pegue a FFT de ambos os sinais
- multiplique os resultados juntos (multiplicação por elementos)
- faça a FFT inversa
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
Você precisa fazer o preenchimento zero, porque o método FFT é na verdade correlação cruzada circular , o que significa que o sinal passa pelas extremidades. Então, você adiciona zeros suficientes para se livrar da sobreposição, para simular um sinal que é zerado até o infinito.
Para obter correlação cruzada em vez de convolução, você precisa reverter o tempo de um dos sinais antes de executar a FFT ou usar o complexo conjugado de um dos sinais após a FFT:
corr(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros[reversed]))
corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros)))
o que for mais fácil com o seu hardware / software. Para autocorrelação (correlação cruzada de um sinal consigo mesmo), é melhor fazer o conjugado complexo, porque então você só precisa calcular a FFT uma vez.
Se os sinais são reais, você pode usar FFTs reais (RFFT / IRFFT) e economizar metade do seu tempo de computação calculando apenas metade do espectro.
Além disso, você pode economizar tempo de computação preenchendo um tamanho maior para o qual a FFT é otimizada (como um número suave de 5 para FFTPACK, um número suave de 13 para FFTW ou uma potência de 2 para uma implementação simples de hardware).
Aqui está um exemplo no Python da correlação FFT em comparação com a correlação de força bruta: https://stackoverflow.com/a/1768140/125507
Isso fornecerá a função de correlação cruzada, que é uma medida de similaridade versus deslocamento. Para obter o deslocamento no qual as ondas estão "alinhadas" umas com as outras, haverá um pico na função de correlação:
O valor x do pico é o deslocamento, que pode ser negativo ou positivo.
Eu só vi isso usado para encontrar o deslocamento entre duas ondas. Você pode obter uma estimativa mais precisa do deslocamento (melhor que a resolução de suas amostras) usando interpolação parabólica / quadrática no pico.
Para obter um valor de semelhança entre -1 e 1 (um valor negativo indicando que um dos sinais diminui à medida que o outro aumenta), é necessário dimensionar a amplitude de acordo com o comprimento das entradas, o comprimento da FFT, a sua implementação específica da FFT escala, etc. A autocorrelação de uma onda consigo fornecerá o valor da correspondência máxima possível.
Observe que isso funcionará apenas em ondas que tenham a mesma forma. Se eles tiverem sido amostrados em hardware diferente ou tiverem acrescentado algum ruído, mas ainda assim tiverem a mesma forma, essa comparação funcionará, mas se a forma da onda tiver sido alterada por filtragem ou mudanças de fase, elas poderão soar iguais, mas ganharão correlacionar também.