Фильтрация датчиков ардуино

Фильтр низких частот

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

  • аппаратные и программные;
  • цифровые и аналоговые;
  • линейные и нелинейные;
  • фильтры средних, низких и высоких частот;
  • и т.п.

В этой статье мы рассмотрим один из самых распространенных электронных фильтров — фильтр низких частот (ФНЧ, low pass filter), а точнее — его программную реализацию. Применительно к робототехнике, данный тип фильтров используется для сглаживания показаний различных датчиков и сигналов управления.

Шум переменного резистора

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

Здесь, по оси абсцисс отсчитывается время, а по оси ординат показания 10-разрядного АЦП, к которому подключен потенциометр. Проблема в том, что как бы мы плавно не поворачивали ручку переменного резистора, сигнал получаемый микроконтроллером будет всё время колебаться. Видно, что график не плавный, на нём имеются «зубчики».

Это объясняется двумя причинами. Во-первых, во время движения центрального контакта переменного резистора по поверхности резистивного материала
возникает такое явление как «дребезг контактов». Во-вторых, человек в принципе существо «дрожащее», и любое его движение вызывает вибрацию.

Кроме того, даже когда ручка прибора не поворачивается, наблюдаются небольшие колебания сигнала. Это — результат воздействия различных наводок в цепи между АЦП и датчиком. На рисунке ниже зафиксированы именно такие наводки.

Фильтр низких частот

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

pot = (1-K)*pot + K*pot_raw

Здесь pot — обработанный фильтром сигнал, pot_raw — значение на аналоговом входе контроллера, и наконец K — коэффициент фильтра, который варьируется от 0,0 до 1,0.

Коэффициент K определяет, какие колебания считаются слишком высокими и требуют подавления, а какие следует пропустить с минимальными изменениями. Чем больше K, тем слабее фильтр, и тем более высокие колебания он может пропустить. Ниже представлен результат работы фильтра для K = 0,1.

Легко заметить, что при K = 0,1 фильтрованный сигнал не имеет шума. Но как понять, какую величину K нам следует использовать?

Подбор коэффициента фильтра

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

где t — период времени, который отделяет слишком быстрые изменения от требуемых; dt — время итерации.

Например, если в нашем случае с потенциометром, K = 0,1, а время между двумя измерениями dt = 20 мс, то время t = (1-0.1) * 0,02 / 0.1 = 0,18 сек. То есть все изменения сигнала, которые длятся меньше 0,18 секунд будут подавляться. Во втором случае (при K = 0,3), мы получим t = 0,047 сек.

Второй смысл времени t заключается в том, что обработанный фильтром сигнал будет отставать от исходного на это время. Ниже на графике это отставание хорошо заметно.

На практике, переменные резисторы имеет смысл фильтровать с коэффициентом K от 0,1 до 0.3.

Пример программы для применения ФНЧ к сигналу переменного резистора

Напишем программу для Ардуино, которая будет считывать сигнал переменного резистора и накладывать на него ФНЧ с коэффициентом K = 0,1.

Фильтрация сигнала акселерометра

Еще одним удачным примером использования ФНЧ может служить обработка сигнала акселерометра. Ниже представлены графики показаний акселерометра с применением фильтр и без, для разных K.

Источники шумов у акселерометра, отличаются от источников шума в цепи переменного резистора. Дело в том, что акселерометр регистрирует ускорение прибора, не различая, что явилось его причиной: сила гравитации или внешняя сила приложенная к датчику. Другими словами, если датчик находится в покое, то на него воздействует только сила гравитации, и мы легко узнаем углы наклона датчика относительно поверхности земли. Но если, например, датчик повернуть рукой вокруг одной оси, на него, кроме гравитации, подействует внешний момент силы, что приведет к ошибкам при расчете углов наклона. Другой источник шума — вибрация от двигателей, например, квадрокоптера.

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

К размышлению

Фильтр низких частот отлично помогает, когда необходимо очистить нужный нам сигнал от высокочастотных помех. Примером таких помех может быть шум от наводок или вибрации, наложенный на сигнал от переменного резистора. Другой пример — вибрация поверх сигнала акселерометра или гироскопа.

Главное при работе с ФНЧ — правильно подобрать коэффициент K. Необходимо чтобы сигнал не имел слишком большой задержки с одной стороны, и достаточно хорошо сглаживал сигнал — с другой.

В одной из следующих статей мы расскажем об аппаратном фильтре низких частот, который не требует контроллера.

Источник

jeroendoggen/Arduino-signal-filtering-library

Use Git or checkout with SVN using the web URL.

Work fast with our official CLI. Learn more.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Arduino Signal Filtering Library

The goals of this project is providing an Arduino library for basic signal filtering. These filters can be used to clean up noisy signals by suppressing small (fast) signal changes while passing bigger (slow) signal changes. This is typically done by suppressing the «higher frequency» fluctuations.

  • Information about the filters
  • [Free ebook: «The Scientist and Engineer’s Guide to Digital Signal Processing»] (http://www.dspguide.com)
  • Interactive digital filter design website
  • Low pass filters: Chebychev and Bessel (1st and 2nd order)
  • Median filter
  • Download the source
  • Place the Filter folder in your Arduino1.0+ «libraries» folder
  • Open example sketch: «file», «Examples», «SignalFilter», «Bessel» (or any other example)
  • Connect a (noisy) analog sensor to port A0
  • Compile & upload code
  • Original and filtered sensor data should be arriving over the serial port

This library is partially based on filters that are auto-generated on the filtuino website. Filtuino is a Filter Suite that generates source code for different digital filters (IIR Lowpass, Highpass, Bandpass, Bandstop, IIR Resonanz Filter, Proportional Integral Filter).

Customizing the filters

If you want create your own filter, I suggest you:

Источник

Фильтрация шума сигнала

Фильтрация шума очень важная вещь, при работе с различными датчиками. Сигнал, получаемый от них всегда приходит с шумами, и важно уметь их грамотно отфильтровать. Качественная фильтрация шума способна уменьшить погрешность и увеличить качество измерения датчика. Этим мы сегодня и займемся.

Примерами будут три графика — синусоида, квадратный сигнал (или дискретный, или цифровой) и треугольный сигнал (или пилообразный).

Код для вывода графиков

Бороться мы будем с двумя видами шума: постоянный шум (аддитивный белый гауссовский шум или АБГШ) с относительно стабильной амплитудой и случайные импульсы, вызванные внешними факторами. Амплитудой шума — стандартное отклонение зашумленного сигнала от не зашумленного.

Симулировать это мы будем данным образом.

Функция для добавление шума

Среднее арифметическое

Как по мне, самый очевидный способ минимизировать шум. Для его реализации потребуется ввести буфер нескольких предыдущих значений, каждый раз, когда опрашивается датчик буфер сдвигается (первый элемент удаляется, а новое значение датчика добавляется в конец или как-нибудь по другому, главное фиксированный размер буфера). От его размера и будет зависеть результат и быстродействие кода. С фильтрацией алгоритм справляется очень неплохо. Но его проблема заключается в производительности. Контроллеру приходится делать множество вычислений с плавающей точкой, что может сказаться на скорости выполнения кода. Но если датчик не следует очень часто опрашивать, то этот метод отлично подойдет.

Код фильтрация графика средним арифметическим

Как мы видим, при увеличении буфера квадратный и треугольный сигналы сильно исказились, а синусоида сместилась. Проявляется запаздывание среднего значения. Так что, при использовании данного фильтра стоит аккуратнее подбирать размер буфера.

Медианный фильтр

Медианный фильтр предназначен справляться со случайными импульсами. Если среднее арифметическое получая на вход (10, 12, 55), выдаст 25.67, то медиан выдаст 12. На первый взгляд не так просто понять как он устроен, но со своей задачей он справляется отлично. На просторах интернета я нашел лаконичное исполнение. Но оно подойдет только в случаях когда длительность импульса не более одного шага, иначе придется использовать другое исполнение медианы высшего порядка.

Код медианного фильтра

Медианный фильтр справился почти со всеми импульсами. К тому же этот алгоритм совершенно прост в вычислении. И используя его в комбинации с каким-либо другим другим фильтром можно получить максимальный результат.

Экспоненциальное бегущее среднее и адаптивный коэффициент

Этот фильтр по своей сути схож с первым, а главное он более простой по вычислениям. Работает он так: к предыдущему фильтрованному значению прибавляется новое, и каждое из них помножено на собственный коэффициент, сумма которых равна 1. Коэффициент k подбирается от 0 до 1 и означает важность нового значения по сравнению с предыдущем, то есть чем больше k, тем больше важность нового нефильтрованного значения и фильтрованный график ближе к изначальному.

Адаптивный коэффициент нужен для корректной фильтрации квадратных сигналов. Реализуется он в одну строчку и означает, что если предыдущее фильтрованное значение слишком далеко от нового (то есть корректный сигнал изменился), то k увеличиваем чтобы момент смены сигнала был четко виден, а иначе k оставляем нормальным.

Код фильтра экспоненциального бегущего среднего с адаптивным коэффициент

Работает достаточно хорошо, но из-за адаптивного коэффициента появляются некие артефакты в моментах с импульсами, так как они достаточно велики, чтобы определиться как составляющие квадратного сигнала. С этим можно бороться, увеличивая параметр d (требуемое расстояние для определения квадратного сигнала), но есть решение элегантнее. И тут нам как раз нам потребуется медианный фильтр. Если перед подачей данных на бегущее среднее, прогнать их через медиану, то можно получить качественный и быстродейственный алгоритм для фильтрации сигнала.

с использованием медианного фильтра

Все артефакты исчезли. Данная связка алгоритмов является одной из самых эффективных и быстродейственных. Она может быть применена практически везде.

Применение связки фильтров

Фильтр Калмана

Еще один фильтр, принцип работы которого не столь очевиден для каждого. Из всего кода необходимо знать, что r — это приблизительная амплитуда шума, а q — ковариационное значение процесса, и его следует подбирать самостоятельно. Если вы хотите разобраться в устройстве фильтра Калмана поподробнее, можете прочитать эту статью с википедии, а код я взял и отредактировал с этой страницы.

Код фильтра Калмана

Со своей задачей фильтр справляется, но он не всегда подойдет из-за множества вычислений с плавающей точкой.

Какой фильтр выбрать?

Это зависит от обстоятельств в которых фильтр будет использоваться. Естественно стоит попробовать каждый, но практически для каждого случая подойдёт вариант №2 из списка ниже. Напомню, что наиболее выгодная связка — медианного фильтра с другим. Пройдемся вкратце по перечисленным фильтрам из данной статьи:

Медианный фильтр — самый быстродейственный алгоритм, применятся для отсеивания случайных импульсов, наиболее эффективен в связках с другими алгоритмами.

Экспоненциальное бегущее среднее с адаптивным коэффициент — универсальный, и простой фильтр, подойдет в большинстве ситуаций

Среднее арифметическое — эффективный, но не всегда столь быстродейственный алгоритм

Фильтр Калмана — универсальный способ фильтрации любого сигнала, но громоздкий по вычислениям

Кстати, если вы работаете со средой arduino, то там присутствует удобный инструмент визуализации графиков из значений переданных в порт, статья об этом. Это может упростить работу с сигналами.

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

И на последок исходники кодов, и еще несколько примеров.

Код для визуализация графиков

Ещё интересный эксперимент: я построчно загрузил зашумленную картинку своего кота и пропустил её через фильтр Калмана.

Источник

Adblock
detector