Этот ответ основан на моем хорошем понимании фильтров нижних частот («экспоненциальное скользящее среднее» на самом деле является просто однополюсным фильтром нижних частот), но на моем смутном понимании того, что вы ищете. Я думаю, что вы хотите следующее:
Во-первых, вы можете немного упростить уравнение (выглядит сложнее, но проще в коде). Я собираюсь использовать «Y» для вывода и «X» для ввода (вместо S для вывода и Y для ввода, как вы сделали).
Y n = & alpha; X + (1- & alpha;) Y n-1 & rarr; Y n = Y n-1 + & alpha; (X - Y n-1 )
какие коды:
Y += alpha * (X-Y);
Во-вторых, значение & alpha; здесь «равно» 1-е - & Delta; t / & tau; , где & Delta; t - время между выборками, а & tau; постоянная времени фильтра нижних частот. Я говорю «равно» в кавычках, потому что это хорошо работает, когда & Delta; t / & tau; мало по сравнению с 1, и & alpha; = 1-е - & Delta; t / & tau; & asymp; & Delta; T / & тау ;. (Но не слишком маленький: вы столкнетесь с проблемами квантования, и если вы не прибегаете к каким-то экзотическим методам, вам обычно требуется дополнительное N бит разрешения в переменной состояния S, где N = -log 2 ( & alpha;).) Для больших значений & Delta; t / & tau; эффект фильтрации начинает исчезать, пока вы не дойдете до точки, где & alpha; близко к 1, и вы в основном просто назначаете вход для выхода.
Это должно правильно работать с переменными значениями & Delta; t (изменение & Delta; t не очень важно, пока альфа мала, иначе вы столкнетесь с некоторыми довольно странными проблемами Найквиста / псевдонимами / т. Д.), И если вы работаете с процессором, в котором умножение дешевле деления или важны проблемы с фиксированной запятой, то рассчитайте заранее & omega; = 1 / & tau ;, и попробуйте приблизить формулу для & alpha;.
Если вы действительно хотите знать, как получить формулу
* * & Тысяча тридцать один альфа; = 1-е
- & Delta; t / & tau;
затем рассмотрим источник его дифференциального уравнения:
Y + & tau; dY / dt = X
, которое, когда X является функцией единичного шага, имеет решение Y = 1 - e -t / & tau; . Для малых значений & Delta; t производная может быть аппроксимирована & Delta; Y / & Delta; t, давая
Y + & tau; & Delta; Y / & Delta; t = X
& Delta; Y / & Delta; t = (X-Y) / & tau;
& delta; Y = (X-Y) (& delta; t / & tau;) = & alpha; (X-Y)
и "экстраполяция" & alpha; = 1-e - & Delta; t / & tau; происходит из-за попытки сопоставить поведение с функциональным случаем единичного шага.