Усреднение нескольких рядов данных через одну функцию

Ход мысли понятен, в целом согласен, но не в моем случае. 1) я указывал что мне для информативности важна привязка по времени(тесты имеют временные условия, в течении Х секунд должно быть выполнено условие #2) поэтому период секунда а не количество измерений. 2) в предложенном варианте хранятся всего 2 переменные кумулятивная сумма и количество замеров, куда ещё меньше. Массив нужен когда необходима средняя за период в данный момент, к примеру текущая скорость по тахометру, там да, необходимо усреднять по последним показаниям.

Зависит от ситуации.
Допустим, измеряем температуру жала условного паяльника.

  • измеряем без усреднения - большой “шум”, не годится.
  • усредняем за 100мс - лучше, но “шум” остался.
  • усредняем за 1сек - хорошо, но незначительный “шум” ещё есть
  • усредняем за 10сек - отлично, "шума"нет совсем! Но сгорел нагревательный элемент, хотя температура была в норме.
    Смотрим журнал измерений - оказывается, за последние 10сек работы был скачок напряжения в сети, и, температура жала превысила допустимое значение (на 5 секунде.) и, нагрев прекратился, т.к. нагр.элемент сгорел.
    В результате, средняя темп-ра за 10сек осталась в норме, и, аварийная автоматика не сработала.
    (Повторяю, паяльник, и интервалы времени условны, лишь для примера)
    Отсюда вывод: чем больше время выборки - тем меньше скорость реакции на изменения(вплоть до полного отсутствия оной реакции))
1 лайк

Вот это совсем не верное утверждение. Получил данные за 100мс. Усреднил, выдал, поспал 900мс, и снова измерил - выдал - поспал. При таком алгоритме даные температуры будут точными и выдаваться ровно раз в секунду.

Я в принципе так и сделал. Я вывел показания без корректировок в плотер, посмотрел характер шума, на графике помещается 3 периода по 0,1секунды. Каких либо экстремальных значений я не увидел!, поэтому анализировать сам шум не увидел надобности и решил привести показания просто к удобно читаемой форме. Но важно отметить это до того как подключил второй термо датчик, потому как подключив второй я не увидел на нем шума, что в общем то наверное и есть то, что я ищу, но это уже другая история о ремонте оборудования и немного офтоп.

Можете обосновать чем они будут точнее и необходимость “сна”? Как я понимаю микропроцессор в любом случае выполняет loop, поэтому “спит” только код, сам процессор работает, электричество расходуется, т.е. автономности мы не добавляем. Параллельных вычислений нет, высвобождать память не нужно. Но важно отметить что это все справедливо для данного метода, когда мы не накапливаем данные в огромный массив.

Вот не бывает такого. Единственный малошумящий элемент при подключении которого шума практически нет - полная батарейка 1.5 вольта. Так можно проверять входные цепи АЦП.

Наверно я непонятно выразился. Под сном я имел в виду отсутствие работы и этим каналом. Но мысль интересная. Доках есть описание режима ADC Noise Reduction для AVR, когда останавливается процессор, но работают АЦП и таймеры. Для stm32 это вообще нативный режим - при спящем ядре ацп через DMA пишет результат сразу в память. Делается это для того что бы цифровой шум ядра не влиял на результат оцифровки. Соответственно во сне результат точнее.

Но я не говорил что шума нет, я говорил что нет экстремальных значений.

Ну к примеру берем ряд температур: 40,41,40,41,40,41,40,41,40,41. Ровный шум берём среднюю за период 40,5

Второй вариант: 40,40,40,40,40,40,40,40,40,60. Средняя 42, что не совсем отражает течение процесса, так как скорее всего 60 это ошибка, тут я бы исключил 60 из расчёта

А это для меня пока ещё рано), суть мне в целом ясна, но пока не хватает знаний

Пока нет правил, это не ошибка.
A вот если будет правило, например “увеличение или уменьшение за Х времени не может быть больше Y” - тогда ошибка.
Ягуар может стоять, и через 3 секунды уже бежать 300 км/час. Для него показатели 0, 0, 0, 200, 300, 99, 0,0 - нормально. Для черепахи нет.

С такими выбросами хорошо справляется медианный фильтр. В твоей задаче накапливать сумму и в конце вычислять среднее - не правильный путь. На примере второго варианта видно что единственный выброс приводит к ошибке.
Правильно - накопить массив. Пройтись по нему медианным фильтром - он уберёт выбросы - и затем усреднить. Именно поэтому правильный путь не собирать 1 секунду данные, а собрать необходимое количество для обработки, обработать, выдать результат, и через необходимое время повторить цикл. Прочти это - Фильтрация шума сигнала / Хабр