Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение частоты основной гармоники (50 Гц) с точностью 0.01 Гц
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Страницы: 1, 2, 3, 4
blackfin
Цитата(rudy_b @ Sep 22 2015, 21:30) *
При понижении частоты самплинга (и, соответственно, снижении числа точек FFT) растет влияние шумов, соседних гармоник и т.п.
Вот результаты грубого моделирования с разной частотой самплинга на том же интервале 320 мсек Fft8k(25600Гц), Fft1k(3200Гц), Fft256(800Гц).
На входе синус 51 Гц + 10% третьей гармоники + 1% случайного шума.
1. FFT для трех случаев (8к, 1к и 256 точек)
2. Обрезали все точки выше 75 Гц и провели простейший фиттинг по гауссу.

Есть сильное подозрение, что "1% случайного шума" в первом случае (Fft8k-25600Гц) у Вас "размазан" в полосе 12800 Гц, во втором (Fft1k-3200Гц) - в полосе 1600 Гц, а в третьем (Fft256-800Гц) - в полосе 400 Гц. Соответственно, и спектральная плотность шума в полосе 75 Гц тоже отличается как (1/12800) : (1/1600) : (1/400)..
Santik
Цитата(rudy_b @ Sep 22 2015, 20:30) *
...На входе синус 51 Гц + 10% третьей гармоники + 1% случайного шума.

Код
    Value     Standard   Error
A256    y0    3.45667        0.4462
A256    xc    50.99655       0.0029
A256    w    9.04252        0.00622
A256    A    28920.49775    19.3375
A256    sigma    4.52126    0.00311
A256    FWHM    10.64675    0.00733
A256    Height    2551.85819    1.45431


Интересные результаты. А можно со случайной начальной фазой повторить? И разрядность тестового сигнала ограничить 10 бит?
Tiro
Цитата(Santik @ Sep 22 2015, 21:37) *
Интересные результаты. А можно со случайной начальной фазой повторить? И разрядность тестового сигнала ограничить 10 бит?


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

P.S.
1 Вместо случайной фазы можно взять пример с кратными соотношениями частот, проще считать. И ситуацию рассмотреть ближе к реальности, когда отрезки сигнала сшиты последовательно. Частота 50+1 Гц. Формируется сигнал длительностью 1 сек. Очевидно, что на этом интервале реализация закончится как для частоты 50 Гц, так и для частоты 51 Гц. АЦП даст 3200 отсчетов в любом случае. Затем делим сигнал на отрезки, либо по периодам частоты 50 Гц (к примеру, 5 периодов х 0,02 с = 0,1 с; либо по периодам БПФ, например 3 х БПФ-1024, остальные отсчеты оставим на след цикл). Получаем либо 10 значений аппроксимации, либо 3. (Хотя для оценки ошибки число измерений мало в любом случае). Считаем, находим матожидание, ско. Задаемся доверительной вероятностью и получаем точность результата. (Причем в условиях отсутствия систематической и случайной погрешностей измерения). Можно взять интервал 10 сек, результатов будет побольше.

2 А еще у ТС кроме 10 бит АЦП еще и кварц на МК скорее всего обычный. То есть порядки примерно 10^-4 начальное отклонение и 10^-6 на градус К температурный дрейф. Ну и джиттер частоты 10Гц/Мгц.
rudy_b
Цитата(blackfin @ Sep 22 2015, 21:21) *
Есть сильное подозрение, что "1% случайного шума" в первом случае (Fft8k-25600Гц) у Вас "размазан" в полосе 12800 Гц, во втором (Fft1k-3200Гц) - в полосе 1600 Гц, а в третьем (Fft256-800Гц) - в полосе 400 Гц. Соответственно, и спектральная плотность шума в полосе 75 Гц тоже отличается как (1/12800) : (1/1600) : (1/400)..

Модель грубая и преварительной антиалиас фильтрации не делал, поэтому естественно есть гадость от внеполосных сигналов, но основная тенденция хорошо видна.
Я хотел лишь прояснить основные моменты для ТС и на высокую точность не претендую - это просто иллюстрация. Если ему нужно - проделает все сам, надеюсь, что объяснил достаточно понятно.

А 1% шума - это на всякий случай, в том числе и учет погрешности и разрядности АЦП.
Цитата(Santik @ Sep 22 2015, 21:37) *
Интересные результаты. А можно со случайной начальной фазой повторить? И разрядность тестового сигнала ограничить 10 бит?

Многократно проверялось - при правильном окне гаусса влияние фазы пренебрежимо мало (порядка 10^-5). Но можете сами проверить, сигма гаусса - 900 для 8к и соответственно меньше для 1к и 256.
Разрядность АЦП - это тот же 1% шума. Он, конечно, случайный, а не систематический, но, если есть желание - легко считается любой. Хотя неслучайный шум - это, фактически, нелинейные искажения порождающие верхние гармоники, а они отсекаются.

Цитата(Tiro @ Sep 23 2015, 01:12) *
Прошу иметь в виду, что стандартные отклонения в данном случае характеризуют ошибки параметров кривой аппроксимации, вычисленных по точкам, и ничего более. Скорее всего на одном отрезке сигнала.

В данном случае стандартные отклонения - это честно посчитанные ошибки определения каждого из параметров при фиттинге. Сигнал генерировался независимо для каждого случая и 1% вклад rnd() ессно варьировался.

Цитата
2 А еще у ТС кроме 10 бит АЦП еще и кварц на МК скорее всего обычный. То есть порядки примерно 10^-4 начальное отклонение и 10^-6 на градус К температурный дрейф. Ну и джиттер частоты 10Гц/Мгц.

Уход кварца это уже систематическая ошибка. А джиттер... Такой кварц еще поискать нужно. Хотя, на плохом генераторе...
Pridnya
Цитата(rudy_b @ Sep 22 2015, 20:30) *
Куда-то вас не туда понесло, все намного проще - важно выбрать временной интервал и частоту самплинга. Временной интервал - отдельный вопрос, чем он меньше - тем дальше разнесены бины и тем ниже точность определения частоты.
При понижении частоты самплинга (и, соответственно, снижении числа точек FFT) растет влияние шумов, соседних гармоник и т.п.

Я уже писал про параметры измерения частоты (25600 Гц, 320 мсек, окно Гаусса, FFT 8к), но вам такая точность, похоже, не нужна.
Вот результаты грубого моделирования с разной частотой самплинга на том же интервале 320 мсек Fft8k(25600Гц), Fft1k(3200Гц), Fft256(800Гц).
На входе синус 51 Гц + 10% третьей гармоники + 1% случайного шума.
...

Спасибо за метод и результаты моделирования! laughing.gif
EvgenyNik
Pridnya, Вы пишите, что хотелось бы определить частоту на 1 (в крайнем случае на 5) периодах с квантованием по времени на частоте 3200Гц и по уровню 16-битным АЦП.
Прежде чем упражняться с алгоритмами и читать дремучие теории (а это, всё равно, надо делать, конечно), предлагаю Вам построить 1 (или 5) период(ов) для частот 49.99, 50.00 и 50.01 по точкам на вашей частоте дискретизации, заложив в эти выборки, для начала, округление до целого (15 бит + знак) и шум АЦП, хотя бы, +/-1LSB.
У Вас для одного периода получится 64 точки. А теперь берёте и накладываете друг на друга 64 точки квантованных отсчётов с шумом для 49.99, 50.00 и 50.01 и смотрите - отличаются ли достоверно они друг от друга на интервале в 1 период? А на 5 периодах сильно отличаются?
_pv
Цитата
А теперь берёте и накладываете друг на друга 64 точки квантованных отсчётов с шумом для 49.99, 50.00 и 50.01 и смотрите - отличаются ли достоверно они друг от друга на интервале в 1 период? А на 5 периодах сильно отличаются?

Видишь суслика? — Нет! — И я не вижу. А он есть!

Если взять и сделать тупо фит синуса по зашумлённым данным с уровнем шума в 10% , то, по пяти периодам, среднеквадратичная ошибка определения частоты - 0.026Гц.
а с 1% шума - 0.0026Гц.
Нажмите для просмотра прикрепленного файла
rudy_b
Кстати о фите. На самом деле именно фит не нужен - я его просто по лени использовал и чтобы ошибки наглядно и честно считались. В реальной проге используется МНК (метод наименьших квадратов) для гаусса с весами. Писать его несколько заморочно, зато сразу дает результат без всяких итераций, а реальные ошибки в проге не нужны. Можно и МНК для параболы - но результат менее точен.
EvgenyNik
Цитата(_pv @ Sep 23 2015, 18:18) *
Если взять и сделать тупо фит синуса по зашумлённым данным с уровнем шума в 10% , то, по пяти периодам, среднеквадратичная ошибка определения частоты - 0.026Гц. а с 1% шума - 0.0026Гц.
Ну так и я о том же. Надо, конечно, ещё учесть неизбежное присутствие гармоник низкочастотного диапазона, а не только шумов и то, что код АЦП будет, вероятно, недоиспользован. Но на 5 периодах задача скорее решаема, а вот на 1-ом - сомнительно.
Pridnya
Цитата(EvgenyNik @ Sep 23 2015, 16:18) *
Pridnya, Вы пишите, что хотелось бы определить частоту на 1 (в крайнем случае на 5) периодах с квантованием по времени на частоте 3200Гц и по уровню 16-битным АЦП.
Прежде чем упражняться с алгоритмами и читать дремучие теории (а это, всё равно, надо делать, конечно), предлагаю Вам построить 1 (или 5) период(ов) для частот 49.99, 50.00 и 50.01 по точкам на вашей частоте дискретизации, заложив в эти выборки, для начала, округление до целого (15 бит + знак) и шум АЦП, хотя бы, +/-1LSB.
У Вас для одного периода получится 64 точки. А теперь берёте и накладываете друг на друга 64 точки квантованных отсчётов с шумом для 49.99, 50.00 и 50.01 и смотрите - отличаются ли достоверно они друг от друга на интервале в 1 период? А на 5 периодах сильно отличаются?

Предлагаю вам самому воспользоваться своей методикой. biggrin.gif И мы все просвятимся, и за одно посмотрим, что у вас получилось.
Я так понимаю, вы сами заинтересованы в результате. Вообще, то, что вы предлагаете я называю "суррогатная инженерия", когда человек тестирует свои идеи на других и получает результат. Раздал так всем задания и через недельку собрал у всех результаты, как шустрый профессор в институте.

Цитата(EvgenyNik @ Sep 23 2015, 22:29) *
Ну так и я о том же. Надо, конечно, ещё учесть неизбежное присутствие гармоник низкочастотного диапазона, а не только шумов и то, что код АЦП будет, вероятно, недоиспользован. Но на 5 периодах задача скорее решаема, а вот на 1-ом - сомнительно.

У вас там в Чебоксарах несколько крупных предприятий, которые выпускают РЗА (ЧЭАЗ, Экра, Бреслер, ABB, ...ВНИИР) вы часом ни на одном из них работаете? Вряд ли бы вы мне посоветовали последний метод (достижение вашего коллектива), скорее увели бы в сторону. biggrin.gif Я периодически просматриваю технические описания устройств и не только из города вашей регистрации, но и импортные. Есть устройства, которые измеряют сетевую частоту с точностью не то что 0,01 Гц, а 0,001Гц (оно может и не требуется, но будет впечатлять заказчика). rolleyes.gif И скорость изменения частоты измеряют достаточно точно и быстро.
Krys
Цитата(Pridnya @ Sep 24 2015, 13:48) *
У вас там в Чебоксарах
Вам-то хорошо гадать про других людей, сами-то о себе никакой информации в профиле вообще не оставили... Вы из какого города?
Pridnya
Цитата(Krys @ Sep 24 2015, 10:40) *
Вам-то хорошо гадать про других людей, сами-то о себе никакой информации в профиле вообще не оставили... Вы из какого города?

Только никому не говорите! Из первого лунного поселения. 1111493779.gif Мы уже здесь. rolleyes.gif
_pv
Цитата(EvgenyNik @ Sep 24 2015, 01:29) *
Но на 5 периодах задача скорее решаема, а вот на 1-ом - сомнительно.

вопрос лишь в С/Ш который для одного периода нужен на порядок лучше.
если те же вычисления что выше проделать для одного периода, а не для пяти, среднеквадратичная ошибка получается:
шум 10% - 0.261624Гц
шум 1% - 0.0292907Гц
шум 0.1% - 0.00299302Гц

Плюс вольфрамовский findfit пытается решить задачу в несколько общем случае и иногда поругивается, что за заданное количество итераций решение не полностью сошлось.
Соответственно для фита именно синуса там есть что поотимизировать.
EvgenyNik
Да простят меня форумчане за оффтоп...
Цитата(Pridnya @ Sep 24 2015, 09:48) *
Предлагаю вам самому воспользоваться своей методикой. biggrin.gif И мы все просвятимся, и за одно посмотрим, что у вас получилось. Я так понимаю, вы сами заинтересованы в результате. Вообще, то, что вы предлагаете я называю "суррогатная инженерия", когда человек тестирует свои идеи на других и получает результат. Раздал так всем задания и через недельку собрал у всех результаты, как шустрый профессор в институте.
Коллега, иронизировать, подозревать и приписывать тремор собственной фантазии мотивам других людей - это, конечно, ваше право. Но повторюсь, что первым логичным шагом является оценка реального соотношения сигнал/шум в вашей системе и его сопоставление с соотношением сигналF1/(невязка F1 и F2) на интересующем Вас интервале. Мне периодически приходится "возвращать на квантованную целочисленную и шумящую землю" алгоритмистов, "парящих в double float-замках идеальных синусов, экспонент и нулевых смещений".
Цитата
вы часом ни на одном из них работаете?
Да. Но, к счастью, работа не обязывает меня искать ведьм на форумах и играть в Сусанина.
Цитата
Вряд ли бы вы мне посоветовали последний метод (достижение вашего коллектива), скорее увели бы в сторону.
Метод переходов через ноль или сверки вектора с эталоном я даже не упомянул, действительно. Но только потому, что это не то, что Вам нужно, т.к. ни на 1, ни на 5 периодах об искомой точности частоты речи даже и не будет.
Цитата
Есть устройства, которые измеряют сетевую частоту с точностью не то что 0,01 Гц, а 0,001Гц (оно может и не требуется, но будет впечатлять заказчика). И скорость изменения частоты измеряют достаточно точно и быстро.
sm.gif Под разработанную под себя методику проверки можно заточить и соответствующую методику измерения. Другое дело - если на это устройство есть свидетельство об утверждении типа измерения, где декларируются соответствующие характеристики измерения именно частоты, тогда это, и правда, серьёзно.
Напрасно Вы, это был добрый совет, не более.
Tanya
Вот уже за сотню постов перевалило, а истины все нет...
Не могу молчать и скажу.
Задача поставлена некорректно. Посмотрим на желания автора.
Хочется измерить частоту основной гармоники (первый пост) и, одновременно сделать это как можно быстрее (из многочисленных следующих).
В чем тут противоречие?
Когда мы пишем про основную гармонику мы неявно уже предполагаем, что имеем бесконечный стационарный периодический сигнал.
Но хочется нечто оценить за конечный временной интервал...
Вот, допустим, мы имеем измеренную пилу - нечто почти периодическое и длительность между нулями немного отличается. И измерили только вот эти два квазипериода очень точно. Какова будет оценка частоты? Будет три ответа - обратная величина от одного и второго промежутка времени (между нулями) и их среднее. Эти величины относятся к разным временам и являются оценкой средней квазичастоты.
Это я к тому, что нужно точно понять, что хотим получить. Кого обмануть кроме себя....
Corner
Цитата(Tanya @ Sep 24 2015, 18:16) *
Вот уже за сотню постов перевалило, а истины все нет...
Не могу молчать и скажу.
Задача поставлена некорректно. Посмотрим на желания автора.
Хочется измерить частоту основной гармоники (первый пост) и, одновременно сделать это как можно быстрее (из многочисленных следующих).
В чем тут противоречие?
Когда мы пишем про основную гармонику мы неявно уже предполагаем, что имеем бесконечный стационарный периодический сигнал.
Но хочется нечто оценить за конечный временной интервал...
Вот, допустим, мы имеем измеренную пилу - нечто почти периодическое и длительность между нулями немного отличается. И измерили только вот эти два квазипериода очень точно. Какова будет оценка частоты? Будет три ответа - обратная величина от одного и второго промежутка времени (между нулями) и их среднее. Эти величины относятся к разным временам и являются оценкой средней квазичастоты.
Это я к тому, что нужно точно понять, что хотим получить. Кого обмануть кроме себя....


Надо понимать, что не зная частоты, считать сколько периодов сигнала имеется в наличии весьма интересный подход из разряда "если сейчас из ямы не вылезу - побегу домой за лестницей")))
EvgenyNik
Цитата(Corner @ Sep 24 2015, 22:52) *
Надо понимать, что не зная частоты, считать сколько периодов сигнала имеется в наличии весьма интересный подход из разряда "если сейчас из ямы не вылезу - побегу домой за лестницей")))
ТС в середине темы уточнил:
Цитата(Pridnya @ Sep 10 2015, 00:03) *
Речь идет об электрораспределительной сети.
В сети всегда есть основная гармоника и гармоники до 13-й, но основная всегда около 50 Гц, например 45-55 Гц.
А это значит, что примерно, всё-таки, известно. Более того, более-менее стандартны интервалы времени, на которые энергосистема может вываливаться на величину конкретного отклонения.
Santik
Цитата(EvgenyNik @ Sep 25 2015, 08:22) *
А это значит, что примерно, всё-таки, известно. Более того, более-менее стандартны интервалы времени, на которые энергосистема может вываливаться на величину конкретного отклонения.

А еще реальная энергосистема может "вываливаться" не только по частоте, но и по амплитуде. Т.е. в реальном сигнале присутствует еще и амплитудная модуляция :-(
Не совсем понятен физический смысл измерения частоты "основной гармоники" с такой точностью...
Pridnya
Цитата(EvgenyNik @ Sep 24 2015, 16:27) *
...Но повторюсь, что первым логичным шагом является оценка реального соотношения сигнал/шум в вашей системе и его сопоставление с соотношением сигналF1/(невязка F1 и F2) на интересующем Вас интервале. Мне периодически приходится "возвращать на квантованную целочисленную и шумящую землю" алгоритмистов, "парящих в double float-замках идеальных синусов, экспонент и нулевых смещений".
...
Напрасно Вы, это был добрый совет, не более.

Значит я угадал, вы из тех самых разработчиков и это особенно приятно. rolleyes.gif

Цитата(Tanya @ Sep 24 2015, 17:16) *
Вот уже за сотню постов перевалило, а истины все нет...
Не могу молчать и скажу.
Задача поставлена некорректно. Посмотрим на желания автора.

Ваш пост больше похож на психоанализ и желание полечить (имхо). Ничего дельного, одни рассуждения.
Советую ознакомитсься с ресурсами
Творчество душевнобольных и его влияние на развитие науки, искусства и техники Карпов П.И.
Гениальность и помешательство, Чезаре Ломброзо.
И классика по теме не повредит, так, для общего развития, чтобы не было желания "давить и не пущать..." wacko.gif
почитать можно на сайте НЦПЗ.
Цитата(EvgenyNik @ Sep 25 2015, 08:22) *
ТС в середине темы уточнил:
А это значит, что примерно, всё-таки, известно. Более того, более-менее стандартны интервалы времени, на которые энергосистема может вываливаться на величину конкретного отклонения.

Вот внимательный товарищ вам, Tanya, напомнил, что частота всё-таки известна 45-55 Гц. rolleyes.gif
Цитата(Santik @ Sep 25 2015, 09:38) *
А еще реальная энергосистема может "вываливаться" не только по частоте, но и по амплитуде. Т.е. в реальном сигнале присутствует еще и амплитудная модуляция :-(
Не совсем понятен физический смысл измерения частоты "основной гармоники" с такой точностью...

Амплитудная модуляция - термин, относящийся больше к системам связи (связь с амплитудной модуляцией). В энергосетях немного другие терминц "биения частоты", "аварийный режим", вот их и нужно фиксировать и принимать решение (отключать или сигнализировать). И хочется сделать хорошо, достоверно. Можем же фиксировать и бороться с аврийными режимами за 40-50 мс. И хочется также хорошо, по крайней мере как можно лучше и быстрее определять частоту и скорость её изменения. И здесь все советы принимаются, даже самые безумные (на первый взгляд), а люди у нас умные (сообщество), если что отсеят. laughing.gif

PS: А физический смысл таков: частота основной гармоники в сети определяется частотой вращения генератора. При перегрузке частота вращения генератора может снижаться. Возможны случаи, когда линия имеет двусторонее питание, там требуется обеспечить синхронизм обоих источников. В общем, хочется контролировать частоту основной гармоники и скорость её изменения.

PPS: Простейшая модель линии с двухсторонним питанием, частота одного источника 50 Гц, второго 45 Гц, оба работают на общую нагрузку. В нагрузке появятся биения частотой 5 Гц (можно сказать "амплитудная модуляция").
Santik
Цитата(Pridnya @ Sep 25 2015, 10:13) *
... Можем же фиксировать и бороться с аврийными режимами за 40-50 мс. И хочется также хорошо, по крайней мере как можно лучше и быстрее определять частоту и скорость её изменения.

При перегрузках по току можно и за меньшее время с аварийными режимами бороться - а с помощью измерения частоты - проблематично.
Цитата(Pridnya @ Sep 25 2015, 10:13) *
...частота основной гармоники в сети определяется частотой вращения генератора. При перегрузке частота вращения генератора может снижаться. Возможны случаи, когда линия имеет двусторонее питание, там требуется обеспечить синхронизм обоих источников. В общем, хочется контролировать частоту основной гармоники и скорость её изменения.

Не только частота уменьшается, но и амплитуда! Получаем сигнал ЧМ с АМ. Причём АМ может быть до 10%, а частота АМ - доли Герц. А при "перекосе" фаз - именно АМ, а не ЧМ играет первостепенное значение.
Pridnya
Цитата(Santik @ Sep 25 2015, 12:09) *
При перегрузках по току можно и за меньшее время с аварийными режимами бороться - а с помощью измерения частоты - проблематично.

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

Цитата(Santik @ Sep 25 2015, 12:09) *
Не только частота уменьшается, но и амплитуда! Получаем сигнал ЧМ с АМ. Причём АМ может быть до 10%, а частота АМ - доли Герц. А при "перекосе" фаз - именно АМ, а не ЧМ играет первостепенное значение.

Неполнофазные режимы обнаруживаются с помощью вычисления отношения тока обратной последовательности к току прямой последовательности. Это отношение не зависит от нагрузки линии. Это самый последий метод, можно сказать достижение. Не по абсолютному значению тока обратной последовательности (его значение зависит от нагрузки линии), как было когда-то. В те далекие времена стояли аналоговые фильтры тока обратной последовательности и компараторы. rolleyes.gif
Santik
Цитата(Pridnya @ Sep 25 2015, 12:19) *
... В те далекие времена стояли аналоговые фильтры тока обратной последовательности и компараторы.

И работали, кстати, без всяких "хитрых" ЦОСов rolleyes.gif
Corner
Хммм. Нашел один из старых проектов электросчетчика, когда еще в ходу были pic18))) У меня там оказывается тоже считалась частота))) Даже по полупериоду исходного сигнала. Просто находится сумма квадратов отклонений и каждый раз диапазон сужается пополам в сторону меньшего отклонения. За 12... 15 итераций частота ищется довольно сносно. Среднее по нескольким полупериодам это уже довольно точно. Я и забыл, что такое делал. Все ПЛИС из мозга вымыли))) А на хорошем АРМе это вообще халява...
Pridnya
Цитата(petrov @ Sep 10 2015, 01:39) *
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 сек. Это предел метода.
petrov
Цитата(Pridnya @ Nov 9 2015, 12:02) *
разрешение


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


Цитата(Pridnya @ Nov 9 2015, 12:02) *
Это предел метода.


Что как плохо? Пределы в статье показаны, метод (3) не даёт смещения, на комплексной синусоиде без шума на порядки точность выше должна быть.
Pridnya
Цитата(petrov @ Nov 9 2015, 14:07) *
Не путайте точность и разрешение.


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


Я имею ввиду разрешение по частоте. Прошу прощения за неточность в терминах.
Ничего не плохо! Аппроксимация теперь выполняется по другой формуле, она даже для 1024-х точечного БПФ дает ошибку по разрешению 0,03 Гц, только вблизи N*3200/1024 ошибка больше, доходит до 0,19 Гц. А так в целом близко к желаемому.
petrov
Цитата(Pridnya @ Nov 9 2015, 14:58) *
Я имею ввиду разрешение по частоте.


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

Цитата(Pridnya @ Nov 9 2015, 14:58) *
Ничего не плохо!


Но оценка Якобсена гораздо лучше на 64-х точечном сигнале.
blackfin
Цитата(Pridnya @ Nov 9 2015, 14:58) *
Аппроксимация теперь выполняется по другой формуле, она даже для 1024-х точечного БПФ дает ошибку по разрешению 0,03 Гц, только вблизи N*3200/1024 ошибка больше, доходит до 0,19 Гц.

А где там "формула"? Там просто бред какой-то..
Pridnya
Цитата(petrov @ Nov 9 2015, 15:34) *
Вам же частоту точнее посчитать надо, а не близкие синусиды разрешить.

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

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

Я пробовал так:
Задаю идеальный синус определенной частоты (в цикле от 45 Гц до 55 Гц, через каждые 0,01 Гц), всего 1024 выборки.
С помощью 1024-х точечного БПФ нахожу максимум и два соседних бина.
Считаю поправку.
Прибавляю её к центральному бину.
Считаю разницу между заданной частотой и расчитанной.

Цитата(blackfin @ Nov 9 2015, 16:14) *
А где там "формула"? Там просто бред какой-то..

Фишка в том, что этот бред в диапазоне 45-55 Гц по двум бинам дает более точное значение чем параболическая аппроксимация по трем. И только вблизи некоторых точек погрешность больше, когда два соседних бина (по отношению к центральному) почти равны, но там другую формулу попробовать можно.
blackfin
Цитата(Pridnya @ Nov 9 2015, 22:52) *
Фишка в том, что этот бред в диапазоне 45-55 Гц по двум бинам дает более точное значение чем параболическая аппроксимация по трем.

Фишка в том, что вы не умеете считать "параболическую аппроксимацию по трем"..
Pridnya
Цитата(blackfin @ Nov 10 2015, 05:17) *
Фишка в том, что вы не умеете считать "параболическую аппроксимацию по трем"..


Тогда давайте вместе посчитаем. laughing.gif Я считал по известной формуле, где расчитываются коэффициенты 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).

Цитата(blackfin @ Nov 10 2015, 05:17) *
Фишка в том, что вы не умеете считать "параболическую аппроксимацию по трем"..

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

Для двух бинов, максимального и следующего за ним формула такая: (16*A16+17*A17)/(A16+A17),
где 16 и 17 - индекс бина, A16 и A17 - амплитуда, соответствующего бина.
blackfin
Цитата(Pridnya @ Nov 10 2015, 08:36) *
Тогда давайте вместе посчитаем.

Код
// Три бина для 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.
Pridnya
Цитата(blackfin @ Nov 10 2015, 10:49) *
У меня получится:

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;
}
blackfin
Цитата(Pridnya @ Nov 10 2015, 11:38) *
Все дело в том, что на входе БПФ была задана частота не 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.
Pridnya
Цитата(blackfin @ Nov 10 2015, 12:11) *
А вы перед тем, как считать БПФ, сначала умножьте свою основную гармонику (50,00000 Гц 49,9092 Гц) на весовой множитель:

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

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


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

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

У меня же 1024 точки выборки. Частота дискретизации 3200 Гц. Эти 1024 точки получены за 1024*(1/3200)=0,32 секунды.
Без всяких окон получаю результат не хуже 0,19 Гц.
blackfin
Цитата(Pridnya @ Nov 10 2015, 12:33) *
И почему я должен умножить используя именно эту формулу? И почему T=0.1 секунды?

Вы по ссылке то из поста #134 ходили?
Pridnya
Цитата(blackfin @ Nov 10 2015, 12:11) *
А вы перед тем, как считать БПФ, сначала умножьте свою основную гармонику (50,00000 Гц 49,9092 Гц) на весовой множитель:

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

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

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


Извините, но мне совсем не понятно, как и зачем умножать. Единственное, что я понял, так это то, что вы предлагаете умножать на затухающую экспоненту (посмотрел g(t) для 32-х точек, через каждые 0,000625 секунд). Т.е. это не окно Гаусса...половина окна Гаусса что ли?
Даже не понимаю, откуда возник такой способ. Это авторская методика? Где почитать про это вообще?
Всю выборку что ли умножить на затухающую экспоненту?
Код
float t=0.0F;
float T=0.1F;
int SAMPLES = 32;
float g[SAMPLES];
for(int i=0;i<SAMPLES;i++)
    {
    g[i]= expf(-(t*t/T*T));        
    cout<<"g["<<i<<"]="<<g[i]<<endl;
    t+=0.000625F;
    }
    /*
g[0]=1
g[1]=1
g[2]=1
g[3]=0.999999
g[4]=0.999998
g[5]=0.999998
g[6]=0.999996
g[7]=0.999995
g[8]=0.999994
g[9]=0.999992
g[10]=0.99999
g[11]=0.999988
g[12]=0.999986
g[13]=0.999983
g[14]=0.999981
g[15]=0.999978
g[16]=0.999975
g[17]=0.999972
g[18]=0.999968
g[19]=0.999965
g[20]=0.999961
g[21]=0.999957
g[22]=0.999953
g[23]=0.999948
g[24]=0.999944
g[25]=0.999939
g[26]=0.999934
g[27]=0.999929
g[28]=0.999923
g[29]=0.999918
g[30]=0.999912
g[31]=0.999906
*/


Цитата(blackfin @ Nov 10 2015, 12:38) *
Вы по ссылке то из поста #134 ходили?

По ссылке ходил. Вообще ничего теперь не понимаю. Что это и как этим пользоваться.
Serg76
Окно необходимо только в случае, если в спектре кроме интересующей гармоники присутствуют еще какие либо мешающие воздействия, при наличии только "чистой" синусоиды лучшее окно - это прямоугольное, т. е. никакого.
blackfin
Цитата(Serg76 @ Nov 10 2015, 14:11) *
Окно необходимо только в случае, если в спектре кроме интересующей гармоники присутствуют еще какие либо мешающие воздействия, при наличии только "чистой" синусоиды лучшее окно - это прямоугольное, т. е. никакого.

Вы забыли про отрицательные частоты в спектре вещественного сигнала: f- = -50 [Гц], f+ = +50 [Гц].
Pridnya
Цитата(blackfin @ Nov 10 2015, 14:31) *
Вы забыли про отрицательные частоты в спектре вещественного сигнала: f- = -50 [Гц], f+ = +50 [Гц].


А можно от абстрактного уровня перейти поближе к физическому. Если спектр состоит из одних амплитуд и отражает картину происходящего (максимум соответствует заданной частоте). Как мне на выходе БПФ ощутить наличие отрицательных частот и как это связано с предложенной вами формулой? И вообще, вписывается ли такая методика в какую-либо нацчную концепцию. А то я вижу, что вы называете "окном Гаусса" совсем другую функцию
Цитата
На практике, для окна Гаусса заданного формулой:

g(t) = exp(-t2/T2),


, не похожую на функцию Гаусса.

Выше половины частоты дискретизации все фильтруется антиалисинговым фильтром. В спктре присутствует только одна частота, например 52 Гц, отношение сигнал/шум пусть будет 40 дБ (это чтобы никто на влияние шумов не указывал). Сигнал частотой 52 Гц я задал с генератора сигналов. В спектре вижу максимум около 52-х Гц. Дальше считаю.
blackfin
Формулу поправьте:

Код
int SAMPLES = 32;
float g[SAMPLES];
for(int i=0;i<SAMPLES;i++)
{
    g[i]= expf(-((0.16/0.1)*(0.16/0.1)*(i-SAMPLES/2+0.5)*(i-SAMPLES/2+0.5)/((SAMPLES/2)*(SAMPLES/2))));        
    cout<<"g["<<i<<"]="<<g[i]<<endl;
}


См. Gaussian_window.
Pridnya
Цитата(blackfin @ Nov 10 2015, 14:42) *
Формулу поправьте:

Код
int SAMPLES = 32;
float g[SAMPLES];
for(int i=0;i<SAMPLES;i++)
{
    g[i]= expf(-((0.16/0.1)*(0.16/0.1)*(i-SAMPLES/2+0.5)*(i-SAMPLES/2+0.5)/(SAMPLES*SAMPLES)));        
    cout<<"g["<<i<<"]="<<g[i]<<endl;
}


Формулу поправил. Теперь она чем-то на верхнюю часть функции Гаусса похожа ( дуга какая-то, на рисунке для 32-х точек, для примера).

Теперь мне нужно всю выборку, все мои 1024 точек выборки умножить на такое окно?
blackfin
Цитата(Pridnya @ Nov 10 2015, 14:55) *
Формулу поправил. Теперь она чем-то на верхнюю часть функции Гаусса похожа ( дуга какая-то, на рисунке для 32-х точек, для примера).

Что-то не так поправили.

На границе окна функция g(t) должна спадать до: g(0.16[сек]) = exp(-1.6*1.6) = exp(-2.56) = 0,0773.

То есть, почти до нуля..
Цитата(Pridnya @ Nov 10 2015, 14:55) *
Теперь мне нужно всю выборку, все мои 1024 точек выборки умножить на такое окно?

Ессно..
Pridnya
Цитата(blackfin @ Nov 10 2015, 15:01) *
Что-то не так поправили.

На границе окна функция g(t) должна спадать до: g(0.16[сек]) = exp(-1.6*1.6) = exp(-2.56) = 0,0773.

То есть, почти до нуля..

Ессно..


Я не правил, с скопировал из вашего поста "как есть"
Цитата
g[i]= expf(-((i-SAMPLES/2+0.5)*(i-SAMPLES/2+0.5)/(SAMPLES*SAMPLES)));

, затем вставил в свой код Посчитал коэффициенты этого окна, умножил на 1000 и через Open Office Calc и таблицу Столбец А - индекс, столбец B - значение, посторил диаграмму XY. Это чтобы иметь представление, какая там кривая за формулой скрывается.

Теперь поправил (везде float-ы):
g[i]= expf(-((0.16F/0.1F)*(0.16F/0.1F)*(i-SAMPLES/2.0F+0.5F)*(i-SAMPLES/2.0F+0.5F)/(SAMPLES*SAMPLES)));
результат изменися, но все равно не похож на функцию Гаусса.

PS: Что правил, что нет, а результат изменился не значительно. По двум бинам точнее в разы. Но после этого окна формула по двум бинам даёт большую ошибку, чем без окна вообще. Это окно плохо влияет на оценку частоты. Оно как-то пропорционально уменьшило все бины.
Код
fin = 52.00;    //  Гц
    // Бины без окна.
    x1 = 16; y1 = 456.366F;
    x2 = 17; y2 = 793.953F;
    x3 = 18; y3 = 205.923F;
    // xmax = 16.9324
    // fmax = 52.9136
    // deltaf = -0.91362 Гц.
    
    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 <<"fin = " << fin << endl;
    cout <<"xmax = " << xmax << endl;
    cout <<"fmax = " << fmax << endl;
    cout <<"deltaf = " << deltaf << endl;
    
    // Бины после окна.
    x1=16; y1=439.371F;    
    x2=17; y2=680.025F;
    x3=18; y3=84.8844F;
    //xmax = 16.894
    //fmax = 52.7936
    //deltaf = -0.793648

    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 <<"fin = " << fin << endl;
    cout <<"xmax = " << xmax << endl;
    cout <<"fmax = " << fmax << endl;
    cout <<"deltaf = " << deltaf << endl;
    
    // *************************************************************************** //
    // Способ по двум бинам (хорошо считает, если левый бин не равен правому))
    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 <<"fin = " << fin << endl;
    cout <<"xmax = " << xmax << endl;
    cout <<"fmax = " << fmax << endl;
    cout <<"deltaf = " << deltaf << endl;
    //fmax = (16*y1 + 17*y2)/(y1+y2)
    //xmax = 16.6075
    //fmax = 51.8984
    //deltaf = 0.101585
thermit
Код
g[i]= expf(-((0.16F/0.1F)*(0.16F/0.1F)*(i-SAMPLES/2.0F+0.5F)*(i-SAMPLES/2.0F+0.5F)/(SAMPLES*SAMPLES)));


SAMPLES -> SAMPLES/2
Pridnya
Цитата(thermit @ Nov 10 2015, 15:23) *
Код
g[i]= expf(-((0.16F/0.1F)*(0.16F/0.1F)*(i-SAMPLES/2.0F+0.5F)*(i-SAMPLES/2.0F+0.5F)/(SAMPLES*SAMPLES)));


SAMPLES -> SAMPLES/2

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

К этому посту мы родили окно:
g[i]= expf(-((0.16F/0.1F)*(0.16F/0.1F)*(i-SAMPLES/2.0F+0.5F)*(i-SAMPLES/2.0F+0.5F)/((SAMPLES/2.0F)*(SAMPLES/2.0F))));

PS: И даже после умножения выборки на это правильное окно результат улучшился незначительно.
Цитата
// БПФ без окна и параболическая аппроксимация.
fin = 52
xmax = 16.9324
fmax = 52.9136
deltaf = -0.91362

// БПФ с окном и параболическая аппроксимация.
fin = 52
xmax = 16.8536
fmax = 52.6674
deltaf = -0.667435

// БПФ и аппроксимация по двум бинам.
// В случае использования окна формула по двум бинам начинает ухудшать оценку, было 0.015625 Гц, стало 0.25 Гц..
fmax = (16*y1 + 17*y2)/(y1+y2)
fin = 52
xmax = 16.5592
fmax = 51.7476
deltaf = 0.252434


На данный момент при неравенстве левого и правого бина лучшую оценку дает расчет по двум бинам, причем умножать выборку на окно не нужно, это только ухудшает результат.
blackfin
Цитата(Pridnya @ Nov 10 2015, 15:31) *
PS: И даже после умножения выборки на это правильное окно результат улучшился незначительно.

Можно попробовать уменьшить "ширину" окна до минимально возможного:

g[i]= expf(-((0.16F/0.02F)*(0.16F/0.02F)*(i-SAMPLES/2.0F+0.5F)*(i-SAMPLES/2.0F+0.5F)/((SAMPLES/2.0F)*(SAMPLES/2.0F))));
Serg76
Цитата(blackfin @ Nov 10 2015, 15:31) *
Вы забыли про отрицательные частоты в спектре вещественного сигнала: f- = -50 [Гц], f+ = +50 [Гц].

Тогда пардон, я решил, что речь идет о комплексной синусоиде
blackfin
Цитата(Serg76 @ Nov 10 2015, 15:43) *
Тогда пардон, я решил, что речь идет о комплексной синусоиде

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

А раз есть ошибка, то комплексной синусоиды у него нет, хотя ему про возможность комплексной фильтрации уже и намекали..
Pridnya
Цитата(blackfin @ Nov 10 2015, 15:41) *
Можно попробовать уменьшить "ширину" окна до минимально возможного:

g[i]= expf(-((0.16F/0.02F)*(0.16F/0.02F)*(i-SAMPLES/2.0F+0.5F)*(i-SAMPLES/2.0F+0.5F)/((SAMPLES/2.0F)*(SAMPLES/2.0F))));


Окно стало совсем узким. Результат параболической аппроксимации еще чуть улучшился. Результат по двум бинам ухудшился.

Цитата
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);
fmax = xmax*3200.0/1024.0;
deltaf = fin - fmax;
cout <<"fin = " << fin << endl;
cout <<"xmax = " << xmax << endl;
cout <<"fmax = " << fmax << endl;
cout <<"deltaf = " << deltaf << endl;
/*
fin = 52
xmax = 16.9324
fmax = 52.9136
deltaf = -0.91362
*/

// Бины после окна "весовое окно узкое".
x1=16; y1=109.043F;
x2=17; y2=110.226F;
x3=18; y3=103.154F;

xmax = x2 + 0.25*(y3 - y1)/(2*y2 - y3 - y1);
fmax = xmax*3200.0/1024.0;
deltaf = fin - fmax;
cout <<"fin = " << fin << endl;
cout <<"xmax = " << xmax << endl;
cout <<"fmax = " << fmax << endl;
cout <<"deltaf = " << deltaf << endl;
/*fin = 52
xmax = 16.8217
fmax = 52.5677
deltaf = -0.567665
*/

// *************************************************************************** //
// Способ по двум бинам (хорошо считает, если левый бин не равен правому))
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 <<"fin = " << fin << endl;
cout <<"xmax = " << xmax << endl;
cout <<"fmax = " << fmax << endl;
cout <<"deltaf = " << deltaf << endl;
/*fmax = (16*y1 + 17*y2)/(y1+y2)
fin = 52
xmax = 16.5027
fmax = 51.5709
deltaf = 0.429073
*/

return 0;
}


Напрвавление движения ясно. Два бина без окна, только нужно разобраться возле точек N*3.125.
Цитата
// *************************************************************************** //
Fin - заданная частота
Fcalc - расчетная частота
Err - разница
Yleft - левый бин (относительно максимума)
Yleft - правый бин (относительно максимума)
FFT 1024, без окна

// *************************************************************************** //
Fin=45 Fcalc=44.9805 Err=0.0194887 Yleft=224.695 Ymax=764.906 Yright=496.823

В этом промежутке не более Err 0,03 Гц

Fin=46.7697 Fcalc=46.7731 Err=-0.00334748 Yleft=33.6973 Ymax=999.206 Yright=33.5755
Fin=46.7797 Fcalc=46.9675 Err=-0.187824 Yleft=30.3978 Ymax=999.448 Yright=30.4946
Fin=46.7897 Fcalc=46.9583 Err=-0.168642 Yleft=27.1192 Ymax=999.654 Yright=27.3905
Fin=46.7997 Fcalc=46.949 Err=-0.149342 Yleft=23.8616 Ymax=999.826 Yright=24.2634
Fin=46.8097 Fcalc=46.9396 Err=-0.129922 Yleft=20.6249 Ymax=999.962 Yright=21.1137
Fin=46.8197 Fcalc=46.9301 Err=-0.110381 Yleft=17.4092 Ymax=1000.06 Yright=17.9415
Fin=46.8297 Fcalc=46.9204 Err=-0.0907161 Yleft=14.2145 Ymax=1000.13 Yright=14.747
Fin=46.8397 Fcalc=46.9106 Err=-0.0709257 Yleft=11.0407 Ymax=1000.16 Yright=11.5307
Fin=46.8497 Fcalc=46.9007 Err=-0.0510076 Yleft=7.88788 Ymax=1000.16 Yright=8.29256
Fin=46.8597 Fcalc=46.8906 Err=-0.0309596 Yleft=4.75595 Ymax=1000.12 Yright=5.03299

В этом промежутке не более Err 0,03 Гц

Fin=49.8992 Fcalc=49.9022 Err=-0.00300645 Yleft=32.2884 Ymax=999.253 Yright=32.1374
Fin=49.9092 Fcalc=50.0883 Err=-0.179093 Yleft=28.9915 Ymax=999.485 Yright=29.052
Fin=49.9192 Fcalc=50.079 Err=-0.159874 Yleft=25.7155 Ymax=999.682 Yright=25.9436
Fin=49.9292 Fcalc=50.0697 Err=-0.140537 Yleft=22.4604 Ymax=999.844 Yright=22.8125
Fin=49.9392 Fcalc=50.0602 Err=-0.12108 Yleft=19.2262 Ymax=999.971 Yright=19.6588
Fin=49.9492 Fcalc=50.0507 Err=-0.101501 Yleft=16.013 Ymax=1000.06 Yright=16.4828
Fin=49.9592 Fcalc=50.041 Err=-0.0817981 Yleft=12.8206 Ymax=1000.12 Yright=13.2847
Fin=49.9692 Fcalc=50.0311 Err=-0.0619689 Yleft=9.64908 Ymax=1000.14 Yright=10.0648
Fin=49.9792 Fcalc=50.0212 Err=-0.0420115 Yleft=6.4985 Ymax=1000.13 Yright=6.82334

В этом промежутке не более Err 0,03 Гц

Fin=53.0287 Fcalc=53.0314 Err=-0.00270608 Yleft=30.8695 Ymax=999.305 Yright=30.7067
Fin=53.0387 Fcalc=53.209 Err=-0.17037 Yleft=27.5761 Ymax=999.527 Yright=27.6163
Fin=53.0486 Fcalc=53.1998 Err=-0.151113 Yleft=24.3035 Ymax=999.714 Yright=24.5031
Fin=53.0586 Fcalc=53.1904 Err=-0.131737 Yleft=21.0517 Ymax=999.867 Yright=21.3672
Fin=53.0686 Fcalc=53.1809 Err=-0.112241 Yleft=17.8207 Ymax=999.984 Yright=18.209
Fin=53.0786 Fcalc=53.1713 Err=-0.092622 Yleft=14.6106 Ymax=1000.07 Yright=15.0285
Fin=53.0886 Fcalc=53.1615 Err=-0.0728786 Yleft=11.4214 Ymax=1000.11 Yright=11.8262
Fin=53.0986 Fcalc=53.1516 Err=-0.0530086 Yleft=8.25301 Ymax=1000.13 Yright=8.60214
Fin=53.1086 Fcalc=53.1416 Err=-0.0330097 Yleft=5.10552 Ymax=1000.11 Yright=5.35662

Далее до Fin 55 Гц Err не более Err 0,03Гц.
// *************************************************************************** //
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.