реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> вычисление RMS, когда мало памяти
Zelepuk
сообщение Apr 19 2012, 04:55
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Нужно найти алгоритм вычисления RMS усреднённую за 1с при том что есть массив, куда ложатся отсчёты, имеющий всего 3 элемента.
Помогите советом laughing.gif
Go to the top of the page
 
+Quote Post
eugen_pcad_ru
сообщение Apr 19 2012, 05:47
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 642
Регистрация: 15-11-07
Пользователь №: 32 353



Не понятен вопрос. Вы хотите по трем элементам рассчитать RMS? Так математика это может от произвольного числа считать. Заодно и точность подсказывает (которая в этом случае будет +-километрsm.gif).

А вообще накапливайте буфер и делайте усреднение N раз, где N - количество усреднений от 1 до бесконености (конфигурируемый параметр). Точность в этом случае будет зависеть уже от величины (N*3). После того как добьетесь приемлемого соотношения "время реакции/точность измерения", можете зафиксировать N.

P.S.: Поясните задачу и найдется 0чень много желающих помочь советомsm.gif


--------------------
Правильно сформулированый вопрос содержит в себе половину ответа.
P.S.: Некоторые модераторы в качестве ответа так навязчиво предлагают посетить свой сайт, что иначе как саморекламу такие действия интерпретировать сложно.
Go to the top of the page
 
+Quote Post
MaslovVG
сообщение Apr 19 2012, 06:18
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 210
Регистрация: 24-01-05
Из: Россия Волгодонск
Пользователь №: 2 134



Цитата(Zelepuk @ Apr 19 2012, 08:55) *
Нужно найти алгоритм вычисления RMS усреднённую за 1с при том что есть массив, куда ложатся отсчёты, имеющий всего 3 элемента.
Помогите советом laughing.gif

А если считать по фомуле
F = (F*(N-1) + X)/N
А если N степень двойки то умножение и деление заменяется сдвигом.
F = (F*N-F+X)/N
Массив совсем не нужен.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Apr 19 2012, 06:20
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Считать RMS можно и без накапливания буфера каждый раз - если реализовать алгоритм, как сделано в микросхемах RMS-DC.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
Alexey Lukin
сообщение Apr 19 2012, 07:41
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 159
Регистрация: 3-01-11
Пользователь №: 62 000



В таких случаях можно вычислять RMS не с прямоугольным окном, а с экспоненциальным, по рекурсивной формуле RMS[t] = (1 - alpha) * RMS[t-1] + alpha * x2[t].
alpha подбирается для достижения нужного времени интеграции (1 с).

Сообщение отредактировал Alexey Lukin - Apr 19 2012, 07:44
Go to the top of the page
 
+Quote Post
SIA
сообщение Apr 19 2012, 12:58
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723



Цитата(Alexey Lukin @ Apr 19 2012, 10:41) *
В таких случаях можно вычислять RMS не с прямоугольным окном, а с экспоненциальным, по рекурсивной формуле RMS[t] = (1 - alpha) * RMS[t-1] + alpha * x2[t].
alpha подбирается для достижения нужного времени интеграции (1 с).

Строго говоря, самих RMS - не один-единственный вариант в отношении "Mean" (способа усреднения), а несколько, то есть надо смотреть по условиям задачи.
Во-первых, есть средний квадрат за интервал времени наблюдения, то есть с "прямоугольным" окном переменной длины, равной всему интервалу наблюдения - от начала до текущего момента. Такой способ методически наиболее точен для определения характеристик стационарных стохастических величин. Компактную реализацию этого метода тут уже приводили - в 3 посте: MS[n] = MS[n-1]*((n-1)/n) + (x^2)/n, или, более явно, MS[n] = MS[n-1] + (x^2 - MS[n-1])/n, RMS[n] = SQRT(MS[n]/n), однако нужно иметь в виду, что она (как и БИХ фильтрация, см. ниже) критична к вычислительным погрешностям, то есть при вычислениях нужен запас по разрядности, порядка 1.5*Log2(n).
Самая быстрая (и точная) реализация этого алгоритма - с "пост-масштабированием", когда по ходу дела просто накапливается сумма квадратов (естественно, с соответствующей разрядностью накопителя, во избежание переполнения), и только потом, когда данные уже собраны, накопленное делится на n, после чего извлекается корень.
Во-вторых, есть скользящее среднее - т.е. с прямоугольным окном фиксированной длины, этот метод часто применяется для подавления периодической помехи и ее гармоник (пример - вычисление RMS для частоты 50 Гц, как правило, эффективнее всего выполнять за интервал 20 мс). Для реализации нужен циклический буфер на длину окна (с разрядностью для квадрата, если нет желания дважды его вычислять).
В-третьих, можно явно сформировать КИХ весовую функцию, применив алгоритм КИХ фильтрации (в любой форме) к квадратам мгновенных значений.
Ну и в-четвертых, можно применить не КИХ, а БИХ-фильтрацию к "мгновенным" значениям квадрата, формой "окна" при этом будет служить импульсная характеристика БИХ фильтра. Тогда число хранимых величин определяется порядком фильтра. (Выше как раз фактически использован простейший БИХ первого порядка).
Обычно это самый эффективный в вычислительном отношении алгоритм (или сразу после п.1., если БИХ более высокого порядка).
Естественно, все суммы нормируются в соответствии с фактическим или эквивалентным числом отсчетов, точнее, с учетом "площади" (интеграла) весовой функции.
Go to the top of the page
 
+Quote Post
Alexey Lukin
сообщение Apr 24 2012, 06:18
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 159
Регистрация: 3-01-11
Пользователь №: 62 000



Это всё прекрасно, но у автора по условию всего 3 ячейки памяти.
Go to the top of the page
 
+Quote Post
SIA
сообщение Apr 24 2012, 15:13
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723



Цитата(Alexey Lukin @ Apr 24 2012, 09:18) *
Это всё прекрасно, но у автора по условию всего 3 ячейки памяти.

Естественно.
См. алгоритм накопления квадратов за время измерения.
1 или 2 ячейки (в зависимости от разрядности и типа переменной) - накапливаемая сумма квадратов.
1 ячейка - N.
Тогда алгоритм простой - накапливаем отсчеты за 1 сек, делим накопленное на N и извлекаем корень. "Скользящее" не получится, но оно далеко не всегда и надо.
Если же нужно приближение кскользящему среднему - использовать БИХ фильтр для квадратов, тогда, поскольку N хранить становится не надо, и если в каждую ячейку без существенных потерь точности влезает квадрат, то легко сформировать весовую функцию с БИХ фильтрацией огибающей вплоть до 3 порядка (а не первого, как в приведенном Вами примере). Соответственно, при необходимости можно получить лучшее приближение к "прямоугольной" весовой функции. Естественно, при вычислении конечного значения надо учесть нормировку, но она не будет зависеть от N, если длительность процесса существенно бОльше длины значимой части импульсной характеристики этого БИХ.
Go to the top of the page
 
+Quote Post
akorud
сообщение Apr 25 2012, 08:50
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Цитата(Zelepuk @ Apr 19 2012, 06:55) *
Нужно найти алгоритм вычисления RMS усреднённую за 1с при том что есть массив, куда ложатся отсчёты, имеющий всего 3 элемента.
Помогите советом laughing.gif

Рекомендую почитать http://www.eetimes.com/design/embedded/400...an-calculations
Я по советам из статьи делал честный RMS - оказалось что нужно только 2 32-битовые статические переменные + несколько констант. Используется только текущий отсчет. Если надо - могу найти свой код.
Go to the top of the page
 
+Quote Post
_pv
сообщение Apr 25 2012, 10:09
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



что-то как-то сложно: окна, фильтры.

надо посчитать (sum((Xa - Xi)^2)/(N-1))^0.5, Xa - среднее.
если возвести в квадрат и раскрыть скобки, то получится sum(Xa^2) + sum(Xi^2) - 2*Xa*sum(Xi)
sum(Xa^2) = N*(sum(Xi)/N)^2 = sum(Xi)^2/N
2*Xa*sum(Xi) = 2*sum(Xi)^2/N
то есть надо накапливать сумму выборок S1=sum(Xi) и сумму квадратов выборок S2=sum(Xi^2), ну и количество выборок N, тогда rms можно посчитать как:
((S2 - S1*S1/N)/(N-1))^0.5
Go to the top of the page
 
+Quote Post
SIA
сообщение Apr 25 2012, 14:05
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723



Цитата(_pv @ Apr 25 2012, 13:09) *
что-то как-то сложно: окна, фильтры.

надо посчитать (sum((Xa - Xi)^2)/(N-1))^0.5, Xa - среднее.
если возвести в квадрат и раскрыть скобки, то получится sum(Xa^2) + sum(Xi^2) - 2*Xa*sum(Xi)
sum(Xa^2) = N*(sum(Xi)/N)^2 = sum(Xi)^2/N
2*Xa*sum(Xi) = 2*sum(Xi)^2/N
то есть надо накапливать сумму выборок S1=sum(Xi) и сумму квадратов выборок S2=sum(Xi^2), ну и количество выборок N, тогда rms можно посчитать как:
((S2 - S1*S1/N)/(N-1))^0.5

Идея алгоритма в принципе правильна, но вычисляет он не RMS, а несмещенную оценку среднеквадратического отклонения (СКО) по данной выборке.
Это не одно и то же.
Простейший пример: допустим, что в последовательности X0, X1... XN-1 все Xn одинаковы. Соответственно СКО (X0...XN-1) == 0. Но RMS (X0...XN-1) == X.

Цитата(akorud @ Apr 25 2012, 11:50) *
Рекомендую почитать http://www.eetimes.com/design/embedded/400...an-calculations
Я по советам из статьи делал честный RMS - оказалось что нужно только 2 32-битовые статические переменные + несколько констант. Используется только текущий отсчет. Если надо - могу найти свой код.

Да, частный случай БИХ варианта формирования усредняющего окна. Статья хороша "объяснением на пальцах" прикладных вопросов реализации и точности.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016