Jump to content
    

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

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

Share this post


Link to post
Share on other sites

Just now, haker_fox said:

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

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

Share this post


Link to post
Share on other sites

haker_fox

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

7 hours ago, iiv said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

5 hours ago, Herz said:

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

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

Share this post


Link to post
Share on other sites

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

Quote

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

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

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

Share this post


Link to post
Share on other sites

1 hour ago, Herz said:

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

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

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

Share this post


Link to post
Share on other sites

2 hours ago, Herz said:

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

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

2 hours ago, Herz said:

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

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

50 minutes ago, iiv said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

11 minutes ago, ViKo said:

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

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

RMS.thumb.jpg.807284af9c2fea3788a8fd65f67976ab.jpg

 

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

Share this post


Link to post
Share on other sites

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

 

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

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

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

 

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

    ADCi - ADCi-1

 

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

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

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

 

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

 

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

Edited by Arlleex

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...