Есть много алгоритмов усреднения данных с ацп.
Я, к сожалению, не такой «продвинутый» как многие из присутствующих (часть из которых я могу смело назвать - профессионалами программирования).
Я перед созданием данной темы пытался найти название алгоритма, по моему описанию. Но не смог.
Буду благодарен за любую подсказку по существу.
Итак, есть последовательность данных (так называемая выборка), её данные нужно усреднить. Алгоритм усреднения не важен (но их список, желательно с описанием - очень даже приветствуется!), но суть его вот в чем.
Есть последовательносить чисел (данных), они идут постоянно и не останавливаются.
Есть интервал для выборки, например (внимательно!!! Это просто пример!!!) это будет 10 секунд (просто для простоты).
За эти 10 секунд мы производим 10 измерений, то есть по одному измерению в секунду. Давайте я для простоты понимания обозначу, что усреднение идет арифметическое - десять значений сложили и поделили на 10. Получаем среднее арифметическое, так (ничего не путаю?).
И вот моя «хотелка». Измерение каждой последующей секунды нужно прибавить к полученным данным (до деления на 10), но перед этим вычесть самое старое значение.
Я вижу решение данной задачи через обычную очередьна 11 элементов (например).
Прошу более грамотных программистов подсказать - прав я или нет или может быть уже есть алгоритм подобный?
Называется Плавающее Среднее: данные добавляются в кольцевой буфер, самое старое при добавлении пропадает. Потом буфер складывается и делится на число ячеек. Делить на практике обычно не приходится, просто берется какой-то коэф хК.
То есть смысл в том, что мы постоянно усредняем N последних значений АЦП.
Но замедляет реакцию на изменение напряжения.
Скажем , измеряем 10в 9раз(1 раз в секунду), а на 10-ый - напряжение пропадает, т.е равно 0. На выходе же , напряжение будет (постепенно уменьшаясь), ещё 9 секунд)).
Поэтому, аварийные ситуации, возможно, надо рассчитывать отдельно.
Я не знаю правильного названия (иначе темы этой не было бы). В моём понимании всё описано выше. То есть не дискретная выборка по n элементов с их усреднением, а постоянная выборка (да что я повторяюсь - прочти тему с начала).
Согласен с @Arduman – кольцевой буфер, только сумму лучше хранить при нём, тогда при добавлении нового элемента, достаточно вычесть затираемое значение из хранимой суммы и прибавить вновь записываемое – не надо всё каждый раз суммировать.
При этом делить ни на что не надо. Использовать готовую сумму. Для любых расчётов величина 10хU ничем не менее информативна, чем просто U.
Но, если делить уж так необходимо, то тут согласен с @UnforgivenII – размер буфера надо делать степенью двойки. Да оно, кстати и вообще полезно. Если размер - степень двойки, то и с буфером работать легче. Там же очередной индекс вычисляется по модулю длины буфера. (помницца в Core War вся арифметика была по модулю размера памяти – навеяло )
У меня где-то валялся готовый кольцевой буфер. Найти? Или … там писать нечего?
Но Вы понимаете, что за такое усреднение придётся платить запаздыванием реакции (т.н. phase response)
Вы же знаете - я никогда не отказываюсь от предложений грамотных людей…
Я знаю как реализовать, но за отсутствием знаний «спицифик» разных могу это сделать с костылями (зачастую и не подозревая что это костыль ).
Вот это еще поясните, пожалуйста. Видимо это для расчетов с небольшим отклонением? А если отклонение может быть х400 ( то есть сначала усредняем в районе 3.00, а потом в районе 1200.00)? Если не понятно написал - напишите, постараюсь переформулировать.
Вы задали очень серьёзный вопрос, который связан с программированием только тем, что его можно запрограммировать. Это целый курс, который называется “Обработка результатов эксперимента”.