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

Измерение частоты основной гармоники (50 Гц) с точностью 0.01 Гц

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

40-50 мс вполне достаточно. Я не собираюсь бороться с аварийным режимом с помощью измерения частоты. :wacko:

 

Не только частота уменьшается, но и амплитуда! Получаем сигнал ЧМ с АМ. Причём АМ может быть до 10%, а частота АМ - доли Герц. А при "перекосе" фаз - именно АМ, а не ЧМ играет первостепенное значение.

Неполнофазные режимы обнаруживаются с помощью вычисления отношения тока обратной последовательности к току прямой последовательности. Это отношение не зависит от нагрузки линии. Это самый последий метод, можно сказать достижение. Не по абсолютному значению тока обратной последовательности (его значение зависит от нагрузки линии), как было когда-то. В те далекие времена стояли аналоговые фильтры тока обратной последовательности и компараторы. :rolleyes:

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

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


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

... В те далекие времена стояли аналоговые фильтры тока обратной последовательности и компараторы.

И работали, кстати, без всяких "хитрых" ЦОСов :rolleyes:

 

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


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

Хммм. Нашел один из старых проектов электросчетчика, когда еще в ходу были pic18))) У меня там оказывается тоже считалась частота))) Даже по полупериоду исходного сигнала. Просто находится сумма квадратов отклонений и каждый раз диапазон сужается пополам в сторону меньшего отклонения. За 12... 15 итераций частота ищется довольно сносно. Среднее по нескольким полупериодам это уже довольно точно. Я и забыл, что такое делал. Все ПЛИС из мозга вымыли))) А на хорошем АРМе это вообще халява...

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

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


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

Pridnya

 

Выделяйте комплексным полосовым КИХ фильтром интересующий диапазон, АЧХ в полосе пропускания должна быть как можно более равномерная, гармоники(в том числе на отрицательных частотах) должны быть задавлены как можно сильнее, затем вычисляете несколько бинов ДПФ, далее по статье считаете частоту:

 

http://electronix.ru/forum/index.php?s=&am...t&p=1141831

 

Советую модельку в симулинке сделать и погонять с различными параметрами.

При 4098-ми точечном БПФ и частоте дискретизации 3200 Гц разрешение по частоте будет 3200Гц/4098 = 0,780 Гц.

Если пользоваться методом из этой статьи ( с помощью БПФ получаем центральную частоту и два соседних бина, вычисляем поправку и прибавляем её к центральной частоте), то в наихудшем случае разрешение получается еще в 10 раз лучше, т.е. разница заданной и расчитанной частот не превысит 0,078 Гц (посчитано в диапазоне 49,00-51,00 Гц через 0,01 Гц). Время, затраченное на сбор данных (4098 точек выборки с частотой дискретизации 3200 Гц) примерно 1,28 сек. Это предел метода.

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


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

разрешение

 

Не путайте точность и разрешение.

 

 

Это предел метода.

 

Что как плохо? Пределы в статье показаны, метод (3) не даёт смещения, на комплексной синусоиде без шума на порядки точность выше должна быть.

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


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

Не путайте точность и разрешение.

 

 

Что как плохо? Пределы в статье показаны, метод (3) не даёт смещения, на комплексной синусоиде без шума на порядки точность выше должна быть.

 

Я имею ввиду разрешение по частоте. Прошу прощения за неточность в терминах.

Ничего не плохо! Аппроксимация теперь выполняется по другой формуле, она даже для 1024-х точечного БПФ дает ошибку по разрешению 0,03 Гц, только вблизи N*3200/1024 ошибка больше, доходит до 0,19 Гц. А так в целом близко к желаемому.

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

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


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

Я имею ввиду разрешение по частоте.

 

Вам же частоту точнее посчитать надо, а не близкие синусиды разрешить.

 

Ничего не плохо!

 

Но оценка Якобсена гораздо лучше на 64-х точечном сигнале.

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


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

Аппроксимация теперь выполняется по другой формуле, она даже для 1024-х точечного БПФ дает ошибку по разрешению 0,03 Гц, только вблизи N*3200/1024 ошибка больше, доходит до 0,19 Гц.

А где там "формула"? Там просто бред какой-то..

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


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

Вам же частоту точнее посчитать надо, а не близкие синусиды разрешить.

 

Но оценка Якобсена гораздо лучше на 64-х точечном сигнале.

а какую из формул нужно использовать, чтобы сделать эту оценку? И еще интересно, с какой точностью (интересует количество цифр после запятой) у вас получается эта оценка.

 

Я пробовал так:

Задаю идеальный синус определенной частоты (в цикле от 45 Гц до 55 Гц, через каждые 0,01 Гц), всего 1024 выборки.

С помощью 1024-х точечного БПФ нахожу максимум и два соседних бина.

Считаю поправку.

Прибавляю её к центральному бину.

Считаю разницу между заданной частотой и расчитанной.

 

А где там "формула"? Там просто бред какой-то..

Фишка в том, что этот бред в диапазоне 45-55 Гц по двум бинам дает более точное значение чем параболическая аппроксимация по трем. И только вблизи некоторых точек погрешность больше, когда два соседних бина (по отношению к центральному) почти равны, но там другую формулу попробовать можно.

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

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


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

Фишка в том, что этот бред в диапазоне 45-55 Гц по двум бинам дает более точное значение чем параболическая аппроксимация по трем.

Фишка в том, что вы не умеете считать "параболическую аппроксимацию по трем"..

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


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

Фишка в том, что вы не умеете считать "параболическую аппроксимацию по трем"..

 

Тогда давайте вместе посчитаем. :laughing: Я считал по известной формуле, где расчитываются коэффициенты a, b, c.

 

// Три бина для 49.9092 Гц, для этой частоты парабола дает точный результат.
x1=15.0F; y1=28.9915F;
x2=16.0F; y2=999.485F;
x3=17.0F; y3=29.052F;
       
// Коэффициенты параболы.
float a = (y3 - (x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+ x1*x2);
float b = (y2-y1)/(x2-x1) - a*(x1+x2);
float c = (x2*y1 - x1*y2)/(x2-x1) + a*x1*x2;
float x = -b/(2.0F*a);
float f = x*3200.0F/1024.0F;

cout <<"a = " << a << endl;
cout <<"b = " << b << endl;
cout <<"c = " << c << endl;
cout <<"x = " << x << endl; 
cout <<"f = " << f << endl; // Искомая частота.

/*
a = -970.463
b = 31054.8
c = -247439
x = 16
f = 50
*/

А что получится у вас?

Кстати, не могли бы вы подкинуть мне методику (или даже код) для аппрроксимации с помощью МНК желатеотно на С или C++, чтобы за приемлемое время можно было подобрать аппроксимирующую кривую. Все пишут "используй МНК", а я не знаю, не помню, как это сделать "на пальцах". Я бы ваш код потестировал и программно и в железе.

 

PS: Сейчас поискал в этой ветке и нашел, что это вы "из головы" писали выкладки и утверждали, что "это абсолютно точная формула...", я был очень рад, что есть еще люди, способные писать "из головы". И теперь недоумеваю, почему такой высококвалифицированный специалист предложил такой плохой метод, ведь были же выкладки (не каждый способен писать выкладки "из головы").

Вот ссылка на ваш пост http://electronix.ru/forum/index.php?showt...t&p=1364861

 

Повторюсь, что точное значение по трем точкам удается получить только в случае идеального синуса с постоянной амплитудой (у реального сигнала в электросетях, даже отфильтрованного и при постоянной часоте амплитуда всегда меняется, причем по случайному закону, в зависимости от нагрузки на линию).

Особенно ерундово получается, если средняя точка попадает на ноль. Я тестировал метод для 64-х точечной выборки, каждый раз смещаясь на одну точку. Хотел посмотреть результат на разных участках синусоиды.

Попробовал этот алгоритм в прибор "зашить", так вообще ерунду показывает. Сейчас у меня частота измеряется с помощью компаратора и таймера и "показометр" показывает 49,95...50,05 Гц.

 

PS: А вот другой метод, ссылку на который предложил Petrov (статья Эрика Якобсена), действительно пригоден для практических расчетов , даже на микроконтроллере (ARM с модулем FPU).

 

Фишка в том, что вы не умеете считать "параболическую аппроксимацию по трем"..

PPS: Если вы не поняли или не захотели вникать в суть метода, то поясню: после расчета 1024-х точечного БПФ мы находим макимальный бин и два его соседних бина, назовем их левый и правый. Т.е. у нас получается три бина. Так вот, если левый бин не равен правому (они отличаются), то метод позволяет по двум бинам определить искомую частоту с точностью 0,03 Гц (как хотите называйте, я называю точностью разницу между заданной частотой и расчетной). Проблемы появляются в случае, когда левый бин почти равен правому, тогда разница равна 0,19 Гц.

 

Для двух бинов, максимального и следующего за ним формула такая: (16*A16+17*A17)/(A16+A17),

где 16 и 17 - индекс бина, A16 и A17 - амплитуда, соответствующего бина.

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

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


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

Тогда давайте вместе посчитаем.

 

// Три бина для 49.9092 Гц, для этой частоты парабола дает точный результат.
x1=15.0F; y1=28.9915F;
x2=16.0F; y2=999.485F;
x3=17.0F; y3=29.052F;
/*
a = -970.463
b = 31054.8
c = -247439
x = 16
f = 50
*/

А что получится у вас?

У меня получится:

 

xmax = x2 + 0.5*(y3 - y1)/(2*y2 - y3 - y1) = 16.0 + 0.5*(29.052 - 28.9915)/(2*999.485 - 29.052 - 28.9915) = 16.0 + 0.5*0.0605/1940.9265 = 16.000015585.

 

fmax = xmax*3200.0/1024.0 = 50.0000487.

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


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

У меня получится:

 

xmax = x2 + 0.25*(y3 - y1)/(2*y2 - y3 - y1) = 16.0 + 0.25*(29.052 - 28.9915)/(2*999.485 - 29.052 - 28.9915) = 16.0 + 0.25*0.0605/1940.9265 = 16.00000779267.

 

fmax = xmax*3200.0/1024.0 = 50.000024352.

 

Вот, видите сами как хорошо у вас получилось, сколько нулей после запятой. Все дело в том, что на входе БПФ была задана частота не 50, 00000 Гц, а 49,9092 Гц. Т.о. вы получили ошибку примерно 0,1 Гц. И это не смотря на то, что левый и правый бин расположен симметрично относительно максимума (все бы хорошо для хорошего результата по параболе, а его нет).

 

Теперь я использую вашу формулу для входного сигнала частотой 52,00 Гц и получаю плохой результат, разница 0,913 Гц. Это, конечно, точнее чем по максимуму БПФ, там плюс минус 3,125 Гц.

 

Но я предполагал, что вашей формулой можно пользоваться в диапазоне частот 45-55 Гц, т.е. я не планирую для каждой точки менять формулу расчета коэффициентов параболы.

 

А вот метод, который вы назвали бредом, позволяет всего по двум бинам получить отличный результат, разница не более 0,02 Гц. Причем в диапазоне частот 45-55 Гц эта формула отлично работает, там разница не более 0,03 Гц. И только рядом с N*3200/1024 есть несколько точек, где разница растет с 0,03 до 0,19 Гц. Но там, возможно, будет лучше результат по параболе.

 

Сравните свой метод и метод по двум бинам. Этот метод предложил ampersant http://www.microchip.su/showpost.php?p=218...mp;postcount=36

 

int main(int argc, char** argv) {
    
    float fin, x1, x2, x3, y1, y2, y3, xmax, fmax, deltaf;

    // *************************************************************************** //
    // Параболическая аппроксимация по вашей формуле.
    fin = 52.00;    //  Гц
    x1 = 16; y1 = 456.366F; 
    x2 = 17; y2 = 793.953F;
    x3 = 18; y3 = 205.923F;

    xmax = x2 + 0.25*(y3 - y1)/(2*y2 - y3 - y1); // = 16.0 + 0.25*(29.052 - 28.9915)/(2*999.485 - 29.052 - 28.9915) = 16.0 + 0.25*0.0605/1940.9265 = 16.00000779267.
    fmax = xmax*3200.0/1024.0;
    deltaf = fin - fmax;
    cout <<"xmax = " << xmax << endl;
    cout <<"fmax = " << fmax << endl;
    cout <<"deltaf = " << deltaf << endl;
    // xmax = 16.9324
    // fmax = 52.9136
    // deltaf = -0.91362 Гц.
    
    // *************************************************************************** //
    // Способ по двум бинам (хорошо считает, если левый бин не равен правому))
    xmax = (16*y1 + 17*y2)/(y1+y2);
    cout <<"fmax =(16*y1 + 17*y2)/(y1+y2)" << endl;
    fmax = xmax*3200.0/1024.0;
    deltaf = fin - fmax;
    cout <<"xmax = " << xmax << endl;
    cout <<"fmax = " << fmax << endl;
    cout <<"deltaf = " << deltaf << endl;
    // fmax = (16*y1 + 17*y2)/(y1+y2)
    // xmax = 16.635
    // fmax = 51.9844
    // deltaf = 0.015625   

    return 0;
}

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

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


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

Все дело в том, что на входе БПФ была задана частота не 50,00000 Гц, а 49,9092 Гц. Т.о. вы получили ошибку примерно 0,1 Гц.

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

А вы перед тем, как считать БПФ, сначала умножьте свою основную гармонику (50,00000 Гц 49,9092 Гц) на весовой множитель:

 

g(t) = exp(-t2/T2), где: T = 0.1 [сек].

 

А потом сравните ошибку метода "с параболической интерполяцией" с ошибкой своего метода "по двум бинам"..

 

PS. Формула для g(t) предполагает, что сигнал отличен от нуля на интервале времени: -Tсигн/2 ... +Tсигн/2.

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


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

А вы перед тем, как считать БПФ, сначала умножьте свою основную гармонику (50,00000 Гц 49,9092 Гц) на весовой множитель:

 

g(t) = exp(-t2/T2), где: T = 0.1 [сек].

 

А потом сравните ошибку метода "с параболической интерполяцией" с ошибкой своего метода "по двум бинам"..

 

Т.е. вы предлагаете использовать одно из окон (аналогично окнам Хэмминга, Гаусса...). У меня сейчас нет умножения выборки на окно. Его нет, но оно есть, прямоугольное окно ( допустим, что вся выборка умножается на 1). :rolleyes:

 

И почему я должен умножить, используя именно эту формулу? И почему T=0.1 секунды?

 

У меня же 1024 точки выборки. Частота дискретизации 3200 Гц. Эти 1024 точки получены за 1024*(1/3200)=0,32 секунды.

Без всяких окон получаю результат не хуже 0,19 Гц.

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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