Модифицированная скользящая средняя для переменной информации шага - PullRequest
0 голосов
/ 22 апреля 2020

Модифицированное скользящее среднее (см. https://en.wikipedia.org/wiki/Moving_average#Modified_moving_average) применяется к данным, которые выбираются с фиксированным временным шагом. Есть ли фильтр нижних частот, подобный этому, который можно применить к данным, которые выбираются с переменным шагом по времени?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

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

Затем можно применить «измененное перемещение усредненный фильтр для получения непрерывного сглаженного сигнала, и вы можете вычислить точное значение сглаженного сигнала в любое время по формуле:

y now = x prev + (у пред - х пред ) * е -Rt

где х пред - предшествующее sample, y prev - сглаженное значение во время предыдущего образца (которое рассчитывалось бы по той же формуле), t - время с момента предыдущего образца, а R - коэффициент от 0 до 1, который контролирует количество сглаживания. Меньшие значения R делают сглаженные результаты.

Это очень похоже на формулу, которую дает @btilly, но он использует x сейчас вместо x prev , что может работать для вас, но не имеет такой интерпретации, как отфильтрованный непрерывный сигнал.

1 голос
/ 22 апреля 2020

«Как это» субъективно. Вот два подхода, которые могут работать для вас.

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

Во-вторых, r будет логарифмом желаемой скорости затухания. (Это будет отрицательное число.) Тогда, если ваше следующее наблюдение будет в момент t после вашего предыдущего, тогда:

average_next = average_old * e^(r*t) + (1 - e^(r*t))*observation

Предполагая, что r*t мало, вы можете просто использовать пару членов известного ряда Тейлора e^x = 1 + x + x^2/2 + x^3/6 + ....

Это вычисление является более сложным, но, опять же, если переменные шаги фиксированы, то это превращается в скользящее среднее. (И вам не нужно точное соответствие, чтобы оно заработало!)

...