Pregunté esta pregunta en StackOverflow, y me han recomendado que lo pregunte aquí.
Tengo dos series temporales de datos del acelerómetro 3D que tienen diferentes bases de tiempo (los relojes se iniciaron en momentos diferentes, con algún ligero deslizamiento durante el tiempo de muestreo), además de contener muchos huecos de diferente tamaño (debido a los retrasos asociados a la escritura en dispositivos flash separados).
Los acelerómetros que estoy utilizando son los económicos GCDC X250-2 . Estoy utilizando los acelerómetros en su máxima ganancia, por lo que los datos tienen un piso de ruido significativo.
Cada una de las series temporales tiene unos 2 millones de puntos de datos (más de una hora a 512 muestras/seg), y contienen unos 500 eventos de interés, donde un evento típico abarca 100-150 muestras (200-300 ms cada una). Muchos de estos eventos se ven afectados por las interrupciones de datos durante las escrituras flash.
Por lo tanto, los datos no son prístinos, y ni siquiera son muy bonitos. Pero mi inspección ocular muestra que contiene claramente la información que me interesa. (Puedo publicar gráficos, si es necesario).
Los acelerómetros están en entornos similares, pero sólo están moderadamente acoplados, lo que significa que puedo saber a ojo qué eventos coinciden de cada acelerómetro, pero no he tenido éxito hasta ahora en hacerlo en el software. Debido a las limitaciones físicas, los dispositivos también están montados en diferentes orientaciones, donde los ejes no coinciden, pero son lo más cercano a la ortogonalidad que pude hacer. Así, por ejemplo, para los acelerómetros de 3 ejes A y B, +Ax corresponde a -By (arriba-abajo), +Az corresponde a -Bx (izquierda-derecha), y +Ay corresponde a -Bz (adelante-atrás).
Mi objetivo inicial es correlacionar los eventos de choque en el eje vertical, aunque eventualmente me gustaría a) descubrir automáticamente el mapeo del eje, b) correlacionar la actividad en los ases mapeados, y c) extraer las diferencias de comportamiento entre los dos acelerómetros (como la torsión o la flexión).
La naturaleza de los datos de las series temporales hace que numpy.correlate() de Python sea inutilizable. También he mirado el paquete Zoo de R, pero no he avanzado con él. He buscado ayuda en diferentes campos del análisis de señales, pero no he hecho ningún progreso.
¿Alguien tiene alguna pista sobre lo que puedo hacer, o enfoques que debería investigar?
Actualización del 28 de febrero de 2011: Añadidas algunas parcelas aquí mostrando ejemplos de los datos.
1 votos
@BobC, tal vez uno de los moderadores pueda hacer migrar tu post a este sitio. Eso sería lo más razonable. En cuanto a tus preguntas técnicas, en primer lugar, ¿estás utilizando la FFT para hacer la correlación? Eso debería ser factible para 2 millones de puntos de datos en un ordenador medio decente. La relación señal/ruido parece razonablemente alta, así que debería ser posible. Una forma rápida y sucia sería rellenar los datos que faltan con la última muestra disponible o con ceros. El deslizamiento de las diferencias del intervalo de muestreo puede ser la "característica" más difícil de tratar de sus datos.
0 votos
@cardinal: Efectivamente, probé una FFT, sólo para obtener basura como resultado. Las características "interesantes" fácilmente visibles en los datos son indistinguibles del ruido en la FFT. Sin embargo, he hecho FFTs sólo en el conjunto de datos completo: Tal vez una FFT de ventana móvil proporcionaría mejores resultados, pero todavía no he podido encontrar una forma computacionalmente eficiente de implementarla. Sospecho que una transformada Wavelet podría ayudar, pero no estoy familiarizado con ella (pero estoy aprendiendo poco a poco).
1 votos
@BobC, lo que quería decir es que si consideraste una implementación basada en la FFT para calcular la correlación. La convolución directa es $O(n^2)$ pero una implementación basada en la FFT reduciría esta $O(n \log n)$ , lo que lo hace factible. En cuanto a la FFT en sí, con 2 millones de puntos de datos, su resolución de frecuencia será muy alta. Cualquier desviación en el muestreo y otras cosas están obligadas a lavar la señal en una base de frecuencia. Sin embargo, deberías ser capaz de agregar muchos intervalos para sacar la señal del ruido. Algo así como un enfoque Welch o tal vez una técnica de ventana personalizada.
0 votos
@BobC, de la parte superior de mi cabeza, parece que alguna variante de un solapar y añadir o solapar y guardar podría utilizarse para hacer una FFT de ventana deslizante. Deslizar las muestras dentro de una ventana equivale a un desplazamiento de fase, por lo que lo único que hay que hacer es compensar las muestras que se "caen" por el extremo izquierdo y las que "entran" por el extremo derecho.
0 votos
Hola, tengo una pregunta similar. Tengo 2 series temporales, cada una representada por una matriz con su primera columna correspondiente a los valores y la segunda columna correspondiente a la diferencia de tiempo (desde el valor anterior) ¿Cómo encuentro la correlación entre estas 2 matrices? Intenté hacer xcorr2() pero no parece correcto y haciendo xcorr probablemente calcularía la correlación teniendo en cuenta sólo los valores, pero también quiero tener en cuenta el tiempo. Estoy muy confundido aquí, ¿una FFT ayudará? ¿Cómo sugieres que lo haga?
0 votos
@cardinal, ¿has echado un vistazo a los gráficos que he publicado como actualización de la pregunta original? Los sensores no están midiendo entornos idénticos, y el entorno realiza muchos filtros, cuya naturaleza será cuantificada por futuros análisis. Pero los cambios parecen ser suficientes para impedir el uso del desplazamiento de fase.
0 votos
@lmelza Convertido; sin embargo, si tienes una pregunta, sólo tienes que hacerla como una nueva (botón ASK QUESTION en la parte superior derecha).
0 votos
@BobC, he echado un vistazo rápido a los tres fragmentos de la trama que has publicado. Intentaré echarle un vistazo más a fondo hoy mismo. No es del todo pertinente a su pregunta, pero estoy un poco desconcertado por los abandonos de datos. Yo solía trabajar con acelerómetros multicanales muestreando a 1kHz por canal o más durante horas y nunca experimenté tales problemas. Asumiendo que estás ejecutando cada canal en, digamos, un ADC de 12 bits, puedes fácilmente canalizar eso incluso a través de un cable serial estándar y todavía tener más que suficiente para alguna codificación adicional de corrección de errores.
0 votos
Se trata de una adquisición móvil en la que el tamaño y el peso mínimos son fundamentales, y no se dispone de alimentación externa. Enlazo con los dispositivos utilizados en el OP. Carecen de memoria interna suficiente para amortiguar los datos durante las lentas escrituras en una tarjeta microSD. Los dispositivos tienen una tasa de muestreo variable, y los estoy utilizando a 512 Hz, su tasa más rápida, obteniendo así las peores caídas. Sólo las frecuencias de muestreo inferiores a 60 Hz están libres de pérdidas, y dichas frecuencias submuestrean completamente los eventos que me interesan. El dispositivo tiene un modo de adquisición en ráfaga, pero la implementación tiene un uso limitado.
0 votos
Bob, tengo la misma necesidad, ¿has hecho algún progreso? Saludos cordiales Nicolas
0 votos
¿Tiene la marca de tiempo de los datos? Si es así, ¿por qué no excluye simplemente el tiempo que falta de ambas series?