scipy proporciona una función de correlación que funcionará bien para entradas pequeñas y también si desea una correlación no circular, lo que significa que la señal no se ajustará. tenga en cuenta que en mode='full'
, el tamaño de la matriz devuelta por signal.correlation es la suma de los tamaños de señal de entrada - 1, por lo que el valor de argmax
está desactivado por (tamaño de señal -1 = 20) de lo que parece esperar.
from scipy import signal, fftpack
import numpy
a = numpy.array([0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0, 0, 0, 0, 0])
b = numpy.array([0, 0, 0, 0, 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0])
numpy.argmax(signal.correlate(a,b)) -> 16
numpy.argmax(signal.correlate(b,a)) -> 24
Los dos valores diferentes corresponden a si el cambio está en a
o b
.
Si desea una correlación circular y para un tamaño de señal grande, puede usar el teorema de convolución/transformada de Fourier con la advertencia de que la correlación es muy similar pero no idéntica a la convolución.
A = fftpack.fft(a)
B = fftpack.fft(b)
Ar = -A.conjugate()
Br = -B.conjugate()
numpy.argmax(numpy.abs(fftpack.ifft(Ar*B))) -> 4
numpy.argmax(numpy.abs(fftpack.ifft(A*Br))) -> 17
de nuevo los dos valores corresponden a si su interpretación de un cambio en a
o un cambio en b
.
La conjugación negativa se debe a la convolución al voltear una de las funciones, pero en correlación no hay inversión. Puede deshacer el volteo ya sea invirtiendo una de las señales y luego tomando la FFT, o tomando la FFT de la señal y luego tomando el conjugado negativo. es decir, lo siguiente es verdadero: Ar = -A.conjugate() = fft(a[::-1])
1UP: Poco familiarizado con el procesamiento de señal , pero parece que sabes de lo que me estás hablando. – MattH
Gracias por la respuesta. Esta es la primera vez que veo algo que tiene sentido. Ahora una pregunta más, dependiendo del "signo" del valor de cambio de tiempo Restaré o añadiré el turno de tiempo. ¿Cómo obtener el signo? – Vishal
Espera ... ¿por qué necesitas el negativo? No creo que necesites el negativo. Deja que x (t) transforme X (f). Por inversión de tiempo, x (-t) tiene transformación X (-f). Si x (t) es real, entonces X (-f) = conj (X (f)). Por lo tanto, si x (t) es real, entonces x (-t) tiene tr ansform conj (X (f)). Sin negativo –