Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2020, 14:41

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: RMS в целых числах
СообщениеДобавлено: 30 апр 2020, 18:37 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2868
Вот тут нашел интересный имхо алгоритм подсчета RMS в integer, точнее даже напрямую в значениях с АЦП:
Код:
#define INITIAL 512  /* Initial value of the filter memory. */
#define SAMPLES 512

uint16_t rms_filter(uint16_t sample)
{
    static uint16_t rms = INITIAL;
    static uint32_t sum_squares = 1UL * SAMPLES * INITIAL * INITIAL;

    sum_squares -= sum_squares / SAMPLES;
    sum_squares += (uint32_t) sample * sample;
    if (rms == 0) rms = 1;    /* do not divide by zero */
    rms = (rms + sum_squares / SAMPLES / rms) / 2;
    return rms;
}

Помимо того, что остаемся в плоскости вещественных чисел, также не надо извлекать корень. Вместо этого используется приближение методом касательных.
Если честно, для меня это было неким откровением, т.к. матан давно забыт. При достаточном количестве отсчетов и чтобы в него попало достаточное число периодов измеряемого сигнала, получается вполне точно. Вплоть до LSB совпадает в общем-то.
Как я понимаю, тут используется "скользящее окно" (на 512 выборок в данном конкретном примере). Кол-во выборок для алгоритма надо брать исходя из частоты сигнала и скорости АЦП. Ну и само собой, чтоб аккумулятор sum_squares не переполнился (для 32-битного аккумулятора и 10-битного АЦП, это 4104 выборки максимум (4294967295/1023^2)).
Мне пока непонятно, насколько алгоритм "чувствителен" к интервалу между выборками...
Но в плане быстродействия и простоты выглядит интересно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 30 апр 2020, 22:19 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 684
Цитата:
Мне пока непонятно, насколько алгоритм "чувствителен" к интервалу между выборками...

Он чувствителен к форме сигнала.
Обрати внимание, что сам по себе метод Ньютона имеет условия сходимости и расходимости. Поскольку априори ты не знаешь форму сигнала, то и утверждать, что производная во всех точках кривой непрерывна ты не можешь. А раз непрерывность функции не доказана, то и результат вычислений непредсказуем. Как только ты начнёшь оценивать величину производной, то объём вычислений возрастёт и будет ли ощутимой выигрыш- вряд ли
А так да, алгоритм красивый. Но я не стану его применять, ибо классический даёт стабильный и предсказуемый результат


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 30 апр 2020, 22:24 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 309
Откуда: Новочеркасск
В этой строчке:
Код:
rms = (rms + ((uint64)sum_squares*(uint64)rms) / SAMPLES ) / 2;

не лучше типа такого?

да и деление лишнее в начале, попробую у себя на C2000 серии.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 30 апр 2020, 22:55 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
ELEKTROS писал(а):
да и деление лишнее в начале, попробую у себя на C2000 серии.

А разве на C2000 это принципиально, по-крайней мере часть с аппроксимацией квадратного корня? Там вроде бы как аппаратно он вычисляется, правда тоже приближенно.
Сразу скажу, что не имел с ними еще дела, просто оценочное суждение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 30 апр 2020, 23:54 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2868
tonyk писал(а):
Он чувствителен к форме сигнала.
Обрати внимание, что сам по себе метод Ньютона имеет условия сходимости и расходимости. Поскольку априори ты не знаешь форму сигнала, то и утверждать, что производная во всех точках кривой непрерывна ты не можешь. А раз непрерывность функции не доказана, то и результат вычислений непредсказуем. Как только ты начнёшь оценивать величину производной, то объём вычислений возрастёт и будет ли ощутимой выигрыш- вряд ли
А так да, алгоритм красивый. Но я не стану его применять, ибо классический даёт стабильный и предсказуемый результат

Логично. Ну например для замера сетевого однофазного напряжения бытовой сети вполне же. Или каких еще синусов и иных, заранее известных форм сигнала, производная которых будет непрерывна. Лучше чем как всякая хрень делает - считая пик деленный на корень из 2. )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 01 май 2020, 00:14 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2868
ELEKTROS писал(а):
В этой строчке:
Код:
rms = (rms + ((uint64)sum_squares*(uint64)rms) / SAMPLES ) / 2;

не лучше типа такого?

Тогда уж вот так, это ж C:
Код:
rms = (rms + ((uint64_t)sum_squares / (uint64_t)(SAMPLES * rms)) ) / 2;

Что лишено смысла. Если в 32-битную не влезает, проще тогда уж сразу sum_squares сделать сразу 64-битной. Я об этом выше написал - чтобы влезла в него сумма квадратов надо учитывать.

Цитата:
да и деление лишнее в начале, попробую у себя на C2000 серии.

Почему лишнее?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 01 май 2020, 00:26 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6946
float выполняется не так и долго, особенно для разовой операции корня.
NStorm, "sum_squares" накапливается в виде (*SAMPLES) и если учитывать последующее деление на сие SAMPLES перед вычислением корня, то с "спокойной" разрядностью можно проститься. Скажем SAMPLES=256 (8 бит), число 32 бита - 8, делим на 2 =12 бит. Т.е. если пхать данные прямо с ADC, то конфликта не будет. А под бОльшие разрядности "простой" алгоритм обрастет проверками и матрицированием данных, что резко испортит аппетит.
Так что - накопить сумму в int32_t - это легко, а вот последующее деление и корень, это уже в float. Или прощай дискретность результата.
))
Знаете, в расчетах с подобным вариантом (см. выше) приходится даже в double считать, дабы не выплеснуть ребенка. Накопление долгое, а вот корень - разовый, не жалко.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 01 май 2020, 01:16 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2868
u37, там по ссылке речь шла про 10-битный АЦП, да я упомянул, что размерность sum_squares надо конечно учитывать в зависимости от разрядности АЦП и конечно же соб-но кол-ва выборок в окне (SAMPLES).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 01 май 2020, 12:27 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 684
Цитата:
Ну например для замера сетевого однофазного напряжения бытовой сети вполне же

Ага! Нет под рукой картинки с формой сетевого напряжения, допускаемой ГОСТ. Я как-то раз решил посмотреть, что будет, если к основным 50Гц подмешать все высшие гармоники, допускаемые ГОСТ. Фазы высших гармоник были нулевыми, а если бы "гуляли", то вообще было бы нечто. Синусоиду там можно было видеть лишь при богатом воображении. Понимаю, что это случай крайний, но если речь идёт о промышленном оборудовании, то я бы не рисковал. А если о бытовой погремушке, где сбой кроме мелкого неудобства ничего больше не причинит, то вполне сканает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 10 май 2020, 03:32 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2868
Поигрался с алгоритмом. Ну решил проверить почти что на практике. Это всё симуляция конечно. Тем не менее. Подготовил WAV файлик с синусоидой и наложенными различными шумами. От балды конечно, что там было в звуковом редакторе:
Вложение:
noisy-sine.png
noisy-sine.png [ 22.57 Кб | Просмотров: 539 ]


Ну и симуляцию в протеусе сделал. В кач-ве МК банальная атмега8, просто потому что её он симулирует точно. 10 битный АЦП, Vref = 1V. TrueRMS считает также скользящей экспонентой, но именно в double и квадратный корень берет каждый раз честно. Коэффициенты у себя настроил так, что 0-1В в пиках синусоиды на АЦП пересчитывались в 260В отображемого RMS. Когда чистая синусоида подается, всё отлично считается. Погрешность метода выше +- 1В уже в пересчете от настоящего RMS.

Ну и вот в итоге подал сгенерированную выше зашумленную синусоиду. Исходный синус с амплитудой 0.84615384615, что с моим коэффициентов должно давать 220В типа. Плюс шумы. Итоговую искаженную синусоиду и результаты выполнения программы видно на скрине:
Вложение:
nrrms.png
nrrms.png [ 60.34 Кб | Просмотров: 539 ]


Отлично попадаем в расчетные 220В. В общем при достаточной выборке, метод вполне себе точен даже для таких кривых синусоид.

EDIT: Для эксперимента никаких фильтров не ставил по входу АЦП, и программных тоже не делал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 10 май 2020, 04:10 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6946
Наложите поверх целевой синусоиды несколько других.
Второй тест - RMS измерения имеют смысл тогда, когда есть UPS. Во всех остальных случаях хватает диода и резистора. )) Т.е. второе - тест на меандре. Если его получить трудно, то стоит сгенерировать Очень большой синус, который обрежется в меандр.
Ну, если хотите проверить метод ... ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 10 май 2020, 04:29 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2868
А смысл считать на меандре?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 10 май 2020, 04:45 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6946
NStorm, могу повторить цитату еще раз. ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 10 май 2020, 10:45 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 684
ГОСТ 32144-2013 указывает значения гармоник до девятнадцатой. После 21-ой, ИМХО, можно пренебречь. Предлагаю попробовать сделать не просто "зашумлённую синусоиду", а по ГОСТ. Просто, от балды, исказить синусоиду и получить на ней правдоподобный результат, после чего делать заключение о правильности работы метода, по-моему, не совсем правильно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 10 май 2020, 11:00 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 684
Кстати, вот и ещё критерии нарисовались. Если учитывать гармоники до 19-ой, то частота взятия отсчётов 2*50*19=1900 выборок в секунду на канал. И это минимум. У меня питание оборудования идёт от ДГУ и заказчик требует обеспечить работу при частоте питающей сети до 70Гц. Если же ориентироваться только на российские сети, то максимальную частоту сети разумно принять 52Гц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 10 май 2020, 13:45 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2868
u37, можете попробовать другими словами )
Алгоритм нужен для измерения RMS непрерывных функций. Меандр можно измерить и таймером, если известно, что он меандр. Поэтому не понимаю честно к чему вы это.

Цитата:
Просто, от балды, исказить синусоиду и получить на ней правдоподобный результат, после чего делать заключение о правильности работы метода, по-моему, не совсем правильно.

Согласен. Но я пока не имел под рукой "инструмента", чтобы сделать что-то более осмысленное. У меня был простенький звуковой редактор под рукой, что у него в эффектах нашел, то и сделал пока.

Кто-нибудь знает, чем можно "правильные" искажения изобразить? Софт какой-нибудь. Писать своё/с нуля - думаю такой велосипед уже изобретали.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 10 май 2020, 13:50 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6946
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 10 май 2020, 17:06 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Лень проверять (но если кому надо – могу, матан пока не забыл).
Но imho не очень интересно: размениваем однократное вычисление корня на деление на _каждом_ сэмпле.

Хотя если вдруг надо оптимизировать что-то типа RMS – сам подход вполне годный: используем предыдущее значение как приближение и делаем 1 шаг метода Ньютона.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RMS в целых числах
СообщениеДобавлено: 11 май 2020, 09:32 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 684
Цитата:
Софт какой-нибудь

Я такие вещи в Maple рассчитываю. Любая математическая программа подойдёт: Matematika, MathCAD и т.п.


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


Часовой пояс: UTC + 5 часов


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

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


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB