Перейти к содержанию
    

Коллеги, что порекомендуете для вычисления RMS по выборкам?

33 минуты назад, Stanislav сказал:

много нюансов именно в постановке задачи

На входе беззнаковые отсчёты 8 квыб, требуется вычислять преобладающую частоту в полосе 48...62 Гц и СКЗ за её периоды.

Изменено пользователем Plain

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

17 minutes ago, Plain said:

 

На входе беззнаковые отсчёты 8 квыб, требуется вычислять преобладающую частоту в полосе 48...62 Гц и СКЗ за её периоды.

 

Вот видите - а в постановке были совсем другие целевые условия (см. 1-й пост).

Для решения задачи в Вашей трактовке следовало бы открыть другую тему...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, Stanislav сказал:

Извиняюсь, что случайно цитировал этот бред ещё раз, а удалить цитату не получается что-то.

неслучайно не получается. ибо черный-фин прав, а Вы нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 22.12.2018 в 13:01, haker_fox сказал:
7 минут назад, Stanislav сказал:

в постановке были совсем другие целевые условия

АЦП ... 8 кГц оцифровывает переменный ток ... 48 - 62 Гц ... измеренную частоту и RMS нужно выдавать

Идеальных АЦП не существует, поэтому ноль неизвестен, и СКЗ понятно что сугубо за интересующий период.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, AlexRayne said:

неслучайно не получается. ибо черный-фин прав, а Вы нет.

Итак, фильтр скользящего среднего вычисляет RMS сигнала, верно?

Удалить, кстати, получилось.

Когда ЕГЭ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Stanislav сказал:

фильтр скользящего среднего вычисляет RMS сигнала, верно?

он же написал - на вход подавать квадрат сигнала.

что думаете на выходе будет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Plain said:

Идеальных АЦП не существует, поэтому ноль неизвестен, и СКЗ понятно что сугубо за интересующий период.

Ну, вот тут-то главная собака и порылась. Не спаниель, а целый сенбернар.

Вопросы на словах просты, как мои тапки: что именно считать RMS сигнала, и что - его оценкой по конечному числу выборок?

Вообще-то, есть стандартные определения. Но, когда задают вопросы в темах, часто требуется нечто другое, с точки зрения практической.

Оттого и непонятки все.

 

------------------------------------------------------------------------------------------

 

2 hours ago, AlexRayne said:

он же написал - на вход подавать квадрат сигнала.

что думаете на выходе будет?

Чел, ты до сих пор думаешь, что это RMS?

Так ЕГЭ в каком году, не стесняйся. ;)

Изменено пользователем Stanislav
Уточнение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, Stanislav сказал:

Так ЕГЭ в каком году, не стесняйся. ;)

это Вы со своими сверстниками меряйтесь. я пожалуй мимо пройду...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лады, не будем ссориться. Но всё же, попробуйте разобраться.

Вопрос не так прост, как кажется... ах да, я уже об этом писал ранее.

 

ЗЫ. Да, вот здесь есть кое-что о величинах.

Смотреть с 48-й минуты. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Stanislav said:

Оттого и непонятки все.

Просто напишите код в MATLAB'е и все ваши "непонятки" сразу станут "понятками"..

Это не трудно. Там всего 10 строк кода.

Если сумеете "на языке математики" объяснить MATLAB'у что хотите посчитать, то сразу поймете все "ньюансы" вычисления RMS.

Я, кстати, для оценки влияния оконной функции Гаусса на точность, именно так и сделал.

И приведенный мною график это вполне доказывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/29/2018 at 2:48 AM, haker_fox said:

Если говорить строго, это сетевая частота 50 или 60 Гц. Соответственно, в зависимости от государства, она либо 50+-2 Гц, либо 60 +-2 Гц. Т.е. в пределах 4 Гц она может меняться, чисто теоретически, от измерения к измерению.

Я думаю, метод расчета RMS упростится, если знать, что сетевая частота не может сильно меняться от измерения к измерению. В большинстве стран скорость изменения частоты ограничена на уровне 1Гц/с. В странах с повышенным количеством возобновляемой генерации (например в Ирландии), регламентируется 2Гц/с. Наибольшую скорость, что я встречал в требованиях операторов электросетей - 5Гц/с (это они с расчетом на будущее закладывали).  

 

По поводу самого алгоритма: Если я не ошибаюсь, у нас алгоритм считает просто: по переходу через 0 каждый раз определяется текущая частота сети(и соответственно ее период). Интервал семплирования для RMS определяется, как длительность сетевого периода, поделенная на 128. Т.е. каждые 20мс/128=156.25мкс(при 50Гц), новый семпл напряжения возводится в квадрат и добавляется в аккумулятор, а квадрат семпла, полученного 128 выборок назад, из него вычитается. То есть в аккумуляторе накопится и постоянно будет наличествовать сумма квадратов 128 выборок за последний период. Сдвигаем на 7 бит вправо, берем корень - вот и получается скользящее RMS с достаточно низкими затратами компьютерного времени хоть каждые 20мс.

Следует учесть, что для перехода через 0 и только для этих целей входной сигнал сильно фильтруется цифровым полосовым фильтром, чтобы осталась только первая гармоника. Отдельного входа нет

И еще у нас АЦП тоже семплирует на своей повышенной частоте. Семплы для RMS просто выдергиваются из потока без всяких антиалиазинговых фильтров и прочей ерунды. Может и не очень правильно, но на точность никто не жаловался.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, syoma said:

По поводу самого алгоритма:

Интересный подход! Спасибо, внесу в копилку знаний) Правда железка ужедавно работает...

1 hour ago, syoma said:

что сетевая частота не может сильно меняться от измерения к измерению.

И да, если не ошибаюсь, абсолютная погрешность не более +- 0.5 Гц... вроде точно меньше 1 Гц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 hours ago, haker_fox said:

И да, если не ошибаюсь, абсолютная погрешность не более +- 0.5 Гц... вроде точно меньше 1 Гц.

Ну нет. Частоту предписывают держать в этих пределах, но реально там может быть намного хуже. Опять же не помню какой стандарт, но мы закладываем вариации по частоте +-3 Гц. В некоторых странах говорят так:+-1Гц - может бывать постоянно. +-2Гц - в течении нескольких секунд (обычно это происходит во время жестких аварий с серьезной потерей генерации, пока аварийная защита не отключит поврежденный участок и не вернет частоту на место). Больше 5% отклонение - можете спокойно вырубаться.

Это требование критично для тех, кто участвует в поддержании стабильности сети, так как важно, чтобы эти вещи не отваливались в то время, когда они нужны больше всего.

Если у вас бытовое устройство, то можете брать и +-0.5Гц. Есть же стандарт на это:

ГОСТ 32144-2013 (CENELEC ЕN 50160:2010)

Quote

- отклонение частоты в синхронизированных системах электроснабжения не должно превышать ±0,2 Гц в течение 95% времени интервала в одну неделю и ±0,4 Гц в течение 100% времени интервала в одну неделю;

- отклонение частоты в изолированных системах электроснабжения с автономными генераторными установками, не подключенных к синхронизированным системам передачи электрической энергии, не должно превышать ±1 Гц в течение 95% времени интервала в одну неделю и ±5 Гц в течение 100% времени интервала в одну неделю.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На днях столкнулся с задачей измерения RMS переменного тока 40-70 Гц (без необходимости измерения частоты).

Использовал высказанные в этой ветке идеи, и решил выложить сюда решение, авось кому пригодится.

Расчёт делаю за интервал около 0.1с.

 

Начал с моделирования на тестовых данных – 256 отсчётов за 0.1с. Получилось, что если считать RMS тупо по формуле как среднее суммы квадратов, то за интервал 0.1с из-за непопадания в период может возникнуть ошибка до 1.5%. Расчёт с использованием оконной функции снижает максимальную ошибку до 0.5%. Наличие гармоник в несколько сот Гц на результат расчёта не влияет.

 

Частоту сэмплирования АЦП выбрал 1/64 МГц = 15.6кГц.
Суммирую каждые 6 отсчётов АЦП, чтобы получить всего 256 точек за 0.1с.

Если совсем точно, то такое усреднение – это фильтр нижних частот, который немного уменьшает амплитуду сигнала. В данном случае амплитуда 50Гц уменьшается на 0.06%. Вот формула:
 

Spoiler

 


FREQUENCY = 50.0

FS = 1.0e6 / 64

OVERSAMPLE = 6

 

omega = 2 * math.pi * FREQUENCY / FS

OVERSAMPLE_MAGNITUDE = (1.0 / OVERSAMPLE) * math.sin(omega * OVERSAMPLE / 2) / math.sin(omega / 2)

print(OVERSAMPLE_MAGNITUDE)

 

 

Выбрал оконную функцию Блэкмана-Харриса (понравилась картинка). Расчёты показывают, что выбор оконной функции на результат особо не влияет. В нормировку функции сразу включил поправку 0.06 % на усредняющий фильтр.

Spoiler

 


WINDOW_SIZE = 256

GW = scipy.signal.windows.blackmanharris(WINDOW_SIZE)

GW_INTEGER = [0] * WINDOW_SIZE

 

norm = 0.0

for gw in GW:

    norm += gw * gw

for i in range(WINDOW_SIZE):

    GW[i] = GW[i] / math.sqrt(norm / WINDOW_SIZE) / OVERSAMPLE_MAGNITUDE

    GW_INTEGER[i] = int(GW[i] * 65536)

 

print(GW_INTEGER)

 

Гораздо сильнее на результат влияет определение нулевого значения АЦП. Если просто взять среднее за 0.1с, то из-за попадания в нечётное количество полупериодов ошибка может достигать 10%. Поэтому ноль АЦП считаю отдельно обычным фильтром первого порядка.

 

В итоге RMS каждого измерения рассчитывается по формуле:

 

rms.png.307c28c3e83b2ac971e82832f09bfdab.png

Честно считать корень необязательно. Есть простой итерационный метод расчёта:
sqrt[n] = (x/sqrt[n-1] + x) / 2

Оказалось, что одной-двух итераций этой формулы более чем достаточно, если знать результат предыдущего измерения RMS. Т.е. весь расчёт корня сводится к одному целочисленному делению и простой арифметике.

 

В итоге уложился в требуемую точность измерения 0.5% и получился такой отклик:

 

1577222977_.png.2860f5c3aa1b5834067d609b8523a4f3.png

В архиве – мусорный код выдернутый из проекта.

rms.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 1/2/2020 at 4:48 PM, Plain said:

 

Идеальных АЦП не существует, поэтому ноль неизвестен, и СКЗ понятно что сугубо за интересующий период.


Ноль и не нужен. Правы были те, кто говорил о среднем квадратичном. Дисперсия -- это квадрат среднеквадратичного.

 

Надо считать дисперсию. Есть отличная формула для рассчета дисперсии:


D[X] = M[X^2] -(M[X])^2

Она имплементируется без буфера.

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

 

Ноль пофиг. Вклад постоянной составляющей исчезнет.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...