Очень не простой фильтр Скользящего среднего..
Добавлено: 02 сен 2025, 23:15
Блок адаптивного фильтра, который использует скользящее среднее с адаптацией под частоту сигнала.
Суть сего творения получение устойчивого (достоверного) значения в условиях когда поток данных имеет постоянные изменения например: ищем номинальное (среднее) давление в пульсирующей среде где обычные фильтры либо не справляются либо привозят к крайне большому времени реакции...
Не думаю что кому-то понадобится но вдруг
Пояснение параметров фильтра, настройки изменяются в секции 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)
Суть сего творения получение устойчивого (достоверного) значения в условиях когда поток данных имеет постоянные изменения например: ищем номинальное (среднее) давление в пульсирующей среде где обычные фильтры либо не справляются либо привозят к крайне большому времени реакции...
Не думаю что кому-то понадобится но вдруг

Пояснение параметров фильтра, настройки изменяются в секции 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)