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

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

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

 

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

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

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

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

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

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

 

Как-то плохо вникаете, в статье же всё предельно ясно и кратко изложено. Формула(3) не даёт смещения. Идеальный синус - комплексный синус. Сначала надо отладить на идеальном и получить результат не хуже чем в статье. Реальный синус уже состоит из суммы двух комплексных на положительной и отрицательной частотах, можно задавить комплексный синус на отрицательной частоте фильтром, не вносящим искажений в области 45 Гц до 55 Гц, тогда формула(3) будет работать.

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


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

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

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

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

Выше половины частоты дискретизации все фильтруется антиалисинговым фильтром.

В спектре присутствует только одна частота, например 52 Гц, отношение сигнал/шум пусть будет 40 дБ (это чтобы никто на влияние шумов не указывал).

Сигнал частотой 52 Гц я задал с генератора сигналов. В спектре вижу максимум около 52-х Гц. Дальше считаю.

А насколько идеален этот "сигнал с генератора сигналов"?

 

И какова неравномерность этого "антиалисингова фильтра" в полосе от 45 Гц до 55 Гц?

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


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

Как-то плохо вникаете, в статье же всё предельно ясно и кратко изложено. Формула(3) не даёт смещения. Идеальный синус - комплексный синус. Сначала надо отладить на идеальном и получить результат не хуже чем в статье. Реальный синус уже состоит из суммы двух комплексных на положительной и отрицательной частотах, можно задавить комплексный синус на отрицательной частоте фильтром, не вносящим искажений в области 45 Гц до 55 Гц, тогда формула(3) будет работать.

Вникаю по мере понимания материала. Все же нужно понять, протестировать.

Отлаживаю на идеальном сигнале, программно на С и С++.

Суть метода Эрика Якобсена ясна, но не ясно как с помощью МНК подобрать оптимальную кривую, да еще чтобы формула (или способ) работала в диапазоне частот.

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

Слишком много математики нужно, чтобы это все потестирвоать. Нужен не один человеко-день. Поэтому подождем с результатами по Эрику Якобсену.

 

Далее вы пишете

Реальный синус уже состоит из суммы двух комплексных на положительной и отрицательной частотах, можно задавить комплексный синус на отрицательной частоте фильтром, не вносящим искажений в области 45 Гц до 55 Гц, тогда формула(3) будет работать.

Что значит реальный синус? Сигнал с выхода датчика напряжения или трансформатора тока, нагруженного на резистор, можно считать "реальным" в вашей терминологии?

Для меня реальные сигналы, это те, которые можно задать приборами, фильтровать, измерять.

 

Тепрь как "задавить" (наверное, отфильтровать) комплексный синус на отрицательной частоте фильтром (наверное, программным цифровым фильтром). Есть несколько программ для расчета коэффициентов цифровых фильтров.

Они предполагают, что частота только положительная (в практических расчетах, академические и глубокотеоретические меня не интересуют). Вот пример скриншота WinFilter, qed2000. Т.е. ввод отрицательных частот в поля ввода программ вызывает ошибку.

 

Вот вы пишите

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

Можете объяснить, чем отличается комплексный синус от некомплексного на простом примере. Вот я с выхода датчика напряжения получаю синус амплитудой 1 вольт, частотой 50 Гц. Могу это все увидеть по осциллографу, он мне и напряжение измерит и частоту, как бы подтвердит.

 

А насколько идеален этот "сигнал с генератора сигналов"?

 

И какова неравномерность этого "антиалисингова фильтра" в полосе от 45 Гц до 55 Гц?

 

Для тестирвоания формул я программно задаю синус определенной частоты, с шагом 0,01 Гц. Т.е. можно сказать, что генератор сигналов идеальный.

 

Имею возможность проверить на реальном сигнале любой метод, пригодный для практических расчетов: 0-100 вольт, 50,00 Гц. Сигнал получается с выхода ЦАП и усиливается прецизионными ОУ.

Антиалисинговые фильтры (ФНЧ Баттерворта 4 порядка ) имеют частоту среза 1600 Гц, поэтому в полосе частот герц до 400 не ослабляют сигнал. Посчитаны в FilterPro.

 

post-62159-1447172486_thumb.png

post-62159-1447172503_thumb.png

post-62159-1447173093_thumb.png

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


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

Вникаю по мере понимания материала. Все же нужно понять, протестировать.

Отлаживаю на идеальном сигнале, программно на С и С++.

Вы вообще представляете себе, что вычисляет ПФ от конечного отрезка сигнала? Какой предполагается исходный сигнал?

Отрезок реального? Нет. ПФ вычисляет коэффициенты от периодического повторения Вашего отрезка сигнала.

Это точно Ваш сигнал? Вряд ли :biggrin:

 

Наложение окон во временной области позволяет уменьшить краевые эффекты при ПФ. Как-то так.

 

А по теории рядов Фурье - Воробьев НН Теория рядов. УДК.517.52(075.8)

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


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

Вы вообще представляете себе, что вычисляет ПФ от конечного отрезка сигнала? Какой предполагается исходный сигнал?

Отрезок реального? Нет. ПФ вычисляет коэффициенты от периодического повторения Вашего отрезка сигнала.

Это точно Ваш сигнал? Вряд ли :biggrin:

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

А вот анализируется отрезок реального, выборка из некоего количества точек, например 1024 для 1024-х точечного ДПФ или БПФ.

 

Выход фильтра - это свертка входной выборки и импульсной характеристики (коэффициенты фильтра). Т.е. фильтр вычисляет свертку. Называть можно по-разному, лишь бы понимал что делаешь и правильный ответ получался.

 

 

Наложение окон во временной области позволяет уменьшить краевые эффекты при ПФ. Как-то так.

Это известное заученное наизусть предложение. Оно как бы позволяет уменьшить ошибку после того как мы перешли "от минус бесконечности до плюс бесконечности" к выборке "1024 точки", т.е. выдрали её из пространственно временного континиума. :biggrin:

 

А по теории рядов Фурье - Воробьев НН Теория рядов. УДК.517.52(075.8)

Я хоть и про теорию рядов вообще не спрашивал и у вас в частности тоже, но просмотрел монографию.

 

Мои впечатления:

Об авторе ничего нет, зато еть бюрократическое "Допущено минобразования СССР для студентов ВТУзов", каких ВТУзов, не указывается, т.е. инженерам строителям, мостовикам или инженерам в области ЦОС. Понятно, что не последним.

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

 

Для практиков в конце книги есть глава "Применение рядов Фурье к теории изгиба Балок".

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

Берем, подставляем, отсюда следует, затем это нужно подставить в [2]...и на деревянных счетах посчитать (вряд ли у него в середине 70-х был доступ к ЭВМ, тогда бы он программу какую привел для расчета...)

post-62159-1447219649_thumb.png

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

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


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

...

 

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

 

Формула Эйлера:

https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%...%B5%D1%80%D0%B0

 

А вот и комплексный сигнал на экране прибора наблюдают:

http://electronix.ru/forum/index.php?showt...p;#entry1379445

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


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

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

Я понимаю, что вы перешли на язык абстракций.

Куда думаю смотреть, а вы "про вообще".

И что вы называете "нулевой частотой"? Постоянную составляющую или основную гармонику?

 

Я же могу создать идеальный сигнал: синус, амплитудой 100 вольт с фазовым сдвигом 30 градусов, первая гармоника.

Затем с помощью 64-х точечного ДПФ вычислить реальную и мнимую части, модуль и фазовый сдвиг для первой гармоники (могу аналогично для 2...63 гармоник).

Т.е. результат ДПФ совпадает с исходным сигналом.

Где у меня там отрицательная частота? И зачем вы мне формулу Эйлера напомнили?

 

Вот мой код для расчета ДПФ (IDE NetBeans компилятор MinGW):

#include <cstdlib>

#include "main.h"

 

using namespace std;

 

#define SAMPLES 64

float rData[sAMPLES];

float Amp=100.0F; // Амплитуда сигнала, вольт.

float fi=30.0F; // Фазовый сдвиг в градусах.

unsigned short G=1; // Номер гармоники.

float Re=0.0F, Im = 0.0F, M = 0.0F; // Реальная, мнимая и модуль.

 

int main(int argc, char** argv) {

 

// Создаем выборку.

for(int i=0;i<SAMPLES;i++)

{

rData=Amp*sin(2*M_PI*i*G/SAMPLES+2*M_PI*fi/360.0F); // 1-я гармоника.

}

 

for(int i=0;i<SAMPLES;i++)

{

Re += rData*cos(2*M_PI*i*G/SAMPLES);

}

 

for(int i=0;i<SAMPLES;i++)

{

Im += rData*sin(2*M_PI*i*G/SAMPLES);

}

 

M = sqrtf(Re*Re + Im*Im)/ (SAMPLES/2);

 

fi = atanf(Re/Im) * 360.0F/ (2.0F*M_PI) ;

 

cout << "Re = " << Re << endl; //

cout << "Im = " << Im << endl; //

cout << "M = " << M << endl; //

cout << "fi = " << fi << endl; //

 

return 0;

}

 

/*

Re = 1600

Im = 2771.28

M = 100

fi = 30

 

*/

 

Аналогичный результат расчета будет для выборки с 63-й гармоникой, но это уже эффект наложения спектра. От этого мы избавляемся с помощью антиалисинговых фильтров (в расчетах не учавствуют). Т.е. я буду учитывать только 0, 1...31 гармоники (до половины спектра).

 

Т.е. я что задал, то и получил. Можно сказать "отфильтровал". Что там еще можно отфильтровать? ведь был задан только один сигнал, представьте, что это сигнал с выхода датчика напряжения.

 

PS: Или вы как-то по другому обсчитываете сигнал и то что я вообще не учитываю (вернее учитываю, но коэффициентом 2 при расчете модуля) из-за симметрии спектра относительно половины частоты дискретизации вы переносите в область отрицательных частот? Мне не понятно.

 

PPS: Очень хотелось бы не на словах, а на примере Си-шного кода, аналогичного моему увидеть ваши расчеты (создаем один сигнал, считаем и получаем). :laughing: Желательно, чтобы сигнал был тот же самый: первая гармоника 100 вольт, 30 градусов.

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

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


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

PS: Или вы как-то по другому обсчитываете сигнал и то что я вообще не учитываю (вернее учитываю, но коэффициентом 2 при расчете модуля) из-за симметрии спектра относительно половины частоты дискретизации вы переносите в область отрицательных частот? Мне не понятно.

 

Нулевая частота = постоянка. Просто посчитайте FFT от вашего идеального синуса, постройте график, убедитесь что в спектре 2 гармошки симметричных относительно постоянки.

 

 

PPS: Очень хотелось бы не на словах, а на примере Си-шного кода, аналогичного моему увидеть ваши расчеты (создаем один сигнал, считаем и получаем). :laughing: Желательно, чтобы сигнал был тот же самый: первая гармоника 100 вольт, 30 градусов.

 

А что не на ассемблере? Сишный код это уже реализация, когда есть понимание, если понимания нет, то это всё превращается в тормоз.

 

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


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

Нулевая частота = постоянка. Просто посчитайте FFT от вашего идеального синуса, постройте график, убедитесь что в спектре 2 гармошки симметричных относительно постоянки.

Понятно, вы мне предлагаете изменить методику. Вроде понял о чем вы. Да, спектр действительно симметричный: в моем случае отностительно половины частоты дискретизации, а в вашем отностительно нуля. :rolleyes: Мы получим один результат разными способами.

 

А что не на ассемблере? Сишный код это уже реализация, когда есть понимание, если понимания нет, то это всё превращается в тормоз.

Можно и на ассемблере для Cortex M4F, там модуль FPU хороший. Есть и покруче микроконтроллеры, там вообще матричные вычисления поддерживаются, но я не думаю, что мне сейчас это нужно. К тому же совремменные компиляторы с их уровнями оптимизации сделают лучше чем я.

Я понял, что вы хотите мне результат матлаба представить? :rolleyes:

 

PS: Когда есть понимание, то и реализация есть. Я за 10 минут свой готовый код для вас подправил. Хотел ваш увидеть. Не можете на Си, покажите на любом другом языке (кроме матлабовского, хочу максимум понимания).

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

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


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

post-51730-1447241983_thumb.jpgЯкобсен-3. Максимальная ошибка измерения 45-55 Гц. ЧД=3200 дпф-512. Шум 0.1%

Красный - дополнительное подавление отрицательных частот.

 

То же, дпф-1024post-51730-1447242131_thumb.jpg

 

post-51730-1447242403_thumb.jpg дпф-1024 Шум 10%

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


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

post-51730-1447241983_thumb.jpgЯкобсен-3. Максимальная ошибка измерения 45-55 Гц. ЧД=3200 дпф-512. Шум 0.1%

Красный - дополнительное подавление отрицательных частот.

 

То же, дпф-1024post-51730-1447242131_thumb.jpg

 

Код сишный? Я бы хотел проверить его в работе (программно и/или в железе, лучше в железе). Варианта два: в виде EXE-шника или в виде *.lib библиотеки для STM32F407, это если хотите сохранить код закрытым.

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

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


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

Понятно, вы мне предлагаете изменить методику. Вроде понял о чем вы. Да, спектр действительно симметричный: в моем случае отностительно половины частоты дискретизации, а в вашем отностительно нуля. :rolleyes: Мы получим один результат разными способами.

 

Предлагаю вникать, а не лепить бездумно. Смотрите теперь как ДПФ вычисляется, не библитечная функция сишная, а формулу, один бин ДПФ - комплексный фильтр, ЧХ которого произвольно расположена относительно гармошек действительного синуса, на выходе фильтра имеем две комплексных экспоненты, вместо одной, на которую все методы вычисления частоты рассчитаны.

 

PS: Когда есть понимание, то и реализация есть. Я за 10 минут свой готовый код для вас подправил. Хотел ваш увидеть. Не можете на Си, покажите на любом другом языке (кроме матлабовского).

 

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

 

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


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

Предлагаю вникать, а не лепить бездумно. Смотрите теперь как ДПФ вычисляется, не библитечная функция сишная, а формулу, один бин ДПФ - комплексный фильтр, ЧХ которого произвольно расположена относительно гармошек действительного синуса, на выходе фильтра имеем две комплексных экспоненты, вместо одной, на которую все методы вычисления частоты рассчитаны.

Один бин ДПФ или все бины я вычислить могу.

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

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

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

 

PS: Из библиотечных сишных функций я использовал только sinf(), cosf(), sqrtf(), atanf(), т.е. синус, косинус, корень квадратный и арктангенс для чисел типа float.

 

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

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

Лучше бы было без симулинка в коде, чтобы этот код можно было без симулинка использовать и чтобы этот код был оптимизирован для ARM MCU.

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

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


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

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

Лучше бы было без симулинка в коде, чтобы этот код можно было без симулинка использовать и чтобы этот код был оптимизирован для ARM MCU.

 

Матлаб можно на рутрекере взять посмотреть.

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

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


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

Матлаб можно на рутрекере взять посмотреть.

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

 

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

Для этого файла из архива похоже нужна последняя версия. Я её так и не смог установить. Попробовал открыть седьмым, не открывает.

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

 

Я уже и про комплексный синус узнал из источника, вот скриншот одной из страниц, никогда нужно не было. Там указано, что если комплексная часть равна нулю, то комплесный синус превращается в обычный.

Интересен следующий момент, что данные с выхода АЦП не являются комплексными (например 16-ти разрядный АЦП) и при использовании комплексного БПФ комплексная выборка представлена только Re частью, а Im часть приравнивается нулю. Т.е. N выборок АЦП представляются N комплексными числами, у которых действительная часть отлична от нуля, а мнимая равна нулю. Так работает CMSIS DSP библиотека для Cortex M4F MCU.

Что-нибудь можете прояснить, что это и зачем? Т.е. я не понимаю, существует ли комплексный синус и используется ли он в практических расчетах вне матлаба.

post-62159-1447271053_thumb.png

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

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


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

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

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

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

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

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

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

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

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

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