Algoritmo para filtrar/normalizar mala señal
-
20-08-2019 - |
Pregunta
Trabajando en una aplicación de rastreo mediante GPS.Todo está bien, pero a veces debido a las áreas cerradas o mal tiempo puedo obtener inexacta puntos.Al trazar ellos, simplemente no se ve bien, con un montón de saltos/saltos.
Qué algoritmo se deben ejecutar para filtrar las malas señales Se ve como una aplicación de un desdibujamiento algoritmo para mí, pero ¿qué crees?
Solución
Hay algunas opciones:
- Desechar los valores atípicos
- Filtro
- Usa un GPS mejor
- Use una fuente de datos externa (ajuste a la carretera)
- Combinación de lo anterior
Me gusta usar filtros: un filtro de Kalman es la solución típica (y a menudo la mejor): utiliza una cantidad de promedio predictivo que es mejor que un filtro IIR (Respuesta de impulso infinito) barato:
FilteredValue = FilteredValue * 0.75 + NewValue * 0.25
Puede obtener módulos GPS que le proporcionan 4-5 arreglos por segundo, lo que le permitirá utilizar el filtro 'barato' anterior con tiempos de respuesta razonables.
También puede simplemente obtener un mejor GPS (SiRF III o mejor) que no sea tan ruidoso y tenga una mejor recepción interior (cuando sea posible).
Unidades GPS de consumo & "; ajuste a la carretera &"; siempre que sea posible, para que el consumidor no vea los errores fuera del camino, así como algunas de las otras técnicas.
Un Kalman no es fácil de implementar, pero sin un conjunto de datos o sensor externo (como la velocidad de la carretera), es la mejor opción. Consulte http://www.google.com/search?q= abra% 20source% 20kalman% 20filter para obtener código y tutoriales sobre él.
-Adam
Otros consejos
re:filtrado en la presencia de "pop" ruido--
Una de las maneras más fáciles que he encontrado para hacer esto es:
delta = newValue - filteredValue;
delta = delta > LARGEST_SANE_DELTA ? LARGEST_SANE_DELTA
: (delta < -LARGEST_SANE_DELTA ? -LARGEST_SANE_DELTA : delta);
filteredValue += alpha*delta;
donde alfa = 1/tau tau y es la constante de tiempo del paso bajo filtro en cuestión, expresada en múltiplos de el tiempo entre iteraciones del código anterior.El valor LARGEST_SANE_DELTA
representa un gran cambio en newValue
y los clips excesivamente amplia variación en la entrada.Quizás hay mejores maneras de rechazar este tipo de ruido, pero son más complicadas, y la que he dicho es bastante simple.
Utilice filtro de Kalman .