Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено 3.62 06 марта 2004 г. 19:08
В ответ на: А вот как бы побыстрее, без лишней памяти и прочего, желательно за один проход найти самое среднее значение в массиве из пяти чисел? отправлено VVT 05 марта 2004 г. 12:05

каким алгоритмом лучше всего усреднять полученный результат?

имеется непрерывная последовательность измеренных значений.
Нужно:
1. Отображать изменение последовательности (уменьшается/увеличивается)
2. Мгновенные значения выборки не должны сильно "скакать" друг от друга.
До сих пор делал так. усреднял, например, последние 8 выборок и
брал среднее арифметические. Однако есть проблема:
..... 0 0 0 0 0 0 123 156....
и
..... 123 156 0 0 0 0 0 0....
в течениее времени выбора 8 значений не отражает результат -уменьшается ли среднее значение или увеличивается.

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

возможно вопрос тривиальный, но все же...идеи есть может еще подкинете?

---------------------------------------------------------
Если нужно еще и отсеивать выпадающие точки используй Медианный фильтр - все остальные по сравнению с ним туфта, а вычислительные затраты очень низки. А если выборки еще и часты, то и время отклика будет минимальным
Суть в следующем - например по 5 точкам - последние 5 измерений сортируешь, например по убыванию - и средняя точка(№3) и есть результат - как результат все помехи отфильтровываются
--------------------------------------------------------
Если не ошибаюсь, то мат ожидание:

M[k+1] = M [k]+ (X[n+1] - X[1])/n

где n - обьем выборки (неизменная величина)
M[k+1] - последующее среднее
M[k] - предыдущее среднее
X[1] - это значение выбрасываем из расчета среднего
X[n+1] - это вновь поступившее значение для расчетов
------------------------------------------------------------
Может, тебе подойдёт простейший фильтр 1 порядка?:
y = 0,9y + 0,1x
Где: y - выходная величина, х - входная. коэффициенты 0,9 и 0,1 даны только для примера. Можно поставить 0,999999 и 0,000001 :-) Ессно, с увеличением постоянной времени (а коэффициенты именно её и показывают в единицах времени выборки) растут требования к точности вычислений. Но всё равно, ресурсов требуется на порядок меньше, чем при усреднении.
---------------------------------------------------------------
Учет весовых коэффициентов обновления данных в непрерывной выборке, а самое простое
считать так: AVERAGE[i]=(AVERAGE[i-1]+SAMPLE[i])/2; Можно, конечно, примерно как Тумблер описал считать, да еще и весовые коэффицинты вводить по "устарению" данных выборки.
----------------------------------------------------------------
Имеется в виду Бегунок = сумма x[i]*w[i]
У тебя w[i]= 1/8 Я предлагаю например w[i]= D +(i-1)*E
Если D=0 , т.е. первая точка выбрасывается, то последний
вес w[7]=7/32 - почти 1/4 Изменяя D от 0 до 1/8
( E=1/32-D/4 ) получишь разную плавность. А можно
сделать D и меньше нуля - наверно можно какой-то математический
смысл в этом найти. Если сумма w[i] равна 1 - все равно это какое-то хитрое среднее.



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru