Algorithme pour filtrer / normaliser le mauvais signal
-
20-08-2019 - |
Question
Travailler sur une application de suivi utilisant le GPS. Tout va bien, mais parfois, à cause des zones fermées ou du mauvais temps, j'ai des points inexacts. Lorsque vous les tracez, cela ne semble pas juste, avec beaucoup de sauts / sauts.
Quel algorithme dois-je exécuter pour filtrer les mauvais signaux Cela ressemble à une application d’un algorithme de flou, mais vous en pensez quoi?
La solution
Il y a quelques options:
- Jeter les valeurs aberrantes
- Filtre
- Utilisez un meilleur GPS
- Utiliser une source de données externe (capture sur la route)
- Combinaison de ce qui précède
J'aime utiliser des filtres - Un filtre de Kalman est la solution typique (et souvent la meilleure) - il utilise une quantité de moyenne prédictive meilleure que celle d'un filtre IIR (Infinite Impulse Response) bon marché:
FilteredValue = FilteredValue * 0.75 + NewValue * 0.25
Vous pouvez obtenir des modules GPS qui vous donnent 4 à 5 corrections par seconde, ce qui vous permettra d’utiliser le filtre "économique" ci-dessus avec des temps de réponse raisonnables.
Vous pouvez également obtenir simplement un meilleur GPS (SiRF III ou supérieur) moins bruyant et offrant une meilleure réception à l'intérieur (dans la mesure du possible).
Unités GPS grand public " se caler sur la route " Dans la mesure du possible, le consommateur ne voit donc pas les erreurs sur les routes, ainsi que quelques-unes des autres techniques.
Un Kalman n’est pas facile à mettre en œuvre, mais sans jeu de données externe ni capteur (comme la vitesse de la route), c’est la meilleure option. Découvrez http://www.google.com/search?q= ouvrez% 20source% 20kalman% 20filter pour obtenir du code et des didacticiels.
-Adam
Autres conseils
re: filtrer en présence de & "; pop &"; bruit -
L’une des manières les plus simples que j’ai trouvée de faire ceci est:
delta = newValue - filteredValue;
delta = delta > LARGEST_SANE_DELTA ? LARGEST_SANE_DELTA
: (delta < -LARGEST_SANE_DELTA ? -LARGEST_SANE_DELTA : delta);
filteredValue += alpha*delta;
où alpha = 1 / tau et tau est la constante de temps du filtre passe-bas en question, exprimée en multiples du temps entre les itérations du code ci-dessus. La valeur LARGEST_SANE_DELTA
représente un changement important possible dans newValue
et découpe une variation trop importante en entrée. Il existe peut-être de meilleures façons de rejeter ce type de bruit, mais elles sont plus compliquées et celle que j'ai mentionnée est assez simple.
Utilisez le filtre de Kalman .