Estou tentando calcular uma autocorrelação em uma plataforma em que a única primitiva acelerada que tenho disponível é a (I) FFT. Estou tendo um problema.
Eu o prototipei no MATLAB . Estou, no entanto, um pouco confuso. Eu assumi que ele funciona da seguinte forma (isso é da memória, desculpe-me se eu entendi um pouco errado).
autocorr = ifft( complex( abs( fft( inputData ) ), 0 ) )
No entanto, recebo um resultado diferente do uso da xcorr
função Agora, espero não obter o lado esquerdo da correlação automática (pois é um reflexo do lado direito e, portanto, não é necessário). No entanto, o problema é que meu lado direito parece refletir-se em torno do ponto médio. O que significa efetivamente que recebo cerca da metade da quantidade de dados que estou esperando.
Então, tenho certeza de que devo estar fazendo algo muito simples errado, mas não consigo descobrir o que.
Respostas:
pichenettes está certo, é claro. A FFT implementa uma convolução circular enquanto o xcorr () é baseado em uma convolução linear. Além disso, você também precisa quadrado o valor absoluto no domínio da frequência. Aqui está um trecho de código que lida com todo o preenchimento zero, deslocamento e truncamento.
fonte
fonte
Em resumo: você deveria ter feito isso (para ser adaptado à sua linguagem de programação):
Ou no MATLAB:
fonte
A principal razão para a saída desejada da função xcorr não ser semelhante à aplicação das funções FFT e IFFT é porque, ao aplicar essa função aos sinais, o resultado final é circularmente complicado .
A principal diferença entre Convolução Linear e Convolução Circular pode ser encontrada em Convolução Linear e Circular .
O problema pode ser resolvido inicialmente preenchendo o sinal com zero e truncando a saída final do IFFT .
fonte