2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение06.11.2017, 14:08 


23/12/07
1757
Есть задача вычисления среднего по времени значения некоей характеристики (если точнее - интенсивности транспортного потока). Вроде, концептуально все просто - взял формулу скользящего среднего, и вуаля. Но дело в том, что вычисления предполагается выполнять на микроконтроллере (соответственно, есть ограничения на память, на точность вычисления и т.п.)
И если смотреть с этой точки зрения, то скользящее среднее не совсем удачный выбор, поскольку требует сохранения всех значений в пределах окна усреднения, а значит, отнимает много памяти. Намного привлекательнее смотрится экспоненциальное скользящее среднее. Но я с ним еще ни разу не работал. Потому вопросы к знатокам:
- насколько адекватно его использование вместо обычного усреднения;
- какие есть подводные камни при его реализации (например, будет ли сильно накапливаться ошибка, если вычисления будут не слишком точные?);
- обязательна ли вещественная арифметика для реализации, или можно обойтись целочисленной?

Спасибо.

 Профиль  
                  
 
 Re: Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение06.11.2017, 14:22 
Модератор
Аватара пользователя


16/02/11
3788
Бурашево
И обычное скользящее среднее и то, что здесь назвали экспоненциальным скользящим средним есть всего лишь процедуры низкочастотной фильтрации, причём вторая есть самая простейшая процедура, соответствующая цифровому ФНЧ первого порядка. Ключевая разница в том, что в случае скользящего среднего амплитудно-частотная характеристика фильтра гарантированно приходит в ноль в граничных точках своего периода, а в случае "экспоненциального скользящего среднего" может лишь приближаться к нулю при приближении коэффициента в рекурсивной части фильтра к единице или при наращивании количества последовательно применяемых процедур. И в том и в другом случае при наращивании количества последовательно применяемых процедур фильтр будет приближаться к гауссовскому. Но есть ещё одна существенная разница: обычное скользящее среднее может быть реализовано без умножений, в отличие от "экспоненциального скользящего среднего", где одно умножение на звено обязательно.

 Профиль  
                  
 
 Re: Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение06.11.2017, 14:49 
Заслуженный участник


20/08/14
11136
Россия, Москва
Умножение (небольших целых чисел) очень многие МК делать умеют. Вот с делением большой напряг.
Но и умножение не так уж и обязательно, можно выбрать коэффициенты в виде $2^k$ и тогда и умножения и деления сведутся к сдвигам, что МК делать вполне умеют. А выбрав коэффициенты в виде $2^{8k}$ даже и от сдвигов уйдём заменив их простыми командами пересылок частей чисел.
За счёт конечной точности вычислений ноль вполне может и будет получаться.
Вещественная арифметика не обязательна, вполне хватит и целочисленной, 16 или 32 бита, смотря какую точность ("длину усреднения") желаете получить.
К примеру при "усреднении" 64 шт. 10-ти битных отсчётов я делал всё вычисление тремя командами над 16-ти битными операндами: avg=(avg-(avg>>6))+x;. В скобках вычисление $(1-\alpha)\mathrm{avg}$. В $\mathrm{avg}$ при этом сидит текущее среднее, домноженное на 64. В кавычках длина усреднения потому что это не натуральная длина, а некоторый приведённый коэффициент: $64=1/\alpha=(n+1)/2$ из вики и лишь $n$ - длина усреднения.

 Профиль  
                  
 
 Re: Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение06.11.2017, 15:26 


23/12/07
1757
profrotter в сообщении #1262739 писал(а):
И обычное скользящее среднее и то, что здесь назвали экспоненциальным скользящим средним есть всего лишь процедуры низкочастотной фильтрации

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

этот момент я не совсем понял. если имелось в виду, что первый фильтр - с конечной импульсной характеристикой, а второй - с бесконечной, то и второй в реальности будет с конечной, потому как из-за конечной разрядной сетки в итоге все равно получится "обрыв памяти".
profrotter в сообщении #1262739 писал(а):
Но есть ещё одна существенная разница: обычное скользящее среднее может быть реализовано без умножений, в отличие от "экспоненциального скользящего среднего", где одно умножение на звено обязательно.

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

так все-таки, могу я в своей ситуации спокойно заменять скользящее среднее на экспоненциальное или нет?

Dmitriy40 в сообщении #1262748 писал(а):
Умножение (небольших целых чисел) очень многие МК делать умеют. Вот с делением большой напряг.

так там же надо не целых,а вещественных (коэффициент меньше единицы).
Dmitriy40 в сообщении #1262748 писал(а):
За счёт конечной точности вычислений ноль вполне может и будет получаться.

насколько сильно это отразится на конечном результате?

 Профиль  
                  
 
 Re: Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение06.11.2017, 15:45 
Заслуженный участник


20/08/14
11136
Россия, Москва
_hum_ в сообщении #1262762 писал(а):
так там же надо не целых,а вещественных (коэффициент меньше единицы).
Не обязательно. Всегда можно домножить коэффициент на некое число (например я домножил на $64=2^6$) и округлить до целых, а разницу из единицы представить как разницу исходного числа и поделенного на коэффициент (что для коэффициентов вида $2^k$ выливается всего лишь в сдвиг). Посмотрите же во что превратилось вычисление для $\alpha=1/64$, сдвиг, вычитание, сложение.

_hum_ в сообщении #1262762 писал(а):
насколько сильно это отразится на конечном результате?
Мне кажется это наоборот хорошо, мы получаем честный ноль при нулевом входном сигнале за конечное количество шагов. Математически же ноль никогда не достигается, что правильно отметили выше как недостаток.
Точность вычислений задаётся количеством разрядов целых чисел, в примере выше 16 битов и точность уж никак не меньше точности исходных чисел. Домножая исходные числа на другой коэффициент (и при необходимости расширив битовое представление средней суммы) можно получать точность и лучше исходных данных. Оставаясь в целочисленной арифметике. Всё в наших руках.

-- 06.11.2017, 15:47 --

_hum_ в сообщении #1262762 писал(а):
так там же надо не целых,а вещественных (коэффициент меньше единицы).
Это лечится общим методом под названием "вычисления с фиксированной точкой". Арифметика в целых числах, но все данные как бы дробные. Немного сложнее для программиста в написании, но зато скорость целых чисел.

 Профиль  
                  
 
 Re: Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение06.11.2017, 17:24 
Модератор
Аватара пользователя


16/02/11
3788
Бурашево
_hum_ в сообщении #1262762 писал(а):
вопрос больше в том, насколько они дают одинаковый результат...
На этот вопрос можно будет ответить, когда будет определено, что является результатом и будет введена какая-нибудь мера различия результатов. Например, нужно ввести модель характеристики, для которой Вы хотите искать среднее. Какая она? Это может быть сумма двух случайных процессов, один из которых - полезная составляющая (то самое среднее значение), а другой - мешающая. Или это сумма постоянного среднего значения и случайного процесса, или это сумма полезного детерминированного сигнала и мешающего случайного процесса, или это сумма двух детерминированных сигналов, при этом один мешающий, а другой полезный. Или ещё какая-то модель. Ну и отсюда определять характеристики нужного фильтра и смотреть насколько эти характеристики хорошо аппроксимируются фильтром скользящего среднего или цепочкой цифровых ФНЧ 1-го порядка. Это если, конечно, нужны теоретические выводы. А если "я тут делал мне больше понравилось вот так..." - то практику никто не отменял.
_hum_ в сообщении #1262762 писал(а):
если имелось в виду, что первый фильтр - с конечной импульсной характеристикой, а второй - с бесконечной
Простите, но как это могло иметься в виду, если в моей фразе нигде не написано слов "конечная", "бесконечная", "импульсная"? Написано "амплитудно-частотная характеристика". Именно она в большей степени характеризует свойства ФНЧ, является интуитивно понятной. Так вот у фильтра скользящего среднего равна нулю АЧХ на частоте $\omega T=\pi$ , где $T$ - период дискретизации. У ФНЧ первого порядка - отнюдь. И для того, чтобы как следует завалить эту АЧХ на высоких частотах нужен близкий к единице коэффициент рекурсивной части фильтра, а не абы какой типа (как здесь предлагается) $2^{-n}$, который уже при $n=1$ даёт 0,5. Но в принципе я уже писал, выбирая различное количество последовательных фильтраций можно получить большое многообразие АЧХ, в том числе и почти одинаковых для обоих фильтров. Однако не забывайте, что наращивая количество последовательных фильтраций, наращивается и количество ячеек памяти, необходимых для реализации (если, конечно, мы работаем в реальном масштабе времени, а не последовательно фильтруем некоторый массив). АЧХ одного звена чисто рекурсивного цифрового ФНЧ первого порядка рассмотрена, например, В Рабинер, Голд Теория и применение цифровой обработки сигналов. В принципе можете и сами построить график и посмотреть. Теперь такое время, когда всё можно изучить практически мгновенно.
_hum_ в сообщении #1262762 писал(а):
одним суммированием не обойтись
По ситуации. В каждом звене фильтра скользящего среднего на $L$ отчётов теоретически есть одно умножение на $\frac{1}{L}$. Всё зависит от разрядности арифметики и динамического диапазона обрабатываемого сигнала. В какой-то ситуации множители могут быть выполнены общими на несколько звеньев, в какой-то - потребуются для каждого.

 Профиль  
                  
 
 Re: Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение06.11.2017, 18:03 


27/08/16
9426
_hum_ в сообщении #1262737 писал(а):
- насколько адекватно его использование вместо обычного усреднения
Зависит от задачи. Если сами не видите разницу - значит, вам всё равно.

 Профиль  
                  
 
 Re: Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение10.11.2017, 19:16 
Экс-модератор
Аватара пользователя


23/12/05
12047
Я бы рекомендовал посмотреть в сторону фильтра Савицкого-Голея

 Профиль  
                  
 
 Re: Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение18.11.2017, 23:27 


23/12/07
1757
photon в сообщении #1264116 писал(а):
Я бы рекомендовал посмотреть в сторону фильтра Савицкого-Голея

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

 Профиль  
                  
 
 Re: Экспоненциальное скользяще среднее вместо скольз-го среднего
Сообщение19.11.2017, 05:49 


07/10/15

2400
Экспоненциальное скользящее среднее - это рекурсивный фильтр, а простое - нерекурсивный. Плюс первого в том, что он требует меньших вычислительных затрат, собственно этим Вам он о понравился. Но есть и минус - нелинейная ФЧХ. Если сигнал узкополосный, то нет никакой разницы. Ещё их применяют для сглаживания плавных трендов. Если же сигнал широкополосный, вроде последовательности импульсов, с крутыми фронтами и спадами, то будут искажения. Как они проявятся - нужно смотреть. Может для Вас это будет приемлемо, а может и нет. КИХ - фильтр (простое скользящее среднее) никаких фазовых искажений не даёт совсем.

-- 19.11.2017, 06:54 --

Фильтр Савицког-Голея, к стати, тоже не даёт фазовых искажений, но на микроконтроллере его реализовать будет не реально. Если стоит задача повысить качество сглаживания, то можно посмотреть полиномиальное взвешенное скользящее среднее. Но там все отсчёты придётся умножать на веса.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group