GyverFilters - библиотека с некоторыми удобными фильтрами для Arduino
- GFilterRA - компактная альтернатива фильтра экспоненциальное бегущее среднее (Running Average)
- GMedian3 - быстрый медианный фильтр 3-го порядка (отсекает выбросы)
- GMedian - медианный фильтр N-го порядка. Порядок настраивается в GyverFilters.h - MEDIAN_FILTER_SIZE
- GABfilter - альфа-бета фильтр (разновидность Калмана для одномерного случая)
- GKalman - упрощённый Калман для одномерного случая (на мой взгляд лучший из фильтров)
- GLinear - линейная аппроксимация методом наименьших квадратов для двух массивов
- FastFilter - быстрый целочисленный экспоненциальный фильтр
- RingAverage - бегущее среднее с кольцевым буфером (не работает для float!)
Основано на уроке по цифровым фильтрам
Совместима со всеми Arduino платформами (используются Arduino-функции)
К библиотеке есть расширенная документация
- Библиотеку можно найти по названию GyverFilters и установить через менеджер библиотек в:
- Arduino IDE
- Arduino IDE v2
- PlatformIO
- Скачать библиотеку .zip архивом для ручной установки:
- Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
- Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
- Распаковать и положить в Документы/Arduino/libraries/
- (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек здесь
- Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
- Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
- Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
// =========== ALPHA-BETTA alfaBeta.h ===========
// период дискретизации (измерений), process variation, noise variation
GABfilter(float delta, float sigma_process, float sigma_noise);
// период дискретизации (измерений), process variation, noise variation
void setParameters(float delta, float sigma_process, float sigma_noise);
// возвращает фильтрованное значение
float filtered(float value);
// ========== FAST FILTER FastFilter.h ==========
FastFilter;
FastFilter(uint8_t k = 20); // коэффициент 0-31, dt 0
FastFilter(uint8_t k = 20, uint16_t dt = 0); // коэффициент 0-31, dt в миллисекундах
void setK(uint8_t k); // коэффициент 0-31
void setDt(uint16_t dt); // установить период фильтрации в мс
void setPass(uint8_t pass); // установить режим пропуска (FF_PASS_MAX / FF_PASS_MIN)
void setRaw(long raw); // установить исходное значение для фильтрации
void setFil(long fil); // установить фильтрованное значение
bool checkPass(long val); // проверка на переполнение
void compute(); // расчёт по таймеру
void computeNow(); // произвести расчёт сейчас
int getFil(); // получить фильтрованное значение
int getRaw(); // получить последнее сырое значение
// =========== SIMPLE KALMAN kalman.h ===========
// разброс измерения, разброс оценки, скорость изменения значений
GKalman(float mea_e, float est_e, float q);
// разброс измерения, скорость изменения значений (разброс измерения принимается равным разбросу оценки)
GKalman(float mea_e, float q);
// разброс измерения, разброс оценки, скорость изменения значений
void setParameters(float mea_e, float est_e, float q);
// разброс измерения, скорость изменения значений (разброс измерения принимается равным разбросу оценки)
void setParameters(float mea_e, float q);
// возвращает фильтрованное значение
float filtered(float value);
// ======== LINEAR APPROXIMATION linear.h =======
GLinear<тип_данных> filter;
void compute(*x_array, *y_array, arrSize); // аппроксимировать
float getA(); // получить коэффициент А
float getB(); // получить коэффициент В
float getDelta(); // получить аппроксимированное изменение
// ============= MEDIAN N median.h ==============
GMedian<порядок, тип_данных> median;
тип_данных filtered(тип_данных value); // получить результат
// ============= MEDIAN 3 median3.h ==============
GMedian3<тип_данных> median;
тип_данных filtered(тип_данных value); // получить результат
// ========= RING AVERAGE RingAverage.h =========
RingAverage<тип_данных, порядок> filter;
// не работает для float!
тип_данных filtered(тип_данных val); // получить результат
float filteredFloat(тип_данных val); // получить результат float
// ====== RUNNING AVERAGE runningAverage.h ======
GFilterRA filter;
GFilterRA(float coef); // установить коэффициент
GFilterRA(float coef, uint16_t interval); // установить коэффициент и период
void setCoef(float coef); // установить коэффициент
void setPeriod(uint16_t interval); // установить период
float filteredTime(float value); // получить результат по таймеру
float filtered(float value); // получить результат сейчас
- v1.6 от 12.11.2019
- v1.7: исправлен GLinear
- v1.8: небольшие улучшения
- v2.0:
- Улучшен и исправлен median и median3
- Улучшен linear
- Смотрите примеры! Использование этих фильтров чуть изменилось
- v2.1: Исправлен расчёт дельты в линейном фильтре
- v2.2: Исправлена ошибка компиляции
- v3.0: Добавлен FastFilter и RingAverage
- v3.1: Оптимизация кода у многих фильтров
- v3.1.1: Исправлена ошибочка
- v3.2: мелкие фиксы, обновлена документация
При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код