Основы сглаживания и фильтрации данных: экспоненциальное среднее.

Продолжаем заметки для любознательных коптероводов, которые хотят понимать чуть больше, чем требуется для сборки и полетов.

Итак сегодня:

  • Зачем нужна фильтрация, и что она делает.
  • Простейший экспоненциальный фильтр, вывод его формулы «на пальцах».
  • Почему нельзя отфильтровать сильные вибрации.
  • Интерактивный пример фильтрации с возможностью покрутить алгоритм в руках.

Поехали!

Нетерпеливые могут сразу перейти к интерактивной части.
Фильтрация показаний датчиков, в отличие от ПИД-регуляторов, сидит «глубоко» и рядовые пользователи с ней не сталкиваются. Но на самом деле ей напичкан буквально весь контроллер. Взять, например, барометр. Он измеряет атмосферное давление, по которому можно вычислять высоту относительно точки взлета. Но у любого барометра есть своя погрешность. Кроме нее на показания датчика влияют различные внешние факторы: порывы ветра, вибрации и т.п. В результате програма полетного контроллера получает не фактическую высоту, а измеренную, которая каждый раз отличается от фактической на какую-то случайную погрешность:

Данные до фильтрации

Измерения происходят много раз в секунду, и постоянные «скачки» высоты приведут к тому, что квадрокоптер будет компенсировать смещения, которых на самом деле нет. Здесь и прихоидт на помощь фильтрация, которая «сглаживает» показания датчика:

Фильтрация данных

Фильтр, в простейшем случае — математический алгоритм этого «сглаживания». На вход этого алгоритма поступают измеренные значения чего-либо, а на выходе у него — сглаженные значения. Таких механизмов существует великое множество. У каждого есть свой принцип работы и область применения. Например, можно брать среднее арифметическое по нескольким последним измерениям. В таком случае настраиваемым параметром фильтра будет, так называемое, локальное окно — количество последних измерений, которые участвуют в усреднении для получения текущего значения. Например, четыре:

среднее арифметическое. Локальное окно = 4

X большое t

— результат фильтрации на текущий момент времени t.

x малое t

— измеренное значение на текущий момент времени t.

x малое t-1

— значение величины, измеренное на предыдущей итерации.

Обобщенная формула для локального окна n:

Общая формула среднего с локальным окном равным n

Не вдаваясь в подробности можно сказать, что недостатками такого подхода будут:

  1. Необходимость хранения в памяти вычислительного устройства нескольких последних значений.
  2. На выход фильтра одинаково влияют все измеренные значения внутри локального окна. Т.е. влияние более старых значений такое же, как влияние самого последнего.

К формуле экспоненциального среднего приводят попытки исправить эти два пункта. Пусть, сначала, самое «свежее» измеренное значение влияет, например, на 2/3, а предыдущее влияет только на 1/3:

взвешенное среднее для двух элементов

Выглядит немного странно: как быть, если локальное окно нужно увеличить? Ведь «усреднение» только по двум последним измерениям, в большинстве случаев, будет слишком подвержено скачкам из-за случайных погрешностей. Если заменить предыдущее измеренное значение на предыдущее уже «отфильтрованное», то будет уже теплее:

экспоненциальный фильтр для альфа = 2/3

Но самое свежее измеренное значение все еще очень сильно влияет на результат: любой случайный выброс приведет к резкому скачку. Можно ослабить это влияние:

экспоненциальный фильтр для альфа = 1/100

А еще лучше ввести настраиваемый параметр «альфа», который больше нуля, но меньше единицы:

экспоненциальный фильтр

Это и есть экспоненциальный фильтр. Чем меньше альфа, тем более гладким будет результат. Два крайних случая: альфа равно нулю и альфа равно единице. В первом случае фильтр вообще не зависит от измеренных значений, т.е. он очень-очень гладкий. Во втором случае результат в точности равен последнему измеренному значению, т.е. фильтрация в принципе не происходит. Экспоненциальный фильтр — комбинация этих двух крайностей с настраиваемой пропорцией.


Пришла пора пощупать такую фильтрацию своими руками. В программке ниже красная линия — фактическая величина. Черные точки — измеренные значения фактической величины, которые имеют некоторую погрешность «error». Зеленая линия — результат работы фильтра. Настраиваемый параметр «aльфа» можно менять вертикальным ползунком справа.


При альфа близких к единице фильтрация почти не осуществляется: на результат в большей степени влияет только последнее измерение. При уменьшении альфа можно наблюдать, как зеленая линия становится плавнее. Но с ростом плавности растет и запаздывание зеленой линии от красной. Это называется сдвигом фазы. Чем сильнее фильтрация, тем сильнее сдвиг фазы. И здесь всегда приходится искать золотую середину: достаточно гладкий результат, и при этом достаточно маленький сдвиг фазы. Но погрешность измерения может быть слишком высокой, и тогда желаемого компромисса не достичь. В этом легко убедиться, если выставить error = 1: погрешность станет сравнима со значимыми изменениями фактической величины.

Похожим свойством обладает и механическое демпфирование. Хоть этот процесс гораздо сложнее из-за собственных частот, физических свойств демпферов, но аналогию с экспоненциальным фильтром провести можно: чем мягче демпфер (меньше альфа), тем больше гасится вибраций, но, при этом можно пропустить и значимые изменения системы.

Всем хорошей фильтрации! До новых коптервстреч!

один комментарий к записи

  1. Ai в данной точке ряда i, прогноз в точке ряда Fi некоторый заранее заданный коэффициент сглаживания W, постоянный по всему ряду.

Добавить комментарий