Algoritmo per filtrare / normalizzare il segnale negativo
-
20-08-2019 - |
Domanda
Lavorare su un'applicazione di tracciamento tramite GPS. Va tutto bene, ma a volte a causa delle aree chiuse o del maltempo ottengo punti imprecisi. Quando li traccia, non sembra giusto, con molti salti / salti.
Quale algoritmo dovrei eseguire per filtrare i segnali negativi Mi sembra un'applicazione di un algoritmo di sfocatura, ma cosa ne pensi?
Soluzione
Ci sono alcune opzioni:
- Butta via gli outlier
- Filtro
- Utilizza un GPS migliore
- Utilizza un'origine dati esterna (snap to road)
- Combinazione di quanto sopra
Mi piace usare i filtri - Un filtro Kalman è la soluzione tipica (e spesso la migliore) - utilizza una quantità di media predittiva che è migliore di un filtro IIR (Infinite Impulse Response) economico:
FilteredValue = FilteredValue * 0.75 + NewValue * 0.25
Puoi ottenere moduli GPS che ti danno 4-5 correzioni al secondo, che ti permetteranno di usare il filtro 'economico' sopra con tempi di risposta ragionevoli.
Puoi anche semplicemente ottenere un GPS migliore (SiRF III o migliore) che non sia così rumoroso e abbia una migliore ricezione interna (dove possibile).
Unità GPS di consumo " aggancia alla strada " dove possibile, quindi gli errori fuori strada non sono visti dal consumatore, così come alcune delle altre tecniche.
Un Kalman non è facile da implementare, ma senza un set di dati esterno o un sensore (come la velocità della strada), è l'opzione migliore. Consulta http://www.google.com/search?q= apri% 20source% 20kalman% 20filter per il codice e le esercitazioni su di esso.
-Adam
Altri suggerimenti
re: filtraggio in presenza di " pop " rumore -
Uno dei modi più semplici che ho trovato per farlo è:
delta = newValue - filteredValue;
delta = delta > LARGEST_SANE_DELTA ? LARGEST_SANE_DELTA
: (delta < -LARGEST_SANE_DELTA ? -LARGEST_SANE_DELTA : delta);
filteredValue += alpha*delta;
dove alpha = 1 / tau e tau è la costante di tempo del filtro passa-basso in questione, espressa in multipli del tempo tra le iterazioni del codice precedente. Il valore LARGEST_SANE_DELTA
rappresenta una grande modifica possibile in newValue
e ritaglia una variazione eccessivamente grande nell'input. Esistono forse modi migliori per rifiutare questo tipo di rumore, ma sono più complicati e quello che ho citato è piuttosto semplice.
Usa filtro Kalman .