uryd

График гармоник по децибелам

45 posts in this topic

Добрый день!

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

Не получается вывести его в нужном виде, а именно - нужен график преобразования Фурье выходного сигнала, в котором по оси абсцисс - частота в логарифмическом масштабе, а по оси ординат - уровень гармоник в дБ по отношению к сигналу 1-й гармоники. Также нужно посчитать коэффициенты гармоник в дБ и общий THD.

Пытался использовать анализ периодических режимов, график гармоник вывожу, но только в вольтах, при использовании функции Db(f(x)) рисуется странный график, где основная гармоника чуть-ли не самая маленькая, а 2-я - самая большая.

Есть опыт работы в OrCAD, там та-же функция Db() работает ожидаемо.

Кроме того, задал на схеме блок SPICE с директивой .FOUR, но не нашёл куда выводятся результаты - ожидал что будет что-то типа как в OrCADе (текстовый вывод значений), но пока не нашёл.

Прошу помочь разобраться.

Share this post


Link to post
Share on other sites

Добрый день!

                                                                                 1.
" Не получается вывести его в нужном виде, а именно - нужен график преобразования Фурье выходного сигнала, в котором по оси абсцисс - частота в логарифмическом масштабе, а по оси ординат - уровень гармоник в дБ по отношению к сигналу 1-й гармоники. Также нужно посчитать коэффициенты гармоник в дБ и общий THD. "

Да, в текущей версии программы в таком виде вывести график не получится. Получится вывести только абсолютный уровень гармоник ( без отношения к первой) в линейном или   логарифмическом масштабе по оси Y. Этот функционал у нас с OrCad-ом одинаковый.
Порядок действий:
1. строите нужный график во временной развертке.
2.  Вызываете окно Преобразования Фурье с помощью кнопки БПФ на панели или меню "График->БПФ".
3. Выбираете нужный график для преобразования, указываете либо временной интервал, на котором его надо взять, фундаментальную частоту и количество периодов с конца временного интервала графика.
4. Выбираете что выводить на график Преобразования Фурье: амплитудный спектр, фазовый, мнимый или вещественный.
5. Указываете куда выводить (окно, поле) и нажимаете кнопку "ОК". и программа выведет на экран график коэффициентов Фурье

Для переключения типа шкалы ординат используйте кнопку на панели или меню "График->Режим->Логарифмировать ось Y".

Количество частот отображаемых по оси ординат по умолчанию равно 10 и устанавливается в разделе "Настройки" окна "БПФ" . По-умолчанию это значение равно 10. 

                                                                          2.

"Пытался использовать анализ периодических режимов, график гармоник вывожу, но только в вольтах, при использовании функции Db(f(x)) рисуется странный график, где основная гармоника чуть-ли не самая маленькая, а 2-я - самая большая. "

Здесь нужны пояснения с Вашей стороны.
От чего брались децибелы? К какой функции f(x) применялась функция Db(f(x))? 
Сама по себе функция Db(f(x)) у нас давно используется и работает она правильно.

Графики коэффициентов преобразования Фурье на тестовых примерах при различных шкалах (линейной и логарифмической Y)  у нас и OrCad совпадают 

                                                                           3.

"Кроме того, задал на схеме блок SPICE с директивой .FOUR, но не нашёл куда выводятся результаты - ожидал что будет что-то типа как в OrCADе (текстовый вывод значений), но пока не нашёл. "

Команда .four работает только совместно с командой .tran или .pss - т. е. только для временных расчетов схемы. Результаты работы команды - отображение на экране графиков коэффициентов ряда Фурье. Для отображения необходимо, также, задать команду .plot или .print или .probe.
Вот пример команды для SPICE-блока:
.pss
.plot v(out)
.four 1Meg v(out)

Здесь сначала запустится расчет периодических режимов, потом нарисуется график напряжения v(out), потом для него посчитается преобразование Фурье на временном интервале, равном [Tend - 1е-6, Tend], где  Tend - время, до которого построен график v(out) 

Аналогичный пример для  случая расчета переходных процессов:

.tran 1u
.plot v(out)
.four 1Meg v(out)
Здесь сначала запустится расчет переходных процессов на интервале[0;1e-6c], потом нариcуется график напряжения v(out), для которого посчитается преобразование Фурье на временном интервале, равном [0, 1e-6c].

Подробнее о том как пользоваться SPICE-командами можно прочитать в Справке или Руководстве пользователя SimOne, а также и в другой, посвященной SPICE- моделированию, литературе.

                                                                               4.
  Что касается функций THD и взятия амплитуды нужной гармоники, то они у нас уже реализованы и появятся в следующем обновлении программы. 

Share this post


Link to post
Share on other sites

Добрый день!

Продолжу тему, если не против...

1. К моему сожалению и в OrCADе очень не хватает данного функционала, он ещё и очень странно ведёт такие расчёты. К примеру: я долго не мог понять, откуда берутся странные искажения на выходе усилителя, ну ни как они не стыковались с теорией и некоторыми другими программами моделирования (например MicroCap). Пока однажды не добавил в задание измерение THD на ВХОДЕ усилителя (источником сигнала был стандартный источник VSIN последовательно с резистором), и к моему изумлению я увидел что на входе УЖЕ присутствуют немалые гармоники основного сигнала. И они составляли до 80-90% от уровней гармоник на выходе. Было убито много времени в попытках настроить параметры точности источника сигнала (их просто нет), игрой с шагами интегрирования (здесь вообще полная неразбериха, я так и не нашёл объяснений тому факту, что при уменьшении шага интегрирования (максимального), когда вроде бы должна увеличиваться точность, уровни гармоник возрастают в неестественных масштабах). Извините, немного увлёкся, но именно это заставило искать замену, вроде-бы мощному и именитому, OrCADу. И в SimOne я увидел такие перспективы и адекватную математику.

2. По поводу функции Db(f(x)) - задавал от уровня выходного сигнала: Db(V(OUT)), в том-же OrCADе я тоже с ней провозился, и только методом эксперимента выявил неявно определённую величину - там получилось что за опорный уровень (напряжения) берётся 1в. Буду очень признателен, если уточните полную информацию, лучше в виде конкретной формулы, как работает эта функция в SimOne, её опорный уровень. И было бы просто здорово иметь возможность определять в функции расчёта дБ свою точку отсчёта.

3. С блоком SPICE понятно, так это и сделано в OrCADе, единственно, там наличие .TRAN перед .FOUR прописано в документации и вопросов не вызывает, а в документации SimOne я такого не увидел.

4. Очень хочется увидеть новую версию SimOne с расчётом THD.

P.S.

Кстати, если не секрет, а какой именно алгоритм БПФ используется в SimOne?

Share this post


Link to post
Share on other sites

2.
У нас функция расчета децибел также работает по единичному опорному уровню:
Db(f(x)) = 20*lg(|f(x)|/A), где А=1.  
В следующей версии добавим возможность задавать А.

3. Да, указать на обязательное совместное использование .four с .tran или .pss в документации я забыл. Поправлю.
 

4. Такая версия уже на подходе.

Насчет алгоритма БПФ - непонятно. Используем самый что ни есть обычный.

Share this post


Link to post
Share on other sites

Добрый день!
 

Сегодня вышла новая версия нашей программы, в ней функция  Db(f(x))  теперь принимает опорный уровень: Db(f(x),A) где A =1 по умолчанию.
Также в новой версии добавлены функции для работы 
 с преобразованием Фурье, в том числе и вычисление нормированного спектра сигнала.
Подробности здесь: http://eda.eremex.ru/news/616750.html

Скачать можно здесь:  http://eda.eremex.ru/downloads/

Share this post


Link to post
Share on other sites

Потратил целый вечер на проверку новых возможностей SimOne. Вот что получилось:

Новые функции расчёта БПФ и расчёта децибелов по заданному опорному уровню реально удобны.

НО, к сожалению, не обошлось без "ложки дёгтя", и весьма немалой.

Исходные данные: схема каскада Тейлора, на входе - генератор синуса 10кГц, на выходе активная нагрузка, задание на моделирование через блок SPICE прямо на схеме (вид моделирования - .pss, после него команды plot, fftn, thd).

1) Как-то неадекватно срабатывает отображение результата, конкретно - функций fftn, db(fftn(...),...), а именно: шкала абсцисс остаётся по времени и на ней прямая линия графика. Долго мучал программу, пока методом "научного тыка" не нажал на списке графиков кнопку изменения шкалы с линейной на логарифмическую - график поменялся вместе со шкалой абсцисс, и это странно, ведь эта кнопка изменяет шкалу ординат. Но, что самое интересное, после повторного нажатия на эту кнопку наконец-то появился ожидаемый вид графика FFT! Почему не настраивается график при его первоначальном отображении после окончании расчёта - вопрос программистам. Кнопки включения/выключения отображения графика в окне списка графиков такого эффекта, как кнопка изменения шкалы, не дают.

2) Очень неудобно пользоваться графиком: во-первых - очень большой "хвост" из высших гармоник, постоянно приходится масштабировать его при перерасчёте - всё-таки желательно иметь возможность задавать нужный диапазон частот FFT (по крайней мере верхнюю границу). Во-вторых, неадекватная работа масштабирования графика на логарифмической шкале (на линейной проблем нет) - особенно оси ординат - буквально один шаг колёсиком мышки при нажатой SHIFT - и масштаб оси ординат "уезжает" в никуда, либо в очень малые шаги с одними и теми же цифрами на оси ординат с несуразными значениями экспоненты, либо в очень большие шаги и цифры оси ординат наезжают друг на друга вместе с сильно "полосатым" графиком из горизонтальных линий. Считаю, что алгоритм масштабирования логарифмической шкалы следует пересмотреть.

3) Ну и самое удивительное и неожиданное, лично для меня, были значения THD. Имея опыт "танцев с бубном" на OrCADе, я решил проверить и SimOne: замерил THD (и THD_R) на выходе каскада и на входе (генераторе синуса) - неожиданно они оказались очень близкими, а именно - на выходе значение 3.724m, а на входе - 3.723m (!!!). Разница минимальная. Даже изменяя значения точности FFT в широких пределах (от стандартных 1024 до 32768) конечные значения не сильно поменялись относительно друг-друга.  Данные результаты могу интерпретировать так, что источник сигнала не совсем "чистый", конкретно у меня 2-я гармоника сигнала прямо на контакте генератора напряжения получилась -79дБ при шаге расчёта по умолчанию (и -97дБ при шаге 32768). В таких условиях пока даже не представляю, как рассчитать THD схемы - при ручной оценке получились значения первой десятки гармоник вплоть до -130...-140дБ, для этого нужен чистый сигнал с уровнем неосновных гармоник не выше -180...-190дБ. Понятно, что это всё теория, но все-же. В данном случае получается, что математические модели компонентов гораздо точнее источника сигнала, и поэтому хочу предложить проверить алгоритм генерации сигнала источника напряжения.

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

И, кстати, раз уж снова коснулся вопроса преобразования Фурье, я уже спрашивал, какой именно алгоритм БПФ используется в SimOne, - предлагаю подумать о реализации полноценного алгоритма ДПФ, для расширения функциональности.

В целом-же, SimOne продолжает лично меня радовать, на данный момент из всего я пробовал, это лучший симулятор. Спасибо!

Share this post


Link to post
Share on other sites

И ещё, вспомнил, на графике FFT строго каждые 200кГц, независимо от параметров шага, идут странные выбросы в виде буквы "М", достаточно большие, с уровнем выше практически всех неосновных гармоник.

Для моего примера с первой гармоникой 10кГц все учитыаемые гармоники умещаются в первые 100кГц и эти выбросы не мешают, но всё-же хотелось бы знать, с чем связаны эти выбросы и как их убрать или сдвинуть.

Share this post


Link to post
Share on other sites

Добрый день!
 

1. Относительно проблем с масштабированием графиков в логарифмической шкале:
согласен, есть неудобство при работе с колесиком мыши. Поправим.
Я обычно масштабирую графики рамкой, так как это принято в других программах( LTSPICE,MicroCap): при нажатой ЛКП – сдвинуть курсор из II квадранта в IV квадрант (слева сверху – вправо вниз).
Масштабировать графики колесиком мыши считаю неудобным в принципе.

2. Масштабирование графиков функций fft(), fftn()  также поправим в ближайшее время.
 

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

4. За лучший симулятор - спасибо, Будем соответствовать))
 

Share this post


Link to post
Share on other sites

Еще одно соображение по поводу неточности вычисления THD:
для проверки точности вычисления спектра сигнала можно использовать функцию fourier.
fourier(f(x),[Nr=N,N=1024,Freq]) – вычисляет сумму Nr членов ряда Фурье выражения f(x), полученного с помощью функции fft(f(x)) . 

 Таким образом, можно построить графики самого сигнала и его аппроксимацией рядом Фурье и посмотреть насколько сильно они отличаются.  Их разница и будет говорить о точности выполненного преобразования Фурье.  Пример такого использования функций можно посмотреть в файле fft_based_func.ssch из папки FFT с примерами Simone.  

 

Share this post


Link to post
Share on other sites

Сейчас, вечером, в спокойной обстановке, обдумал предложение сравнить график сигнала и его "восстановленную" версию из ряда Фурье - как-то сомнительно это представляется, врядли на глаз можно будет увидеть разницу между сигналом и его немного искажённой копией, когда сами искажения составляют сотые (и даже менее) доли процента.

Повторюсь, не думаю что сама реализация FFT в SimOne неточна, ведь одним и тем-же алгоритмом с одинаковыми параметрами обрабатывались сигналы на ВХОДЕ (выходе генератора напряжения) и ВЫХОДЕ схемы, и искажения были уже на выходе ГЕНЕРАТОРА напряжения.

Думаю, нужно смотреть алгоритм генератора напряжения, чтобы он выдавал более "чистый" сигнал синусоиды.

Share this post


Link to post
Share on other sites

Если под генератором напряжения Вы имеете ввиду независимый источник напряжения, который используется в SimOne, то  "чистота" синуса там гарантирована, т. к. сигнал считается просто вызовом в дискретные моменты времени соответствующей функции sin  из математической библиотеки языка С++,  

Еще один момент: для более точного взятия БПФ  необходимо задавать меньшую величину максимального  шага интегрирования временного процесса. 

И еще: на днях выпустим обновление версии с откорректированным представлением графиков в логарифмической шкале. Ожидайте))

Share this post


Link to post
Share on other sites

Добрый день!

Масштабирование логарифмической шкалы стало удобным, спасибо.

Если не возражаете, хочу снова поднять вопрос о преобразовании Фурье:

1) Спрашивал уже, и так и не понял, почему на графике получаются, явно "искусственные"," всплески" в виде буквы "М" ровно через каждые 200кГц.

2) И опять-же, о точности БПФ. Увеличение количества точек относительно стандартных (по умолчанию) 1024 эффект даёт, конечно, но всё равно не даёт возможность получить ожидаемый результат. В порядке эксперимента увеличивал количество точек вплоть до 32768 (специально кратно степени 2 из-за особенностей некоторых алгоритмов БПФ) - до 8192 точек эффект ещё заметен, далее практически не влияет. При этом уровень 2-й гармоники на генераторе синуса получился -97дБ (при этом 3-я и последующие гармоники практически одного уровня) , что явно нельзя отнести к "чистому" сигналу. Раз Вы пишете, что алгоритм генератора синуса гарантирует чистый сигнал, то вывод напрашивается только один - что-то не так с используемым алгоритмом БПФ (и описанное выше в п.1 косвенно подтверждает это). Я не зря ранее спрашивал, какой именно алгоритм БПФ используется в SimOne, признаться, Ваш ответ "самый обычный" не сильно вдохновил, - результаты расчётов похожи на ограничение в точности. Может всё-же стОит ещё раз проверить используемый алгоритм БПФ и, особенно, его коэффициенты. В качестве примера - MicroCap, - может не по конкретным цифрам, но по характеру графика Фурье очень близко к теории.

 

P.S.

Извините за настырность...

Share this post


Link to post
Share on other sites

Пожалуйста, ничего страшного))

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

Share this post


Link to post
Share on other sites

Чуть попозже постараюсь перерисовать схему и графики - рабочий компьютер не имеет доступа в Инет, так определил работодатель.

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

 

Share this post


Link to post
Share on other sites

Для uryd:

FFT от чистой синусоиды ( источник sin напряжения 1MHz, шаг 1ns) дает вот такой спектр:

12675479.png

Вычислительные шумы на уровне -188 дБ, куда еще лучше :)

Если шаг изменить до 0.1 ns, то уровень выч. шумов падает до -209 дБ. Смысл понятен, надеюсь.

Ни одно реальное устройство таких спектр. шумов иметь не может.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Мой ответ снимает вопрос о мифической вычислительной погрешности. Она есть, но в рамках.

Возьмем диодный ограничитель (два диода) и подадим на них через резистор 100 Ом сигнал 1V 1 kHz.

Получим вполне ожидаемое "мягкое" ограничение и спектр почти как у меандра.

12664233.png

12662185.png

Share this post


Link to post
Share on other sites

Вот часть схемы, не дающей мне покоя.

_shema.pdf

Параметры расчёта указаны на схеме в блоке SPICE (сигнал 10кГц, 10240 точек = шаг 9.765625нс).

График №3 (4-я строка блока SPICE): красный - сигнал vg, зелёный - in, голубой - out.

_db.pdf

Share this post


Link to post
Share on other sites

Забыл дописать в предыдущем сообщении, источник сигнала - постоянная составляющая около 4.1в (смещение для полевого транзистора) и синус амплитудой 1в 10кГц.

Share this post


Link to post
Share on other sites
5 часов назад, uryd сказал:

Вот часть схемы, не дающей мне покоя.

 

Схема поверху - не читается.

Share this post


Link to post
Share on other sites
Цитата

Вот часть схемы, не дающей мне покоя

Ну вот теперь яснее. В этой самой части схемы есть задание на моделирование.
Вы задаете расчет периодических режимов командой .pss. Точность представления решения в этом случае -  20 точек на период и  оно определяет точность построенного графика, от которого потом будет браться преобразование Фурье.
К сожалению сейчас в текстовой команде нельзя изменить это количество, это досадное недоразумение мы исправим.
Для запуска периодического режима используйте пока графический интерфейс. Меню "Моделирование->Расчет периодических режимов". В окне задания параметров нужно указать бОльшее количество точек на период, например 100 и больше.
В качестве выходных выражений Вы можете указать нужные Вам функции преобразования Фурье, thd, harm и проч.
Результаты вычислений будут тем точнее, чем больше точек на период в расчете будут задано и чем больше размерность БПФ будет использована.

 

Share this post


Link to post
Share on other sites
21 минуту назад, AlexPrikota сказал:

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


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

 

1. Плохо, что недоразумений за 5 лет с 2012 г. еще очень много остается.

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

2. Точек должно быть около 1000, чтобы при низких искажениях исходного сигнала не мешались дискретные артефакты.

3. Кстати, Вы так не ответили ТС на вопрос - какой именно алгоритм FFT используется, делается ли передискретизация (интерполяция/децимация), используются ли оконная обработка и т.д.

Share this post


Link to post
Share on other sites

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!


Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.


Войти