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

Пользовательские блоки дополняющие возможности стандартных блоков из разделов Математика и Алгебра, а так-же различные цифровые фильтры
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Ответить
VNL64T
Рядовой
Сообщения: 66
Зарегистрирован: 22 янв 2024, 05:37
Имя: Алекс
Благодарил (а): 3 раза
Поблагодарили: 14 раз

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

Сообщение 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)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
WildCat
Лейтенант
Сообщения: 566
Зарегистрирован: 04 июн 2022, 04:14
Имя: Михаил
Благодарил (а): 13 раз
Поблагодарили: 28 раз

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

Сообщение WildCat »

Отличный фильтр! (По описанию). И описание отличное.

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

А есть графическая интерпретация работы этого фильтра?
VNL64T
Рядовой
Сообщения: 66
Зарегистрирован: 22 янв 2024, 05:37
Имя: Алекс
Благодарил (а): 3 раза
Поблагодарили: 14 раз

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

Сообщение VNL64T »

К сожалению даже не знаю как это делают(про графику),
Блок возможно сыроват, пока сам пытаюсь подстроиться к своей задаче, а между отвлекаюсь на другое и как мочало начинай с начало.. собственно описание писал для себя что бы не забыть :smile44:
WildCat
Лейтенант
Сообщения: 566
Зарегистрирован: 04 июн 2022, 04:14
Имя: Михаил
Благодарил (а): 13 раз
Поблагодарили: 28 раз

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

Сообщение WildCat »

Вот, например.
Пишется таблица сырых данных и данных после работы фильтра.
Я писал на SD карту, затем анализировал работу фильтра.
Скриншот 02-09-2025 234818.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
VNL64T
Рядовой
Сообщения: 66
Зарегистрирован: 22 янв 2024, 05:37
Имя: Алекс
Благодарил (а): 3 раза
Поблагодарили: 14 раз

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

Сообщение VNL64T »

Здорово несомненно, но увы пока у меня метод научного тыка в основном..
Ответить

Вернуться в «Блоки для рассчетов и цифровые фильтры»

Кто сейчас на конференции

Сейчас этот форум просматривают: Zhihar и 1 гость