Я над этой темой работаю уже больше 3 лет
И до сих пор нет внятной формулировки задача...
Сам сформулирую (уж не знаю, угадал или нет - не телепат).
Есть некоторая последовательность чисел (например температура по дням). Нужно в каждый момент выдать несколько других последовательностей примерно усредняющих исходную последовательность с разными длинами истории. При этом хотелось бы алгоритм с небольшим требованием по памяти (чтобы не хранить в кольцевом буфере всю историю какой-то изрядной длины).
Если надо получить точное среднее по прямоугольному окну, то без кольцевого буфера на обойтись.
Но если достаточно какого-то приближения, то можно что-то поэкономичнее в плане памяти соорудить.
Как уже предлагали, можно в качестве приближения использовать усреднение с экспоненциальными весами.
Алгоритм тут простой. Хранится всего одно число, как текущее состояние. Обновляется линейно как
. Коэффициент
близок к 1 и определяет длину усреднения (чем ближе к 1, тем больше окно усреднения). Можно параллельно несколько таких счётчиков вести с разными
. (Примерно
.)
А вообще в обработке сигналов используют
IIR фильтры. Состояние может быть не одним числом, а вектором из нескольких чисел. Новое состояние вычисляется линейно из предыдущего состояния и небольшого количества нескольких последних входов
(для них понадобится коротки кольцевой буфер).
Линейные коэффициенты подбираются исходя из требований к фильтру.
-- 19.10.2021, 21:16 --Насчёт IIR, то можно попробовать соорудить фильтр у которого форма окна будет поближе к прямоугольной, чем у экспоненциального окна.
Хотя не знаю, так ли тут важна именно прямоугольность. Может экспоненциальной формы вполне достаточно.