algorithm - ¿Cómo "suavizar" los datos y calcular el gradiente de línea?
curvesmoothing (6)
Estoy leyendo datos de un dispositivo que mide la distancia. Mi frecuencia de muestreo es alta, de modo que puedo medir grandes cambios en la distancia (es decir, velocidad), pero esto significa que, cuando la velocidad es baja, el dispositivo entrega una serie de medidas que son idénticas (debido a la granularidad del dispositivo). Esto da como resultado una curva ''escalonada''.
Lo que necesito hacer es suavizar la curva para calcular la velocidad. Luego de eso, necesito calcular la aceleración.
¿Cómo hacer esto?
(Velocidad de muestreo de hasta 1000 Hz, la tasa de cálculo de 10 Hz estaría bien. Uso de C # en VS2005)
Necesita un filtro de suavizado, el más simple sería un "promedio móvil": simplemente calcule el promedio de los ú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 según cómo conservan los datos de entrada. Una buena lista está en Wikipedia )
¡Edita !: Para 10Hz, promedia los últimos 100 valores.
Podría usar un promedio móvil para suavizar los datos.
Además de los artículos anteriores, eche un vistazo a Catmull-Rom Splines .
Además de la excelente respuesta anterior de GvS, también podría considerar suavizar / reducir el efecto escalonado de los resultados promediados usando algunos ajustes generales de curvas, como splines cúbicos o cuadráticos.
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 tus datos y de la velocidad de procesamiento necesaria.
Promedio 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.
Algoritmo de Savitzky-Golay Fast. 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 conoces la distribución, esto puede darte buenos resultados (se usa 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 debes hacer es detectar el punto inicial y final de la "aceleración". Usted podría hacer esto creando una Derivada 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.
A continuación, puede crear una derivada de segundo grado para obtener el mínimo y la aceleración máxima en sí.
Los promedios móviles son generalmente terribles, pero funcionan bien para el ruido blanco. Tanto los promedios móviles como Savitzky-Golay 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 normalmente proporciona 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!
Pablo
Software CenterSpace