haker_fox 151 December 27, 2018 Posted December 27, 2018 · Report post Господа, всем огромное спасибо! На праздники есть с чем разбираться! Вот ещё: пока не угладывается в голове, что делает оконная функция? Она как-то нормирует спект исходного сигнала? Не совсем всё понятно про неё. Quote Share this post Link to post Share on other sites More sharing options...
blackfin 79 December 27, 2018 Posted December 27, 2018 · Report post Just now, haker_fox said: Вот ещё: пока не угладывается в голове, что делает оконная функция? Она как-то нормирует спект исходного сигнала? Не совсем всё понятно про неё. Если вы посмотрите на определение RMS для конечного числа отсчетов дискретного сигнала, то вы увидите там формулу для обычного НЧ КИХ фильтра известного в узких кругах под названием скользящее среднее, причем на вход этого фильтра вместо отсчетов самого сигнала s(t) подают квадраты этих отсчетов: s(t)^2. Единственная функция этого НЧ фильтра, это выделение постоянной составляющей из входного сигнала s(t)^2 и подавление всех частот отличных от нуля. К сожалению, АЧХ НЧ фильтра на основе скользящего среднего далека от идеала. Помимо основной полосы пропускания на нулевой частоте в ней имеются паразитные полосы пропускания форма и положение которых в первом приближении соответствуют АЧХ заданной sinc-функцией. (Если быть совсем точным, то АЧХ скользящего среднего задается функцией Дирихле). Поэтому вместо КИХ фильтра на основе скользящего среднего для выделения НЧ составляющей сигнала используют НЧ КИХ фильтр с нужным уровнем подавления сигнала вне полосы пропускания. Такой фильтр проще всего получить выбрав в качестве импульсной характеристки фильтра любое из известных окон - Кайзера, Ханна, Гаусса, и т.п. Quote Share this post Link to post Share on other sites More sharing options...
petrov 19 December 27, 2018 Posted December 27, 2018 · Report post haker_fox Господа, всем огромное спасибо! На праздники есть с чем разбираться! Вот ещё: пока не угладывается в голове, что делает оконная функция? Она как-то нормирует спект исходного сигнала? Не совсем всё понятно про неё. DFT - банк полосовых FIR фильтров с прямоугольной огибающей, т. е. ЧХ этих фильтров - sinc. Оконная функция позволяет сделать произвольную огибающую и соответственно ЧХ. Например для вычисления амплитуд гармоник есть специальные окна flat top с плоской вершиной АЧХ в полосе частот. Quote Share this post Link to post Share on other sites More sharing options...
iiv 49 December 27, 2018 Posted December 27, 2018 · Report post 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 Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 151 December 28, 2018 Posted December 28, 2018 · Report post 7 hours ago, iiv said: Мне ужасно стыдно, что ввел в заблуждение. Всё нормально!))) Попробую вашу прогрмму запустить))) Quote Share this post Link to post Share on other sites More sharing options...
Herz 11 December 28, 2018 Posted December 28, 2018 · Report post А я хотел бы спросить, частота изменяется от измерения к измерению, или она просто неизвестная константа? Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 151 December 29, 2018 Posted December 29, 2018 · Report post 5 hours ago, Herz said: А я хотел бы спросить, частота изменяется от измерения к измерению, или она просто неизвестная константа? Если говорить строго, это сетевая частота 50 или 60 Гц. Соответственно, в зависимости от государства, она либо 50+-2 Гц, либо 60 +-2 Гц. Т.е. в пределах 4 Гц она может меняться, чисто теоретически, от измерения к измерению. Quote Share this post Link to post Share on other sites More sharing options...
Herz 11 December 29, 2018 Posted December 29, 2018 · Report post По-моему, это очень теоретически, поскольку за частотой сети следят весьма строго. Отклонение её на 2Гц - это уже, фактически аварийный режим. Вот, из Вики, что касается параметров сетевого напряжения в России: Quote Согласно межгосударственному стандарту ГОСТ 29322-2014 (IEC 60038:2009), сетевое напряжение должно составлять 230 В ±10 % при частоте 50 ±0,2 Гц Понятно, что прибор должен уметь измерять частоту в более широких пределах, но так чтобы от измерения к измерению... Я к чему. Может, фактическую частоту достаточно было бы определять гораздо более простыми способами, без привлечения столь великих учёных мужей вроде Фурье, Гильберта, Кайзера, Гаусса, Хемминга и других? А то аж дух захватывает, до чего крутая задачка это - мерить RMS сетевого напряжения. Тем более, как видно, время у Вас на это есть. Сигнал близок к синусу. То есть, если за 2-3 периода определять необходимое количество сэмплов (только), то всё равно ещё остаётся достаточно времени на вычисления RMS и усреднения. Quote Share this post Link to post Share on other sites More sharing options...
iiv 49 December 29, 2018 Posted December 29, 2018 · Report post 1 hour ago, Herz said: Может, фактическую частоту достаточно было бы определять гораздо более простыми способами... так я о том же, в алгоритме, что я привел, всего 13 существенных строчек, и ни каких Фурье и Гильбертов. Кстати, примерно 5 лет назад я что-то похожее Вам рассказывал, но, к сожалению, не смог найти ссылку, поэтому запрограммировал заново :) Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 151 December 29, 2018 Posted December 29, 2018 · Report post 2 hours ago, Herz said: Отклонение её на 2Гц - это уже, фактически аварийный режим Угу, но требования есть требования. Да и прибор наш аварийные режимы тоже должен регистировать. Назначение у него такое. Работает на подстанции. 2 hours ago, Herz said: без привлечения столь великих учёных мужей вроде Фурье, Гильберта, Кайзера, Гаусса, Хемминга и других? да нет, пусть привлекаются) Для повышения опыта полезно! 50 minutes ago, iiv said: так я о том же, в алгоритме, что я привел, всего 13 существенных строчек, и ни каких Фурье и Гильбертов. А не подскажете, как этот алгоритм называется? Или это просто здравый смысл?)))) Quote Share this post Link to post Share on other sites More sharing options...
Самурай 13 December 29, 2018 Posted December 29, 2018 · Report post 1 час назад, Herz сказал: Понятно, что прибор должен уметь измерять частоту в более широких пределах, но так чтобы от измерения к измерению... Я к чему. Может, фактическую частоту достаточно было бы определять гораздо более простыми способами, без привлечения столь великих учёных мужей вроде Фурье, Гильберта, Кайзера, Гаусса, Хемминга и других? Всем давным-давно уже понятно, что для вычисления RMS нет надобности измерять частоту, ни точно, ни приближенно, ни более простым способом, ни способом чуть сложнее, никак, вообще, в принципе.... А хотя нет, наверно еще не всем... Quote Share this post Link to post Share on other sites More sharing options...
_pv 106 December 29, 2018 Posted December 29, 2018 · Report post 23 minutes ago, Самурай said: Всем давным-давно уже понятно, что для вычисления RMS нет надобности измерять частоту, ни точно, ни приближенно, ни более простым способом, ни способом чуть сложнее, никак, вообще, в принципе.... А хотя нет, наверно еще не всем... Ну так возьмите идеальный синусоидальный сигнал конечной длительности и посчитайте RMS, по, например, 10, 10.25 и 10.5 периодам. Одинаковые значения получаются? Quote Share this post Link to post Share on other sites More sharing options...
ViKo 0 December 29, 2018 Posted December 29, 2018 · Report post 16 минут назад, _pv сказал: Ну так возьмите идеальный синусоидальный сигнал конечной длительности и посчитайте RMS, по, например, 10, 10.25 и 10.5 периодам. Одинаковые значения получаются? А с оконными функциями? Quote Share this post Link to post Share on other sites More sharing options...
blackfin 79 December 29, 2018 Posted December 29, 2018 · Report post 11 minutes ago, ViKo said: А с оконными функциями? С окном Гаусса одинаковые: PS. Амплитуда идеального синусоидального сигнала равна одному вольту, измерение на интервале 0,16 сек. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 331 December 29, 2018 Posted December 29, 2018 (edited) · Report post Мне тоже эта тема интересна, но предложенные варианты чересчур сложно выглядят (либо устрашающе называются) Почему, например, нельзя сделать так. 1. Выделить раз на 10 измерений некий квант "определение текущей частоты". Число 10 взято от балды, оно зависит от требуемой скорости реакции на изменение частоты сети. Но суть не в этом. Просто набираем себе отсчетов АЦП в несколько периодов измеряемого сигнала. 2. Ищем два однополярных экстремума путем нахождения точки перегиба "производной" сигнала. С учетом того, что частота дискретизации всегда постоянна, "производная" равна ADCi - ADCi-1 В при движении по нарастающему фронту синусоиды эта "производная" будет положительная. В верхнем экстремуме разность двух выборок будет близка к 0. И в самой верхней точке получится, что "производная" начнет увеличиваться, но уже в отрицательную сторону. Два найденных места с перегибом из положительных значений "производной" в отрицательные будут являться точками верхних экстремумов сигнала. Зная частоту семплирования, можно найти частоту входного сигнала: fсиг = fдискр/N, где N - количество семплов АЦП между двумя равнозначными экстремумами. Зная частоту сигнала можно динамически "подстраивать" переменную-счетчик достаточного количества отсчетов для проведения RMS по одному или нескольким периодам. Плохо? Хорошо? Edited December 29, 2018 by Arlleex Quote Share this post Link to post Share on other sites More sharing options...