2008-10-15 21 views
9

Estoy leyendo datos de un dispositivo que mide la distancia. Mi frecuencia de muestreo es alta para que pueda medir grandes cambios en la distancia (es decir, velocidad), pero esto significa que, cuando la velocidad es baja, el dispositivo entrega una cantidad de mediciones que son idénticas (debido a la granularidad del dispositivo). Esto da como resultado una curva 'escalonada'.¿Cómo 'suavizar' los datos y calcular el gradiente de línea?

Lo que necesito hacer es suavizar la curva para calcular la velocidad. Luego de eso, necesito calcular la aceleración.

¿Cómo hacer para solucionar esto?

(. Frecuencia de muestreo de hasta 1000 Hz, la tasa de cálculo de 10 Hz no estaría mal uso de C# en VS2005)

Respuesta

25

La entrada de wikipedia de moogs es un buen punto de partida para suavizar los datos. Pero no te ayuda a tomar una decisión.

Todo depende de sus datos y la velocidad de procesamiento necesaria.

Media móvil Aplanará los valores superiores. Si está interesado en el valor mínimo y máximo, no lo use. También creo que usar la media móvil influirá en la medición de la aceleración, ya que aplanará los datos (un poco), por lo que la aceleración parecerá más pequeña. Todo se reduce a la precisión necesaria.

Savitzky-Golay Algoritmo rápido. Tan rápido como el promedio móvil. Eso preservará las alturas de los picos. Algo más difícil de implementar. Y necesitas los coeficientes correctos. Yo elegiría este.

filtros de Kalman Si conoce la distribución, esto le puede dar buenos resultados (que se utiliza en los sistemas de navegación GPS). Tal vez algo más difícil de implementar. Menciono esto porque los he usado en el pasado. Pero probablemente no sean una buena opción para un titular en este tipo de cosas.

Lo anterior reducirá el ruido en su señal.

Lo siguiente que debe hacer es detectar el punto inicial y final de la "aceleración". Puede hacer esto creando un Derivative de la señal original. El punto (s) donde la derivada cruza el eje Y (cero) son probablemente los picos en su señal, y puede indicar el inicio y el final de la aceleración.

Puede crear una derivada de segundo grado para obtener el mínimo y la aceleración máxima.

+1

Si modelas las cosas de la manera correcta, el filtro de Kalman te dará velocidad y aceleración directamente. –

+0

un buen ejemplo de código para Savitzky-Golay se puede encontrar en http://www.procoders.net/?p=11 – Wouter

+0

SG es trivial de implementar una vez que tenga los coeficientes. Solo usa sgolay de R para encontrarlos. – Paul

9

Se necesita un filtro de suavizado, el más simple sería un "promedio móvil": acaba de calcular la media de la últimos n puntos.

La pregunta aquí es cómo determinar n, ¿puede decirnos más sobre su aplicación?

(hay otros filtros más complicados. Varían de cómo se conservan los datos de entrada. Una buena lista está en Wikipedia)

Editar !: Para 10Hz, se promediarán los últimos 100 valores.

+0

corregido. ¡Gracias! – moogs

+0

¿Podría explicar por qué usar 100 valores para 10Hz? Gracias. –

+0

@Guido: según mi interpretación de lo que dijo, tiene 1000 valores por segundo, pero solo necesita obtener datos 10 veces por segundo. Entonces, una forma simple es tratar 100 valores como uno (obtener el promedio). – moogs

1

Además de los artículos anteriores, eche un vistazo a Catmull-Rom Splines.

+0

Catmull-Roms son excelentes curvas para datos espaciados regularmente, pero tienden a resaltar en lugar de suavizar el ruido. Estaría más tentado de usar splines cúbicos o cuadráticos, aunque no atraviesen todos los puntos de datos. –

0

Además de la excelente respuesta anterior de GvS, también podría considerar suavizar/reducir el efecto de escalonamiento de los resultados promediados usando algún ajuste de curva general como splines cúbicos o cuadráticos.

3

Los promedios móviles son generalmente terribles, pero funcionan bien para el ruido blanco. Ambos promedios móviles & Savitzky-Golay ambos se reducen a una correlación, y por lo tanto son muy rápidos y podrían implementarse en tiempo real. Si necesita información de orden superior como primera y segunda derivadas, SG es una buena opción correcta. La magia de SG radica en los coeficientes de correlación constantes necesarios para el filtro: una vez que ha decidido la longitud y el grado de polinomio para ajustarse localmente, los coeficientes solo se tienen que encontrar una vez. Puede calcularlos usando R (sgolay) o Matlab.

También puede estimar la primera derivada de una señal ruidosa a través de los polinomios de mejor ajuste de Savitzky-Golay (a veces se denominan derivados de Savitzky-Golay) y suele dar una buena estimación de la primera derivada.

El filtrado de Kalman puede ser muy efectivo, pero es más pesado desde el punto de vista computacional: ¡es difícil superar una convolución corta para obtener velocidad!

Paul
Software CenterSpace

Cuestiones relacionadas