2009-08-13 17 views
10

Me preguntaba si alguien podría indicarme un algoritmo/técnica que se usa para comparar las señales dependientes del tiempo. Idealmente, este algoritmo hipotético tomaría en 2 señales como entradas y devolvería un número que sería el porcentaje de similitud entre las señales (0 es que las 2 señales no están estadísticamente relacionadas y 1 es que son una combinación perfecta).Algoritmo para coincidir con las señales dependientes del tiempo (1D)

Por supuesto, me doy cuenta de que hay problemas con mi solicitud, concretamente que no estoy seguro de cómo definir correctamente la "similitud" en el contexto de comparar estas 2 señales, por lo que si alguien me puede señalar dirección (en cuanto a lo que debería buscar/saber, etc.), lo agradecería también.

Respuesta

0

No sé procesamiento de señales, así que esto es una conjetura ..:

es la señal de manera efectiva una lista de pares ordenados (x,y), donde x es el tiempo y la amplitud y? Si es así, entonces tal vez usted podría tirar a la basura después de coordenadas de tiempo - por ejemplo:

Signal 1: [(x0,y0), (x1,y1), (x2,y2), (x3,y3), ...] 
Signal 2: [(x0,z0), (x1,z1), (x2,z1), (x3,z3), ...] 

Tirar tiempo:

Signal 1: [y0, y1, y2, y3, ...] 
Signal 2: [z0, z1, z2, z3, ...] 

A continuación, se pueden comparar las amplitudes entre sí, tal vez mediante la búsqueda de un correlation . Tal vez usted podría trazar y contra z:

Comparing: [(y0,z0), (y1,z1), (y2,z2), (y3,z3), ...] 

o calcular uno de los diversos coeficientes de correlación.

1

Solución general: puede bin los datos en histogramas y utilizar una prueba de Chi-cuadrado o una prueba de Kolomogrov.

Ambos están explícitamente destinados a estimar las posibilidades de que las dos distribuciones representen muestras aleatorias de la misma distribución subordinada (es decir: tienen la misma forma dentro de las estadísticas).

No sé aplicación de corriente alterna de la parte superior de mi cabeza, pero ROOT proporciona C++ aplicación de ambos:

Creo que los documentos apuntan a cierta papeles también.


creo que CERNLIB proporciona ambos algoritmos en FORTRAN77, que se puede enlace a c. Traducir el código ROOT puede ser más fácil.

1

Puede probar una Transformada rápida de Fourier (consulte FFT en Wikipedia, hay bibliotecas de código abierto para realizar conversiones).

Las FFT transformarán sus datos del dominio del tiempo (es decir, un pulso en 1s, 2s, 3s, 4s ...) en datos en el dominio de la frecuencia (es decir, un pulso cada segundo).

Luego puede comparar frecuencias y sus fuerzas relativas más fácilmente.Debe ser un paso en la dirección correcta para ti.

+0

No es una mala sugerencia para algunos tipos de entrada, pero en realidad se deja la OP con el mismo problema: cómo comparar dos de los espectros. – dmckee

+0

dmckee: excepto que las señales transformadas de Fourier serían comparables punto por punto sin cambios. Por cierto, "espectros" es el término incorrecto para las señales originales, ya que implicaría energía (o medida equivalente) en el eje x. – Svante

14

La cross-correlation function es la clásica solución de procesamiento de señales. Si tiene acceso a Matlab, vea la función XCORR. max(abs(xcorr(Signal1, Signal2, 'coeff'))) le daría específicamente lo que está buscando y existe un equivalente en Python también.

La correlación cruzada asume que la "similitud" que está buscando es una medida de la relación lineal entre las dos señales. La definición para las señales de longitud finita de valor real con el índice de tiempo n = 0..N-1 es:

C[g] = sum{m = 0..N-1} (x1[m] * x2[g+m]) 

g carreras de -N..N (fuera de ese rango el producto dentro de la suma es 0).

Aunque ha pedido un número, la función es bastante interesante. El dominio de función g se denomina dominio de retardo.

Si x1 y x2 están relacionadas por un desplazamiento de tiempo, la función de correlación cruzada tendrá su pico en el retardo correspondiente al desplazamiento. Por ejemplo, si tenía x1 = sin[wn] y x2 = sin[wn + phi], entonces dos ondas sinusoidales en la misma frecuencia y fase diferente, la función de correlación cruzada tendría su pico en el desfase correspondiente al cambio de fase.

Si x2 es una versión a escala de x1, la correlación cruzada también se escalará. Puede normalizar la función a un coeficiente de correlación dividiendo por sqrt(sum(x1^2)*sum(x2^2)), y llevarlo a 0..1 tomando un valor absoluto (esa línea de Matlab tiene estas operaciones).

Más en general, a continuación se muestra un resumen de lo que la correlación cruzada es buena/mala.

La correlación cruzada funciona bien para determinar si una señal está linealmente relacionada con otra, es decir, si
x2(t) = sum{n = 0..K-1}(A_n * x1(t + phi_n))
donde x1(t) y x2(t) son las señales de que se trate, A_n son factores de escala, y phi_n son los desplazamientos de tiempo. Las implicaciones de esto son:

  1. Si una señal es un tiempo versión desplazada de la otra (phi_n <> 0 for some n) la función de correlación cruzada será distinto de cero.
  2. Si una señal es una versión escalada de la otra (A_n <> 0 for some n), la función de correlación cruzada será distinta de cero.
  3. Si una señal es una combinación de versiones escaladas y desplazadas en el tiempo de la otra (tanto A_n como phi_n son distintas de cero para algunas n) la función de correlación cruzada será distinta de cero. Tenga en cuenta que esta es también una definición de filtro lineal.

Para obtener más concreta, suponga que x1 es una señal aleatoria de banda ancha. Deje x2=x1. Ahora la función de correlación cruzada normalizada será exactamente 1 en g = 0, y cerca de 0 en todas partes. Ahora, deje x2 ser una versión (linealmente) filtrada de x1. La función de correlación cruzada será distinta de cero cerca de g=0. El ancho de la parte distinta de cero dependerá del ancho de banda del filtro.

Para que el caso especial de x1 y x2 sea periódico, se aplica la información sobre el desplazamiento de fase en la parte original de la respuesta.

Donde la correlación cruzada será no es de ayuda es si las dos señales no están relacionadas linealmente. Por ejemplo, dos señales periódicas a diferentes frecuencias no están relacionadas linealmente. Tampoco se extraen dos señales aleatorias de un proceso aleatorio de banda ancha en diferentes momentos. Tampoco hay dos señales que sean similares en forma pero con indexación de tiempo diferente; esto es como el caso de frecuencia fundamental desigual.

En todos los casos, la normalización de la función de correlación cruzada y observar el valor máximo le dirá si las señales están potencialmente relacionadas linealmente; si el número es bajo, como por debajo de 0.1, me sentiría cómodo al declararlos sin relación. Más alto que eso y lo analizaría con más cuidado, graficando las funciones de correlación cruzada tanto normalizadas como no normalizadas y mirando la estructura. Una correlación cruzada periódica implica que ambas señales son periódicas, y una función de correlación cruzada que es notablemente más alta alrededor de g=0 implica que una señal es una versión filtrada de la otra.

+0

No está del todo claro a partir de la pregunta, pero si Oort quiere una medida de uniformidad de forma (en lugar de en fase), entonces la correlación cruzada es menos que óptima: dada una señal base s_b y dos señales de prueba t_1, t_2, no es adecuado para decir qué señal de prueba es más parecida a la señal base. – dmckee

+0

Estoy buscando una función que daría una medida de uniformidad de forma. ¿Qué sería mejor? – oort

+0

@oort: mira mi respuesta para un par de opciones. Estas son más complejas que la correlación cruzada, pero realmente van directamente a la cuestión de la similitud de forma. – dmckee

1

Dynamic Time Warping es un enfoque que puede usar si las señales se combinan acelerando y disminuyendo el tiempo en diferentes posiciones.

0

No dice mucho sobre cuáles son las señales, y qué medida de "similitud" sería significativa para usted. Pero, si las señales están en fase (es decir, si desea comparar las dos señales instantáneamente y no va a haber ningún retraso para considerarlas), le sugiero que consulte el correlacionador de Pearson. Le da un valor de 1 si las dos señales son idénticas, un valor de 0 si son completamente diferentes, y algo intermedio si es que riman. Como una ventaja adicional, a Pearson no le importa si las señales se amplifican de manera diferente (excepto que si una señal es la inversa de la otra le da un resultado de -1).

¿Eso suena como lo que estás buscando?

http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient

Cuestiones relacionadas