Далеко не пятничный вопрос про алгоритм

Есть много алгоритмов усреднения данных с ацп.
Я, к сожалению, не такой «продвинутый» как многие из присутствующих (часть из которых я могу смело назвать - профессионалами программирования).
Я перед созданием данной темы пытался найти название алгоритма, по моему описанию. Но не смог.

Буду благодарен за любую подсказку по существу.

Итак, есть последовательность данных (так называемая выборка), её данные нужно усреднить. Алгоритм усреднения не важен (но их список, желательно с описанием - очень даже приветствуется!), но суть его вот в чем.
Есть последовательносить чисел (данных), они идут постоянно и не останавливаются.
Есть интервал для выборки, например (внимательно!!! Это просто пример!!!) это будет 10 секунд (просто для простоты).

За эти 10 секунд мы производим 10 измерений, то есть по одному измерению в секунду. Давайте я для простоты понимания обозначу, что усреднение идет арифметическое - десять значений сложили и поделили на 10. Получаем среднее арифметическое, так (ничего не путаю?).

И вот моя «хотелка». Измерение каждой последующей секунды нужно прибавить к полученным данным (до деления на 10), но перед этим вычесть самое старое значение.

Я вижу решение данной задачи через обычную очередьна 11 элементов (например).

Прошу более грамотных программистов подсказать - прав я или нет или может быть уже есть алгоритм подобный?

Всем спасибо за ответы по существу.

Называется Плавающее Среднее: данные добавляются в кольцевой буфер, самое старое при добавлении пропадает. Потом буфер складывается и делится на число ячеек. Делить на практике обычно не приходится, просто берется какой-то коэф хК.

То есть смысл в том, что мы постоянно усредняем N последних значений АЦП.

2 лайка

Да, совершенно верно!
Как лаконично звучит, а я целую «поэму» написал… ))

То есть кольцевая очередь, ну по сути я правильно думал…

Всё так, причем это на удивление хорошо убирает шумы и усредняет показания.

Советую усреднять 8 или 16 значений, результат получается простым сдвигом суммы на 3 или 4 бита вправо, что существенно быстрей деления на 10.

2 лайка

Но замедляет реакцию на изменение напряжения.
Скажем , измеряем 10в 9раз(1 раз в секунду), а на 10-ый - напряжение пропадает, т.е равно 0. На выходе же , напряжение будет (постепенно уменьшаясь), ещё 9 секунд)).
Поэтому, аварийные ситуации, возможно, надо рассчитывать отдельно.

А если реакция нужна в районе 0.5-1.0 секунды?
Хотя вопрос, наверное, глупый. Я понял «посыл», ничего мне не мешает брать выборку не 10, а 16…

Большое спасибо всем ответившим!

Благодарю за ответ, но суть не в измерении напряжения, а усреднения постоянных данных (для которых не нужна ни какая «экстренная» реакция).

а что это такое?

Я не знаю правильного названия (иначе темы этой не было бы). В моём понимании всё описано выше. То есть не дискретная выборка по n элементов с их усреднением, а постоянная выборка (да что я повторяюсь - прочти тему с начала).

так, как ни крути а к катушке Мишина пришли, там было про усреднение )))

Быстрый счет в дозиметре так делаю. Толкаю в массив новый замер и вычитаю старый.

Согласен с @Arduman – кольцевой буфер, только сумму лучше хранить при нём, тогда при добавлении нового элемента, достаточно вычесть затираемое значение из хранимой суммы и прибавить вновь записываемое – не надо всё каждый раз суммировать.

При этом делить ни на что не надо. Использовать готовую сумму. Для любых расчётов величина 10хU ничем не менее информативна, чем просто U.

Но, если делить уж так необходимо, то тут согласен с @UnforgivenII – размер буфера надо делать степенью двойки. Да оно, кстати и вообще полезно. Если размер - степень двойки, то и с буфером работать легче. Там же очередной индекс вычисляется по модулю длины буфера. (помницца в Core War вся арифметика была по модулю размера памяти – навеяло :slight_smile: )

У меня где-то валялся готовый кольцевой буфер. Найти? Или … там писать нечего?

Но Вы понимаете, что за такое усреднение придётся платить запаздыванием реакции (т.н. phase response)

3 лайка

Найти)

1 лайк

Вы же знаете - я никогда не отказываюсь от предложений грамотных людей…
Я знаю как реализовать, но за отсутствием знаний «спицифик» разных могу это сделать с костылями (зачастую и не подозревая что это костыль :slight_smile: ).

Вот это еще поясните, пожалуйста. Видимо это для расчетов с небольшим отклонением? А если отклонение может быть х400 ( то есть сначала усредняем в районе 3.00, а потом в районе 1200.00)? Если не понятно написал - напишите, постараюсь переформулировать.

Вы задали очень серьёзный вопрос, который связан с программированием только тем, что его можно запрограммировать. Это целый курс, который называется “Обработка результатов эксперимента”.

Началось… Щас интегралы пойдут, производные, теоремы Лагранжа… выходные же.

Так от того и вопрос, что я читаю тему с начала. И не могу понять, чем отличается

от

Если они отличаются - то надо понять чем. Пока, на мой взгляд, мы говорим о дискретной выборке .

Я бы поспорил. Время выборки постоянно. Тут вопрос в функции - если она зависит от времени, то я с Вами согласен, а если нет - то тогда Вы неправы.