Algoritmo para filtrar / normalizar mau sinal
-
20-08-2019 - |
Pergunta
trabalhando em um aplicativo de rastreamento usando GPS. É tudo muito bem, mas às vezes por causa das áreas fechadas ou mau tempo eu recebo pontos imprecisos. Quando você traça-los, ele simplesmente não parece certo, com muitos saltos / pulos.
O algoritmo deve Eu corro para filtrar os sinais de maus Parece que uma aplicação de um algoritmo de indefinição para mim, mas o que você acha?
Solução
Existem algumas opções:
- Jogue fora os valores atípicos
- Filtro
- Use um melhor GPS
- Use uma fonte de dados externa (tirar a estrada)
- combinação dos anteriores
Eu gosto de usar filtros - filtro A Kalman é o típico (e muitas vezes melhor) solução - que utiliza uma quantidade de média preditivo que é melhor do que um IIR barato (Infinito Impulse Response) filtro:
= FilteredValue FilteredValue * 0,75 + 0,25 * NewValue
Você pode obter módulos de GPS que lhe dão 4-5 correções por segundo, o que permitirá que você use o filtro acima 'barata', com tempos de resposta razoáveis.
Você também pode simplesmente obter um melhor GPS (SiRF III ou superior) que não é tão barulhento e tem melhor recepção interior (quando possível).
unidades consumidoras GPS "Snap a estrada", sempre que possível, de modo que os erros fora da estrada não são vistos pelo consumidor, bem como algumas das outras técnicas.
A Kalman não é fácil de implementar, mas sem um conjunto de dados externo ou sensor (tais como velocidade de estrada), é a melhor opção. Confira http://www.google.com/search?q= abrir% 20source% 20kalman% 20filter para código e tutoriais sobre ele.
-Adam
Outras dicas
re: a filtragem na presença de ruído "pop" -
Uma das maneiras mais fáceis que eu encontrei para fazer isso é:
delta = newValue - filteredValue;
delta = delta > LARGEST_SANE_DELTA ? LARGEST_SANE_DELTA
: (delta < -LARGEST_SANE_DELTA ? -LARGEST_SANE_DELTA : delta);
filteredValue += alpha*delta;
em que a = 1 / tau e tau é a constante de tempo do passa-baixo-filtro em questão, expressos em múltiplos do tempo entre repetições do código de cima. O valor LARGEST_SANE_DELTA
representa uma grande alteração possível na newValue
e clipes excessivamente grande variação na entrada. Há, talvez, melhores formas de rejeitar este tipo de ruído, mas eles são mais complicados, e aquele que eu mencionei é bastante simples.
Use Kalman filtro .