Estoy tratando de calcular una autocorrelación en una plataforma donde la única primitiva acelerada que tengo disponible es la (I) FFT. Aunque tengo un problema.
Lo prototipé en MATLAB . Sin embargo, estoy un poco confundido. Supuse que funciona simplemente de la siguiente manera (esto es de memoria, así que disculpas si me equivoco un poco).
autocorr = ifft( complex( abs( fft( inputData ) ), 0 ) )
Sin embargo, obtengo un resultado diferente al que obtengo al usar la xcorr
función. Ahora espero no obtener el lado izquierdo de la correlación automática (ya que es un reflejo del lado derecho y, por lo tanto, no es necesario de todos modos). Sin embargo, el problema es que mi lado derecho parece reflejarse alrededor del punto medio. Lo que efectivamente significa que obtengo aproximadamente la mitad de la cantidad de datos que estoy esperando.
Así que estoy seguro de que debo estar haciendo algo muy simple, pero no puedo entender qué.
Respuestas:
pichenettes tiene razón, por supuesto. La FFT implementa una convolución circular mientras que xcorr () se basa en una convolución lineal. Además, también debe cuadrar el valor absoluto en el dominio de frecuencia. Aquí hay un fragmento de código que maneja todo el relleno, desplazamiento y truncamiento de cero.
fuente
fuente
En resumen: debería haber hecho esto (para adaptarse a su lenguaje de programación):
O en MATLAB:
fuente
La razón principal para que la salida deseada de la función xcorr no sea similar a la de la aplicación de la función FFT e IFFT es porque al aplicar estas funciones a las señales, el resultado final es circularmente enrevesado .
La principal diferencia entre la convolución lineal y la convolución circular se puede encontrar en la convolución lineal y circular .
El problema puede resolverse inicialmente rellenando con cero la señal y truncando la salida final de IFFT .
fuente