Страница 1 из 1

Очень не простой фильтр Скользящего среднего..

Добавлено: 02 сен 2025, 23:15
VNL64T
Блок адаптивного фильтра, который использует скользящее среднее с адаптацией под частоту сигнала.

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

Не думаю что кому-то понадобится но вдруг :smile37:

Пояснение параметров фильтра, настройки изменяются в секции Declare..

Основные параметры фильтра
const int MAX_BUFFER_SIZE = 500;
Пояснение: Максимальный размер буфера (количество ячеек) для хранения данных.
Влияние на выходные данные:
Большее значение = более плавный выходной сигнал, но большее запаздывание (Обеспечивает более эффективное подавление низкочастотных пульсаций но Увеличивает потребление оперативной памяти)
Максимум 200 для Arduino Nano ( для других зависит от доступной памяти)

const int MIN_BUFFER_SIZE = 10;
Пояснение: Минимальный размер буфера (количество ячеек).
Влияние на выходные данные:
Меньшее значение = более быстрая реакция на изменения, но менее сглаженный сигнал
Определяет нижний предел сглаживания (Предотвращает слишком резкие изменения выходного сигнала)
Рекомендуется: 5-20 в зависимости от требуемой скорости реакции

const int MIN_SAMPLE_RATE_MS = 1;
Пояснение: Минимальный интервал (Скорость заполнения) между измерениями (в миллисекундах).
Влияние на выходные данные:
Меньшее значение = более частый опрос = больше данных для обработки
Необходимо для корректного захвата высокочастотных пульсаций (до 100 Гц) но Увеличивает нагрузку на процессор
1 мс = 1000 Гц (теоретически достаточно для частот до 500 Гц)

const int MAX_SAMPLE_RATE_MS = 50;
Пояснение: Максимальный интервал (Скорость заполнения) между измерениями (в миллисекундах).
Влияние на выходные данные:
Большее значение = меньше нагрузка на процессор
Подходит для низкочастотных пульсаций но Может привести к потере быстрых изменений сигнала
50 мс = 20 Гц (достаточно для частот до 10 Гц)

const int FREQ_CALC_INTERVAL_MS = 300;
Пояснение: Интервал пересчета частоты пульсаций (в миллисекундах).
Влияние на выходные данные:
Большее значение = более стабильные параметры фильтра, но медленная адаптация
Меньшее значение = быстрая адаптация, но возможна "дрожь" параметров
Определяет, как часто фильтр подстраивается под изменения частоты

(Параметры контроля плавности)

const int SMOOTHING_FACTOR = 3;
Пояснение: Коэффициент сглаживания (количество периодов для усреднения).
Влияние на выходные данные:
Большее значение = более плавный выходной сигнал
Определяет, сколько периодов пульсаций усредняется (3 = усреднение за 3 периода)
Рекомендуется: 2-5 (2 для быстрой реакции, 5 для максимального сглаживания)

const int BUFFER_RESIZE_THRESHOLD = 3;
Пояснение: Порог для изменения размера буфера (количество ячеек).
Влияние на выходные данные:
Большее значение = реже изменяется размер буфера = более стабильная работа
Меньшее значение = чаще изменяется размер буфера = быстрее адаптация
Предотвращает слишком частые изменения размера буфера

const int RATE_CHANGE_THRESHOLD = 2;
Пояснение: Порог для изменения частоты опроса.
Влияние на выходные данные:
Большее значение = реже изменяется частота опроса = более стабильная работа
Меньшее значение = чаще изменяется частота опроса = быстрее адаптация
Предотвращает слишком частые изменения частоты дискретизации

const float MOVING_AVG_ALPHA = 0.05;
Пояснение: Коэффициент сглаживания для детектора частоты.
Влияние на выходные данные:
Меньшее значение (0.01-0.05) = более плавное определение частоты, но медленная реакция
Большее значение (0.08-0.1) = более быстрое определение частоты, но возможны ложные срабатывания
Определяет, как быстро детектор частоты реагирует на изменения

Пример оптимизации параметров для разных сценариев
Для максимальной плавности:
Увеличить MAX_BUFFER_SIZE (500-1000)
Увеличить SMOOTHING_FACTOR (4-5)
Увеличить FREQ_CALC_INTERVAL_MS (400-500)
Уменьшить MOVING_AVG_ALPHA (0.01-0.02)

Для максимальной скорости реакции:
Уменьшить MIN_BUFFER_SIZE (5-8)
Уменьшить SMOOTHING_FACTOR (2)
Уменьшить FREQ_CALC_INTERVAL_MS (100-200)
Увеличить MOVING_AVG_ALPHA (0.08-0.1)

Для минимальной нагрузки на процессор:
Увеличить MIN_SAMPLE_RATE_MS (5-10)
Увеличить MAX_SAMPLE_RATE_MS (50-100)
Увеличить FREQ_CALC_INTERVAL_MS (500-1000)
Увеличить BUFFER_RESIZE_THRESHOLD (5-10)

Re: Очень не простой фильтр Скользящего среднего..

Добавлено: 02 сен 2025, 23:38
WildCat
Отличный фильтр! (По описанию). И описание отличное.

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

А есть графическая интерпретация работы этого фильтра?

Re: Очень не простой фильтр Скользящего среднего..

Добавлено: 02 сен 2025, 23:44
VNL64T
К сожалению даже не знаю как это делают(про графику),
Блок возможно сыроват, пока сам пытаюсь подстроиться к своей задаче, а между отвлекаюсь на другое и как мочало начинай с начало.. собственно описание писал для себя что бы не забыть :smile44:

Re: Очень не простой фильтр Скользящего среднего..

Добавлено: 02 сен 2025, 23:49
WildCat
Вот, например.
Пишется таблица сырых данных и данных после работы фильтра.
Я писал на SD карту, затем анализировал работу фильтра.
Скриншот 02-09-2025 234818.jpg

Re: Очень не простой фильтр Скользящего среднего..

Добавлено: 02 сен 2025, 23:54
VNL64T
Здорово несомненно, но увы пока у меня метод научного тыка в основном..

Re: Очень не простой фильтр Скользящего среднего..

Добавлено: 04 сен 2025, 16:15
nickass
Спасибо. Думаю для моей задачи подойдет. Делаю индикатор уровня газа ГБО автомобиля с графическим дисплеем ST7789. Сигнал берется с резистивного датчика уровня (поплавка). Для большей информативности и стабильности показаний опробую этот фильтр. Описание шикарное. Еще раз, спасибо автору.