Скользящая средняя, скользящее среднее (англ. moving averageMA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания краткосрочных колебаний и выделения основных тенденций или циклов. Математически скользящее среднее является одним из видов свёртки (определение с вики).

А теперь конкретно о получении среднего значения.

Для чего это необходимо? Если вы выполняете, например, аналоговые измерения, то очень редко можно получить данные без, так называемого шума. Получая данные необходимо отфильтровать шум и получить реально действующее значение параметра. Для этого применяют среднее значение.


Вычисление среднего.

Как работает вычисление среднего знают все. Для вычисления среднего надо взять N измерений (т.е. взять несколько раз, 5-10-20), затем суммировать и разделить на N (на 5-10-20).

Т.е. выполняются последовательно N измерений, за заданное время, после чего всё суммируется и делиться на N полученное значение и есть средняя величина измеряемого параметра.

Недостатком такого вычисление среднего является, то, что для “стабилизации” показаний нужно делать иногда очень много измерений, что естественно приводит к торможению всего процесса изменения. Более того буфер большего объема сжирает память микроконтроллера, что не всегда есть хорошо. Тут и возникает проблема, как бы быстрее измерять, с меньшими ресурсами и получить “стабильные” показания.


Скользящее среднее.

Для этого придумали так называемое скользящее среднее, как это формулах и в математике описывать не будем, тут главное понять сам смысл. Для вычисления скользящего среднего нам так же понадобиться БУФЕР, но естественно на порядок меньшего размера, чем для вычисления обычного математического среднего. Берется отдельно параметр СУММА, который содержит общую сумму данных в буфере, а также мы имеем параметр УКАЗАТЕЛЬ, который будет показывать, с каким данными в буфере выполняются вычисления.

Простое скользящее среднее работает, так:

  1. При получении измерения, мы из параметра СУММА вычитаем значение параметра из БУФЕРА на который указывает УКАЗАТЕЛЬ.
  2. Полученный параметр, текущего измерения, записываем на место в БУФЕР на который указывает УКАЗАТЕЛЬ.
  3. Увеличиваем указатель и проверяем достиг ли он конца БУФЕРА если достиг устанавливаем его в начало.
  4. К параметру СУММА прибавляем текущее измерение, а для получения усредненного значения, делим на размер нашего буфера.

 


Как это все будет выглядеть в Си.

Опишем саму структуру буфера:

Также не забудем про константы, тут мы должны указать сколько нам таких фильтров нужно и какая глубина фильтра.

И сама функция вычисления скользящего среднего.

Как все это применять. Например, можно в прерывания АЦП вставить строку с функцией или вставить её в основном цикле работы программы:

В ней данные с АЦП обрабатываются в фильтре с номером 0. И помещаются в буфер отфильтрованных данных, которые можно в дальнейшем использовать для анализа работы или регулировки процесса.


Проблема медленно изменяющего параметра.

Когда параметр медленно изменяется, то в момент дискретизация когда значения находиться межу цифрами, мы можем видеть, то одно, то другое значение. Например, вы сделали спидометр и когда скорость медленно меняется, мы видим “то 7, то 8” и такое “блыманье” часто раздражает. Это можно устранить увеличив глубину фильтра вычисляющего среднее значение, но это приведет так называемой нежелательной “интеграции” параметра визуализации, например скорость уже 100, а показания спидометра медлен нарастают еще несколько секунд. Или вы уже остановись а спидометр еще “Едет”.

Частенько такую проблему решают дискретностью вывода параметра на индикатор, например раз в секунду. На многих индикаторах  (регуляторах) температуры, часто есть такой параметрах, который разрешает обновлять индикация, например, 1 раз в минуту, но это не всегда удобно и практично, а часто и неприемлемо.

Для этого я применяю такой прием, я для него придумал название итерационный фильтр. Суть заключается в том, что поступившие данные сравниваются с предыдущим значением и если значения равны, то счетчик итераций обнуляется. Если же не равны, то начинает работать счетчик итераций и когда достигает заданного значения, новые данные заменяют место старых. Для устранения влияния на работу на больших изменениях параметра, вводиться понятие порога, выше которого данный фильтр неактивен.

Структура данных для фильтра имеет следующий вид:

Для его работы нужны две функции, инициализации (задания параметров) и сам фильтр.

Использовать следующим образом, сначала инициализация:

Затем в рабочем цикле (или в прерываниях процесса измерения) вставляем фильтр:


Библиотека с расширенными параметрами, описание в комментах. В этой библиотеке есть расширение которое позволяет использовать скользящее среднее с изменяемыми параметрами в программе, только не забудьте при изменении глубины фильтра необходимо инициализировать указатель, сумму и сам буфер обнулить!!! (смотри описание в библиотеке).


Это может быть интересно


  • Проект с использованием MCC часть 12-2Проект с использованием MCC часть 12-2
    Настало время для изучения шины I2C. Изучать будем на примере работы с индикатором RET012864E. Что изменили со старой схемы: В прошлой теме я затупил и не добавил подтягивающие резисторы которые необходимы …
  • MPLAB® Harmony – или как это просто! Часть 4.MPLAB® Harmony – или как это просто! Часть 4.
    Часть четвертая – это может показаться немного сложно. Структура проекта. Для облегчения конфигурирования проекты MPLAB Harmony обычно структурированы таким образом, чтобы изолировать код, необходимый для настройки «системы», от кода библиотеки …
  • USB K-L-line адаптерUSB K-L-line адаптер
    USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели разработанной печатной …
  • Регулятор влажностиРегулятор влажности
    Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно использовать аналоговые …
  • MPLAB® Harmony – или как это просто! Часть 2.MPLAB® Harmony – или как это просто! Часть 2.
    Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из трудоемкого варианта …
  • Инфракрасный датчик движения, PIR-sensorИнфракрасный датчик движения, PIR-sensor
    Домашняя автоматика предполагает наличие датчиков движения, которые способны контролировать движения человека. Самым простым и доступным устройством позволяющие контролировать изменения ИК-излучения, это ПИР-сенсоры. На текущий момент доступны не дорогие модели D203B, D204B, D205B. Все они позволяют …
  • LED модуль P10C4V12LED модуль P10C4V12
    LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость панелей легко …
  • Регулятор влажности ch-3800Регулятор влажности ch-3800
      И еще один проект на плате ch-c3xxx –  универсальный регулятор влажности ch-3800. Регулятор позволяет работать как в режиме индикатора влажности, так и в режиме регулятора. Рабочий диапазон измеряемой относительной …
  • CCP – модуль в режиме Compare на примере PIC18CCP – модуль в режиме Compare на примере PIC18
    CCP – модуль можно использовать в трех режимах: Capture – позволяет захватывать входной сигнал и определять его параметры (длительность или частоту). Дополнительно управлять внутренними модулями. Compare –  позволяет формировать импульсы …
  • Проект с использованием MCC часть 10Проект с использованием MCC часть 10
    Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – это значит, …



Share →
Translate »

Copyright © Catcatcat electronics 2013-2019. Все права защищены.
Копирование разрешается только с указанием активной ссылки на правообладателя.

e-mail: catcatcat.electronics@gmail.com