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

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

Господа, всем огромное спасибо! На праздники есть с чем разбираться! Вот ещё: пока не угладывается в голове, что делает оконная функция? Она как-то нормирует спект исходного сигнала? Не совсем всё понятно про неё.

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


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

Just now, haker_fox said:

Вот ещё: пока не угладывается в голове, что делает оконная функция? Она как-то нормирует спект исходного сигнала? Не совсем всё понятно про неё.

Если вы посмотрите на определение RMS для конечного числа отсчетов дискретного сигнала, то вы увидите там формулу для обычного НЧ КИХ фильтра известного в узких кругах под названием скользящее среднее, причем на вход этого фильтра вместо отсчетов самого сигнала s(t) подают квадраты этих отсчетов: s(t)^2. Единственная функция этого НЧ фильтра, это выделение постоянной составляющей из входного сигнала s(t)^2 и подавление всех частот отличных от нуля. К сожалению, АЧХ НЧ фильтра на основе скользящего среднего далека от идеала. Помимо основной полосы пропускания на нулевой частоте в ней имеются паразитные полосы пропускания форма и положение которых в первом приближении соответствуют АЧХ заданной sinc-функцией. (Если быть совсем точным, то АЧХ скользящего среднего задается функцией Дирихле). Поэтому вместо КИХ фильтра на основе скользящего среднего для выделения НЧ составляющей сигнала используют НЧ КИХ фильтр с нужным уровнем подавления сигнала вне полосы пропускания. Такой фильтр проще всего получить выбрав в качестве импульсной характеристки фильтра любое из известных окон - Кайзера, Ханна, Гаусса, и т.п.

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


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

haker_fox

Господа, всем огромное спасибо! На праздники есть с чем разбираться! Вот ещё: пока не угладывается в голове, что делает оконная функция? Она как-то нормирует спект исходного сигнала? Не совсем всё понятно про неё.

DFT - банк полосовых FIR фильтров с прямоугольной огибающей, т. е. ЧХ этих фильтров - sinc. Оконная функция позволяет сделать произвольную огибающую и соответственно ЧХ. Например для вычисления амплитуд гармоник есть специальные окна flat top с плоской вершиной АЧХ в полосе частот.

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


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

On 12/23/2018 at 2:45 PM, haker_fox said:

Простите, не совсем понимаю. Буду признателен за объяснение более подробно.

Мне ужасно стыдно, что ввел в заблуждение. Алгоритм выше работает только, если максимум в выборке отскалирован на 1, в то же время, такая скалировка достаточно не устойчива численно, особенно если вспомнить, что без ККМ приборы как раз делают сетевой синус слегка приплюснутым.

 

Чтоб этого не было таки надо считать чуть сложнее. Прилагаю код программы с тестовым примером:

 

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

 int main(int n, char **ppArg)
 { int i, N;
   double BeginSin, EndSin, Amplitude;
   double *SinData;
   double a2, a3;
   double t1, t2, t3, d;
   double p1, p2, p3;

   if(n!=5)
   { printf("%s BeginAngle EndAngle Amplitude N\n", ppArg[0]);
     exit(1);
   }
   sscanf(ppArg[1], "%lg", &BeginSin); // начальный угол синуса в радианах
   sscanf(ppArg[2], "%lg", &EndSin); // конечный угол синуса в радианах
   sscanf(ppArg[3], "%lg", &Amplitude); // амплитуда
   sscanf(ppArg[4], "%d", &N); // длина выборки

   SinData=malloc((N+2)*sizeof(double));
   for(i=0; i<N+2; i++)
     SinData[i]=Amplitude*sin(BeginSin+(EndSin-BeginSin)*(double)i/(double)N);

   t1=t2=t3=0;
   for(i=0; i<N; i++)
   { t1+=SinData[i]*SinData[i];
     t2+=SinData[i]*SinData[i+1];
     t3+=SinData[i]*SinData[i+2];
   }
   p1=SinData[N]*SinData[N]-SinData[0]*SinData[0];
   p2=SinData[N]*SinData[N+1]-SinData[0]*SinData[1];
   p3=SinData[N+1]*SinData[N+1]-SinData[1]*SinData[1];
//
   d = (t1+p1)*(t1+p1+p3) - (t2+p2)*(t2+p2);
   a2 = t3*(t2+p2) - t2*(t1+p1+p3);
   a3 = t2*(t2+p2) - t3*(t1+p1);

   printf("NTicks=%g\n", 2.*M_PI/atan2(sqrt(fabs(4.*a3*d-a2*a2)), -a2)); // выдача длины выборки одного периода
   return 0;
 }

Скомпилировав этот пример можно, например, его запустить с аргументами

3 9.285 2.3456789 160

что соответствуют тому, что выборка началась с 3 радиан и закончилась на 3+2*Пи, скалировка была 2.3456789, а в выборке было 160 (8КГц/50Гц) точек и лицезреть, что данных тут ровно на один период:

NTicks=159.954

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


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

7 hours ago, iiv said:

Мне ужасно стыдно, что ввел в заблуждение.

Всё нормально!))) Попробую вашу прогрмму запустить)))

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


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

А я хотел бы спросить, частота изменяется от измерения к измерению, или она просто неизвестная константа?

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


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

5 hours ago, Herz said:

А я хотел бы спросить, частота изменяется от измерения к измерению, или она просто неизвестная константа?

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

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


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

По-моему, это очень теоретически, поскольку за частотой сети следят весьма строго. Отклонение её на 2Гц - это уже, фактически аварийный режим. Вот, из Вики, что касается параметров сетевого напряжения в России:

Quote

Согласно межгосударственному стандарту ГОСТ 29322-2014 (IEC 60038:2009), сетевое напряжение должно составлять 230 В ±10 % при частоте 50 ±0,2 Гц

Понятно, что прибор должен уметь измерять частоту в более широких пределах, но так чтобы от измерения к измерению...

Я к чему. Может, фактическую частоту достаточно было бы определять гораздо более простыми способами, без привлечения столь великих учёных мужей вроде Фурье, Гильберта, Кайзера, Гаусса, Хемминга и других? А то аж дух захватывает, до чего крутая задачка это - мерить RMS сетевого напряжения. :umnik2: Тем более, как видно, время у Вас на это есть. Сигнал близок к синусу. То есть, если за 2-3 периода определять необходимое количество сэмплов (только), то всё равно ещё остаётся достаточно времени на вычисления RMS и усреднения.

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


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

1 hour ago, Herz said:

Может, фактическую частоту достаточно было бы определять гораздо более простыми способами...

так я о том же, в алгоритме, что я привел, всего 13 существенных строчек, и ни каких Фурье и Гильбертов.

Кстати, примерно 5 лет назад я что-то похожее Вам рассказывал, но, к сожалению, не смог найти ссылку, поэтому запрограммировал заново :)

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


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

2 hours ago, Herz said:

Отклонение её на 2Гц - это уже, фактически аварийный режим

Угу, но требования есть требования. Да и прибор наш аварийные режимы тоже должен регистировать. Назначение у него такое. Работает на подстанции.

2 hours ago, Herz said:

без привлечения столь великих учёных мужей вроде Фурье, Гильберта, Кайзера, Гаусса, Хемминга и других?

да нет, пусть привлекаются) Для повышения опыта полезно!

50 minutes ago, iiv said:

так я о том же, в алгоритме, что я привел, всего 13 существенных строчек, и ни каких Фурье и Гильбертов.

А не подскажете, как этот алгоритм называется? Или это просто здравый смысл?))))

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


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

1 час назад, Herz сказал:

Понятно, что прибор должен уметь измерять частоту в более широких пределах, но так чтобы от измерения к измерению...

Я к чему. Может, фактическую частоту достаточно было бы определять гораздо более простыми способами, без привлечения столь великих учёных мужей вроде Фурье, Гильберта, Кайзера, Гаусса, Хемминга и других?

Всем давным-давно уже понятно, что для вычисления RMS нет надобности измерять частоту, ни точно, ни приближенно, ни более простым способом, ни способом чуть сложнее, никак, вообще, в принципе.... А хотя нет, наверно еще не всем...  

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


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

23 minutes ago, Самурай said:

 Всем давным-давно уже понятно, что для вычисления RMS нет надобности измерять частоту, ни точно, ни приближенно, ни более простым способом, ни способом чуть сложнее, никак, вообще, в принципе.... А хотя нет, наверно еще не всем...  

Ну так возьмите идеальный синусоидальный сигнал конечной длительности и посчитайте RMS, по, например, 10, 10.25 и 10.5 периодам.

Одинаковые значения получаются?

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


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

16 минут назад, _pv сказал:

Ну так возьмите идеальный синусоидальный сигнал конечной длительности и посчитайте RMS, по, например, 10, 10.25 и 10.5 периодам.

Одинаковые значения получаются?

А с оконными функциями?

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


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

11 minutes ago, ViKo said:

А с оконными функциями?

С окном Гаусса одинаковые:

RMS.thumb.jpg.807284af9c2fea3788a8fd65f67976ab.jpg

 

PS. Амплитуда идеального синусоидального сигнала равна одному вольту, измерение на интервале 0,16 сек.

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


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

Мне тоже эта тема интересна, но предложенные варианты чересчур сложно выглядят (либо устрашающе называются):unknw:

 

Почему, например, нельзя сделать так.

1. Выделить раз на 10 измерений некий квант "определение текущей частоты".

Число 10 взято от балды, оно зависит от требуемой скорости реакции на изменение частоты сети. Но суть не в этом. Просто набираем себе отсчетов АЦП в несколько периодов измеряемого сигнала.

 

2. Ищем два однополярных экстремума путем нахождения точки перегиба "производной" сигнала. С учетом того, что частота дискретизации всегда постоянна, "производная" равна

    ADCi - ADCi-1

 

В при движении по нарастающему фронту синусоиды эта "производная" будет положительная. В верхнем экстремуме разность двух выборок будет близка к 0. И в самой верхней точке получится, что "производная" начнет увеличиваться, но уже в отрицательную сторону. Два найденных места с перегибом из положительных значений "производной" в отрицательные будут являться точками верхних экстремумов сигнала. Зная частоту семплирования, можно найти частоту входного сигнала:

    fсиг = fдискр/N,

где N - количество семплов АЦП между двумя равнозначными экстремумами.

 

Зная частоту сигнала можно динамически "подстраивать" переменную-счетчик достаточного количества отсчетов для проведения RMS по одному или нескольким периодам.

 

Плохо? Хорошо?

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

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


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

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

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

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

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

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

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

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

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

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