Skip to content

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
GyverLibs committed Feb 15, 2022
1 parent 73a7890 commit 67279c4
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 98 deletions.
140 changes: 69 additions & 71 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[![Foo](https://img.shields.io/badge/Version-3.1.1-brightgreen.svg?style=flat-square)](#versions)
[![Foo](https://img.shields.io/badge/Version-3.2-brightgreen.svg?style=flat-square)](#versions)
[![Foo](https://img.shields.io/badge/Website-AlexGyver.ru-blue.svg?style=flat-square)](https://alexgyver.ru/)
[![Foo](https://img.shields.io/badge/%E2%82%BD$%E2%82%AC%20%D0%9D%D0%B0%20%D0%BF%D0%B8%D0%B2%D0%BE-%D1%81%20%D1%80%D1%8B%D0%B1%D0%BA%D0%BE%D0%B9-orange.svg?style=flat-square)](https://alexgyver.ru/support_alex/)

Expand All @@ -13,6 +13,8 @@ GyverFilters - библиотека с некоторыми удобными ф
- FastFilter - быстрый целочисленный экспоненциальный фильтр
- RingAverage - бегущее среднее с кольцевым буфером

Основано на [уроке по цифровым фильтрам](https://alexgyver.ru/lessons/filters/)

### Совместимость
Совместима со всеми Arduino платформами (используются Arduino-функции)

Expand All @@ -21,9 +23,7 @@ GyverFilters - библиотека с некоторыми удобными ф

## Содержание
- [Установка](#install)
- [Инициализация](#init)
- [Использование](#usage)
- [Пример](#example)
- [Версии](#versions)
- [Баги и обратная связь](#feedback)

Expand All @@ -40,86 +40,83 @@ GyverFilters - библиотека с некоторыми удобными ф
- (Arduino IDE) автоматическая установка из .zip: *Скетч/Подключить библиотеку/Добавить .ZIP библиотеку…* и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек [здесь](https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA)

<a id="init"></a>
## Инициализация
См. примеры

<a id="usage"></a>
## Использование
```cpp
// ============== Бегущее среднее ==============
GFilterRA(); // инициализация фильтра
GFilterRA(float coef, uint16_t interval); // расширенная инициализация фильтра (коэффициент, шаг фильтрации)
void setCoef(float coef); // настройка коэффициента фильтрации (0.00 - 1.00). Чем меньше, тем плавнее
void setStep(uint16_t interval); // установка шага фильтрации (мс). Чем меньше, тем резче фильтр

float filteredTime(int16_t value); // возвращает фильтрованное значение с опорой на встроенный таймер
float filtered(int16_t value); // возвращает фильтрованное значение

float filteredTime(float value); // возвращает фильтрованное значение с опорой на встроенный таймер
float filtered(float value); // возвращает фильтрованное значение
// ============== Медиана из трёх ==============
GMedian3(); // инициализация фильтра
uint16_t filtered(uint16_t); // возвращает фильтрованное значение
// ============== Медиана из MEDIAN_FILTER_SIZE (настраивается в GyverFilters.h) ==============
GMedian(); // инициализация фильтра
uint16_t filtered(uint16_t); // возвращает фильтрованное значение
// ============== Альфа-Бета фильтр ==============
// =========== 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);
// период дискретизации (измерений), process variation, noise variation

// возвращает фильтрованное значение
float filtered(float value);

float filtered(float value); // возвращает фильтрованное значение
// ============== Упрощённый Калман ==============
GKalman(float mea_e, float est_e, float q);
// ========== 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 q);
GKalman(float mea_e, float est_e, float q);
// разброс измерения, скорость изменения значений (разброс измерения принимается равным разбросу оценки)
void setParameters(float mea_e, float est_e, float q);
GKalman(float mea_e, float q);

// разброс измерения, разброс оценки, скорость изменения значений
void setParameters(float mea_e, float q);
void setParameters(float mea_e, float est_e, float q);

// разброс измерения, скорость изменения значений (разброс измерения принимается равным разбросу оценки)

float filtered(float value); // возвращает фильтрованное значение
// ============== Линейная аппроксимация ==============
void compute(int *x_array, int *y_array, int arrSize); // аппроксимировать
float getA(); // получить коэффициент А
float getB(); // получить коэффициент В
float getDelta(); // получить аппроксимированное изменение
```
void setParameters(float mea_e, float q);

<a id="example"></a>
## Пример
Остальные примеры смотри в **examples**!
```cpp
/*
Пример использования медианного фильтра.
*/
#include "GyverFilters.h"
// указываем размер окна и тип данных в <>
GMedian<10, int> testFilter;
void setup() {
Serial.begin(9600);
}
void loop() {
delay(80);
int value = analogRead(0);
// добавляем шум "выбросы"
value += random(2) * random(2) * random(-1, 2) * random(50, 250);
Serial.print(value);
Serial.print(',');
value = testFilter.filtered(value);
Serial.println(value);
}
// возвращает фильтрованное значение
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;

тип_данных 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); // получить результат сейчас
```
<a id="versions"></a>
Expand All @@ -136,6 +133,7 @@ void loop() {
- v3.0: Добавлен FastFilter и RingAverage
- v3.1: Оптимизация кода у многих фильтров
- v3.1.1: Исправлена ошибочка
- v3.2: мелкие фиксы, обновлена документация
<a id="feedback"></a>
## Баги и обратная связь
Expand Down
2 changes: 1 addition & 1 deletion keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ FastFilter KEYWORD1

setK KEYWORD2
setCoef KEYWORD2
setStep KEYWORD2
setPeriod KEYWORD2
filteredTime KEYWORD2
filtered KEYWORD2
setParameters KEYWORD2
Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=GyverFilters
version=3.1.1
version=3.2
author=AlexGyver <alex@alexgyver.ru>
maintainer=AlexGyver <alex@alexgyver.ru>
sentence=Library with few filters for data processing
Expand Down
1 change: 1 addition & 0 deletions src/GyverFilters.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
v3.0: Добавлен FastFilter и RingAverage
v3.1: Оптимизация кода у многих фильтров
v3.1.1: Исправлена ошибочка
v3.2: мелкие фиксы, обновлена документация
*/

#ifndef _GyverFilters_h
Expand Down
16 changes: 8 additions & 8 deletions src/filters/FastFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
class FastFilter {
public:
// коэффициент 0-31
FastFilter(uint8_t k = 20, int dt = 0) {
FastFilter(uint8_t k = 20, uint16_t dt = 0) {
setK(k);
setDt(dt);
}
Expand All @@ -21,7 +21,7 @@ class FastFilter {
}

// установить период фильтрации
void setDt(int dt) {
void setDt(uint16_t dt) {
_dt = dt;
}

Expand All @@ -31,17 +31,17 @@ class FastFilter {
}

// установить исходное значение для фильтрации
void setRaw(int raw) {
void setRaw(long raw) {
_raw = raw;
}

// установить фильтрованное значение
void setFil(int fil) {
void setFil(long fil) {
_raw_f = fil;
}

// проверка на переполнение
bool checkPass(int val) {
bool checkPass(long val) {
if (_pass == FF_PASS_MAX && val > _raw_f) {
_raw_f = val;
return 1;
Expand All @@ -62,7 +62,7 @@ class FastFilter {

// произвести расчёт сейчас
void computeNow() {
_raw_f = (_k1 * _raw_f + _k2 * _raw) >> 5;
_raw_f = ((long)_k1 * _raw_f + _k2 * _raw) >> 5;
}

// получить фильтрованное значение
Expand All @@ -77,9 +77,9 @@ class FastFilter {

private:
uint32_t _tmr = 0;
int _dt = 0;
uint16_t _dt = 0;
uint8_t _k1 = 20, _k2 = 12;
uint8_t _pass = 0;
int _raw_f = 0, _raw = 0;
long _raw_f = 0, _raw = 0;
};
#endif
27 changes: 10 additions & 17 deletions src/filters/runningAverage.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class GFilterRA {
public:
GFilterRA(){}

GFilterRA(float coef, int interval) {
GFilterRA(float coef, uint16_t interval) {
_coef = coef;
_prd = interval;
}
Expand All @@ -20,37 +20,30 @@ class GFilterRA {
_coef = coef;
}

void setStep(int interval) {
void setPeriod(uint16_t interval) {
_prd = interval;
}

float filteredTime(int value) {
if (millis() - _tmr >= _prd) {
_tmr = millis();
filtered(value);
}
return _fil;
}

float filteredTime(float value) {
if (millis() - _tmr >= _prd) {
_tmr = millis();
_tmr += _prd;
filtered(value);
}
return _fil;
}

float filtered(int value) {
return _fil += (float)(value - _fil) * _coef;
}

float filtered(float value) {
return _fil += (float)(value - _fil) * _coef;
return _fil += (value - _fil) * _coef;
}

//
void setStep(uint16_t interval) {
_prd = interval;
}

private:
float _coef = 0.0, _fil = 0.0;
uint32_t _tmr = 0;
int _prd = 0;
uint16_t _prd = 0;
};
#endif

0 comments on commit 67279c4

Please sign in to comment.