Алгоритм фильтрации/нормализации плохого сигнала
-
20-08-2019 - |
Вопрос
Работаю над приложением для отслеживания с использованием GPS.Все бы хорошо, но иногда из-за закрытых территорий или плохой погоды я получаю неточные баллы.Когда вы их рисуете, они выглядят неправильно, с множеством прыжков/прыжков.
Какой алгоритм мне следует запустить, чтобы отфильтровать плохие сигналы, он выглядит как применение размывающегося алгоритма для меня, но что вы думаете?
Решение
Есть несколько вариантов:
- Выбросьте выбросы
- Фильтр
- Используйте лучший GPS
- Использовать внешний источник данных (привязка к дороге)
- Сочетание вышеперечисленного
Мне нравится использовать фильтры. Типичным (и часто лучшим) решением является фильтр Калмана. Он использует такое количество прогнозируемого усреднения, которое лучше, чем дешевый БИХ-фильтр (бесконечная импульсная характеристика):
ФильтрованноеЗначение = ФильтрованноеЗначение * 0,75 + НовоеЗначение * 0,25
Вы можете приобрести модули GPS, которые выдают 4-5 точек в секунду, что позволит вам использовать вышеупомянутый «дешевый» фильтр с разумным временем отклика.
Вы также можете просто приобрести более качественный GPS (SiRF III или лучше), который не такой шумный и имеет лучший прием в помещении (где это возможно).
Бытовые GPS-устройства «привязываются к дороге», где это возможно, поэтому потребитель не видит ошибок за пределами дороги, а также некоторые другие методы.
Кальман непросто реализовать, но без внешнего набора данных или датчиков (например, скорости дороги) это лучший вариант.Проверить http://www.google.com/search?q=open%20source%20kalman%20filter для кода и руководств по нему.
-Адам
Другие советы
ре:фильтрация при наличии «попсового» шума--
Один из самых простых способов, которые я нашел, это:
delta = newValue - filteredValue;
delta = delta > LARGEST_SANE_DELTA ? LARGEST_SANE_DELTA
: (delta < -LARGEST_SANE_DELTA ? -LARGEST_SANE_DELTA : delta);
filteredValue += alpha*delta;
где альфа = 1/тау и тау — постоянная времени рассматриваемого фильтра нижних частот, выраженная в кратных времени между итерациями приведенного выше кода.Значение LARGEST_SANE_DELTA
представляет собой большое возможное изменение в newValue
и отсекает слишком большие различия во входных данных.Возможно, есть более эффективные способы подавления этого типа шума, но они более сложны, а тот, который я упомянул, довольно прост.
Использовать Фильтр Калмана.