Экспоненциальная скользящая средняя, ​​отснятая в переменные времена

У меня есть непрерывное значение, для которого я хотел бы рассчитать экспоненциальную скользящую среднюю . Обычно я просто использую стандартную формулу для этого:

  • S n = αY + (1-α) S n-1

где S n – новое среднее значение, α – альфа, Y – образец, а S n-1 – предыдущее среднее значение.

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

Я считаю, что я могу справиться с этим более или менее разумно, варьируя альфу соответственно, исходя из времени, прошедшего с момента последнего образца.

Часть моих рассуждений о том, что это будет работать, заключается в том, что EMA «интерполирует линейно» между предыдущей точкой данных и текущей. Если мы рассмотрим вычисление EMA следующего списка выборок с интервалами t: [0,1,2,3,4]. Мы должны получить тот же результат, если использовать интервал 2t, где входные данные становятся [0,2,4], верно? Если EMA предположил, что при t 2 значение было равным 2, так как t 0 , это было бы точно так же, как расчет интервала t, вычисляемый на [0,2,2,4,4], чего он не делает. Или это имеет смысл?

Может ли кто-нибудь сказать мне, как правильно изменить альфа? «Пожалуйста, покажи свою работу». Т.е., покажите мне математику, которая доказывает, что ваш метод действительно поступает правильно.

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

Во-первых, вы можете немного упростить свое уравнение (выглядит сложнее, но в коде проще). Я собираюсь использовать «Y» для вывода и «X» для ввода (вместо S для вывода и Y для ввода, как вы это сделали).

Y n = αX + (1-α) Y n-1 → Y n = Y n-1 + α (X – Y n-1 )

который кодирует:

Y += alpha * (XY); 

Во-вторых, значение α здесь «равно» 1-e- Δt / τ, где Δt – время между выборками, а τ – постоянная времени фильтра нижних частот. Я говорю «равно» в кавычках, потому что это хорошо работает, когда Δt / τ мало по сравнению с 1, а α = 1-e -Δt / τ ≈ Δt / τ. (Но не слишком мало: вы столкнетесь с проблемами квантования, и если вы не прибегаете к каким-то экзотическим методам, вам обычно нужны дополнительные N бит разрешения в вашей переменной состояния S, где N = -log 2 (α).) Для больших значения Δt / τ эффект фильтрации начинает исчезать, пока вы не дойдете до точки, где α близко к 1, и вы в основном просто назначаете входной сигнал на выход.

Это должно работать должным образом с переменными значениями Δt (изменение Δt не очень важно, если альфа мало, иначе вы столкнетесь с некоторыми довольно странными проблемами / псевдонимом Nyquist / и т. Д.), И если вы работаете над процессором где умножение дешевле деления, или важны проблемы с фиксированной точкой, предварительно рассчитайте ω = 1 / τ и рассмотрите попытку аппроксимировать формулу для α.

Если вы действительно хотите знать, как получить формулу

α = 1-e -Δt / τ

затем рассмотрим его источник дифференциальных уравнений:

Y + τ dY / dt = X

которая, когда X является ступенчатой ​​функцией, имеет решение Y = 1 – e -t / τ . При малых значениях Δt производная может быть аппроксимирована ΔY / Δt, что дает

Y + τ ΔY / Δt = X

ΔY / Δt = (XY) / τ

ΔY = (XY) (Δt / τ) = α (XY)

и «экстраполяция» α = 1-e -Δt / τ исходит из попытки сопоставить поведение с корпусом функции шага.

Посмотрите здесь: http://www.eckner.com/research.html

Посмотрите на вторую ссылку: «Алгоритмы для неравномерно распределенных временных рядов: скользящие средние и другие подвижные операторы»

Думаю, в этом документе описываются именно алгоритмы программирования.

Это не полный ответ, но может быть началом одного. Это до тех пор, как я получил это через час или около того, играя; Я размещаю его как пример того, что я ищу, и, возможно, вдохновение для других, работающих над проблемой.

Я начинаю с S 0 , что является средним результатом предыдущего среднего S -1 и образца Y 0, взятого при t 0 . (t 1 – t 0 ) – мой интервал выборки, а α устанавливается на все, что подходит для этого интервала выборки, и период, в течение которого я хочу усреднить.

Я подумал о том, что произойдет, если я пропущу образец при t 1 и вместо этого придется делать с образцом Y 2, взятым при t 2 ? Ну, мы можем начать с расширения уравнения, чтобы увидеть, что произошло бы, если бы у нас был Y 1 :

  • S 2 = αY 2 + (1-α) S 1 , где S 1 = αY 1 + (1-α) S 0

Подставив:

  • S 2 = αY 2 + (1-α) (αY 1 + (1-α) S 0 )
  • S 2 = αY 2 + (1-α) αY 1 + (1-α) (1-α) S 0
  • S 2 = αY 2 + (1-α) αY 1 + (1-α) 2 S 0

Я замечаю, что серия, кажется, распространяется бесконечно таким образом, потому что мы можем временно заменить S n в правой части:

  • S 2 = αY 2 + (1-α) αY 1 + (1-α) 2 (αY 0 + (1-α) S -1 )
  • S 2 = αY 2 + (1-α) αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1
  • и т.п.

Итак, это не полином (глупый я), но если мы умножим начальный член на единицу, мы увидим шаблон:

  • S 2 = (1-α) 0 αY 2 + (1-α) αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1

Хм: это экспоненциальная серия. Квелле удивляет! Представьте, что выход из уравнения для экспоненциального скользящего среднего!

Так или иначе, у меня есть это x 0 + x 1 + x 2 + x 3 + … вещь, и я уверен, что я чувствую запах e или естественный логарифм, носящий здесь, но я не могу вспомнить, где я был впереди еще до того, как у меня не хватило времени.

Любой ответ на этот вопрос или любое доказательство правильности такого ответа в большой степени зависит от данных, которые вы измеряете.

Если ваши образцы были взяты при t 0 = 0ms, t 1 = 0,9 мс и t 2 = 2,1 мс, но ваш выбор α основан на интервалах 1 мс, и поэтому вы хотите локально скорректированное α n , доказательство правильность выбора означала бы знание значений образца при t = 1 мс и t = 2 мс.

Это приводит к вопросу: можете ли вы интерполировать свои данные резонно, чтобы разумно угадать, какие промежуточные значения могли быть? Или вы можете даже интерполировать среднее значение?

Если ни одно из них не возможно, то, насколько я вижу, логический выбор промежуточного значения Y (t) является самым последним рассчитанным средним значением , т. Е. Y (t) ≈ S n, где n является maxmial таким, что t n

Этот выбор имеет простое следствие: Оставьте α отдельно, независимо от того, какая разница во времени.

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

Путем использования немного другого α, равного (1-α, одного из вопроса ), базовая формула для добавления нового значения Y в существующее среднее значение S 0 выглядит так:

S (Y, S 0 ) =

(1-α) Y + αS 0 =

Y – αY + αS 0 =

Y + α (S 0 -Y)

Если теперь добавить длину временного интервала t и предположить, что только α зависит от t, эта формула выглядит так:

S (Y, t, S 0 ) = Y + α t (S 0 -Y)

Предположим теперь, что t = t 1 + t 2 . Если среднее значение создается путем добавления двух значений Y для временных интервалов времени t 1 и t 2 , получившееся среднее значение выглядит так:

S (Y, t 2 , S (Y, t 1 , S 0 )) =

Y + α t 2 (S (Y, t 1 , S 0 ) – Y) =

Y + α t 2 ((Y + α t 1 (S 0 -Y)) – Y) =

Y + α t 2 α t 1 (S 0 -Y)

Если это среднее значение должно быть таким же, как если бы весь t-интервал был бы добавлен сразу, из этого следует, что α t = α t 1 α t 2 . Определение α, удовлетворяющее этому требованию, будет:

α x : = A x (для некоторой константы A)

Потому как:

α t = A t = A t 1 + t 2 = A t 1 A t 2 = α t 1 α t 2

Это приводит к следующей функции усреднения:

S (Y, t, S 0 ) = Y + A t (S 0 -Y)

Я действительно не проверял это, но если предположения, которые я сделал в соответствии с вашим сценарием, это похоже на функцию усреднения, которая вполне может справиться с вариациями интервалов выборки.

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

Множитель n = альфа- время n- время n-1

Сумма n = Val n + Sum n-1 * Множитель n

Count n = 1 + Count n-1 * Множитель n

Avg n = Sum n / Count n

Я оставил бы alpha значение в одиночку и заполнил недостающие данные.

Так как вы не знаете, что происходит в то время, когда вы не можете попробовать, вы можете заполнить эти образцы 0s или сохранить предыдущее значение стабильным и использовать эти значения для EMA. Или некоторая обратная интерполяция, когда у вас есть новый образец, заполните отсутствующие значения и пересчитайте EMA.

Я пытаюсь понять, что у вас есть вход x[n] с отверстиями. Невозможно обойти тот факт, что вам не хватает данных. Таким образом, вы можете использовать удержание нулевого порядка или установить его на ноль или какую-либо интерполяцию между x[n] и x[n+M] , где M – количество отсутствующих образцов и n начало разрыва. Возможно даже использование значений до n .

Это похоже на открытую проблему в моем списке задач. У меня есть одна схема, разработанная в некоторой степени, но у меня нет математической работы, чтобы поддержать это предложение.

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

Первый шаг.

  • Если вы также можете измерить время с момента последнего отбора образца (в округленных кратных значениях вашего постоянного времени выборки – так 7,8 мс, поскольку последний образец будет 8 единиц), который можно использовать для многократного сглаживания. Примените формулу 8 раз в этом случае. Вы эффективно сделали сглаживание более склонным к текущему значению.

Второй шаг.

  • Чтобы получить лучшее сглаживание, нам нужно настроить альфа, применяя формулу 8 раз в предыдущем случае.

Чем это сглаживание приближается?

  • Он уже пропустил 7 образцов в приведенном выше примере
  • Это было аппроксимировано на шаге 1 с сплющенным повторным применением текущего значения дополнительно в 7 раз
  • Если мы определим коэффициент аппроксимации бета, который будет применяться вместе с альфой (как альфа * бета, а не просто альфа), мы будем предполагать, что 7 пропущенных выборок плавно менялись между предыдущими и текущими значениями выборки.
Interesting Posts

Как запустить файл «.bat» во время установки?

отложенная функция addclass / remove не работает

Миграция из Skype 4.2 до 4.3 на Ubuntu

Как отсортировать записи Firebase по двум полям (Android)

Лучший способ отслеживать мое интернет-соединение, отличное от ping

Случайная запись в ActiveRecord

Удалить пакет

Рабочий стол Google не индексирует новые электронные письма

Как я могу выполнить несколько одновременных эффектов jquery?

Экран дисплея нетбука искажен (имеет черно-белые и горизонтальные линии, зависание экрана и / или неправильную позицию отображения)

Программа OpenMP на разных хостах

Как работать с комплексными числами в C?

В C # Winforms есть способ поместить пунктирную границу вокруг всех элементов управления и показать точки захвата при выборе определенных элементов управления во время выполнения?

Базовая (дешевая) рекомендация беспроводного маршрутизатора для дома

FFmpeg преобразование последовательности изображений в видео приводит к пустому видео

Давайте будем гением компьютера.