Этот пример показывает, как использовать параметр 'DelayFactor', чтобы улучшить качество вывода rationalfit
.
Функция rationalfit
выбирает рациональную функцию, которая совпадает с данными о частотном диапазоне. Если бы те данные содержат значительную "задержку", которая представила бы себя как фазу, переключают частотный диапазон на нижний регистр, то может быть очень трудно соответствовать использованию разумного количества полюсов.
В этих случаях, когда входные данные содержит большой отрицательный наклон (т.е. данные с достаточно большой задержкой), мы можем попросить, чтобы rationalfit
сначала удалил часть задержки от данных, и затем нашел рациональную функцию что лучшие подгонки остающиеся "незадержанные" данные. Функция rationalfit
составляет удаленную задержку путем хранения его в параметре 'Задержки' вывода. По умолчанию rationalfit
не удаляет задержки из данных.
Во-первых, создайте дифференциальные данные о передаточной функции из S-параметров основной платы с 4 портами. Затем, попытайтесь соответствовать данным с помощью настроек по умолчанию функции rationalfit
. Наконец, используйте параметр 'DelayFactor', чтобы улучшить точность вывода rationalfit
.
Читайте в данных S-параметра основной платы с 4 портами из 'значения по умолчанию s4p'.
S = sparameters('default.s4p');
fourportdata = S.Parameters;
freq = S.Frequencies;
fourportZ0 = S.Impedance;
Преобразуйте несимметричные S-параметры с 4 портами в дифференциальные S-параметры с 2 портами
diffdata = s2sdd(fourportdata); diffZ0 = 2*fourportZ0;
Создайте передаточную функцию из дифференциальных 2 данных порта
tfdata = s2tf(diffdata,diffZ0,diffZ0,diffZ0);
Используйте функцию freqresp
, чтобы вычислить ответ вывода rationalfit
.
defaultfit = rationalfit(freq,tfdata) respfreq = 0:4e6:20e9; defaultresp = freqresp(defaultfit,respfreq);
Warning: Achieved only -10.2 dB accuracy with 48 poles, not -40.0 dB. Consider specifying a larger number of poles using the 'NPoles' parameter. defaultfit = rfmodel.rational with properties: A: [48x1 double] C: [48x1 double] D: 0 Delay: 0 Name: 'Rational Function'
Обратите внимание на то, что параметр 'Задержки' является нулем (никакая задержка, удаленная из данных).
Отобразите исходные данные на графике по сравнению с выводом по умолчанию rationalfit
figure subplot(2,1,1) tfdataDB = 20*log10(abs(tfdata)); plot(freq,tfdataDB,'.-') hold on plot(respfreq,20*log10(abs(defaultresp))) hold off xlabel('Frequency (Hz)') ylabel('Magnitude (dB)') defaultnpoles = numel(defaultfit.A); defstr = ['Default DelayFactor (Uses ',num2str(defaultnpoles),' poles)']; title(defstr) legend('Original Data','Default rationalfit','Location','best') subplot(2,1,2) tfdataphase = 180*unwrap(angle(tfdata))/pi; plot(freq,tfdataphase,'.-') hold on plot(respfreq,180*unwrap(angle(defaultresp))/pi) hold off xlabel('Frequency (Hz)') ylabel('Angle (degrees)') legend('Original Data','Default rationalfit','Location','best')
Обратите внимание на то, что результаты при использовании настроек по умолчанию rationalfit
плохи. Поскольку фаза исходных данных имеет очень большой отрицательный наклон, может быть возможно улучшить точность рациональной функции при помощи параметра 'DelayFactor'.
'DelayFactor' должен быть установлен в значение между 0 и 1. Выбор, какое значение является упражнением в методе проб и ошибок. Для некоторых наборов данных (те, фаза которых имеет полный восходящий наклон), изменяя значение 'DelayFactor' не будет иметь никакого эффекта на результат.
Содержание всех других возможных параметров постоянного rationalfit
, 0.98, как находят, создает хорошую подгонку.
customfit = rationalfit(freq,tfdata,'DelayFactor',0.98)
customresp = freqresp(customfit,respfreq);
customfit = rfmodel.rational with properties: A: [31x1 double] C: [31x1 double] D: 0 Delay: 6.5521e-09 Name: 'Rational Function'
Обратите внимание на то, что параметр 'Задержки' не является нулем (rationalfit
удалил некоторую задержку из данных).
Отобразите исходные данные на графике по сравнению с пользовательским выводом rationalfit
subplot(2,1,1) plot(freq,tfdataDB,'.-') hold on plot(respfreq,20*log10(abs(customresp))) hold off xlabel('Frequency (Hz)') ylabel('Magnitude (dB)') customnpoles = numel(customfit.A); customstr = ['DelayFactor = 0.98 (Uses ',num2str(customnpoles),' poles)']; title(customstr) legend('Original Data','Custom rationalfit','Location','best') subplot(2,1,2) plot(freq,tfdataphase,'.-') hold on plot(respfreq,180*unwrap(angle(customresp))/pi) hold off xlabel('Frequency (Hz)') ylabel('Angle (degrees)') legend('Original Data','Custom rationalfit','Location','best')
Рациональная функция, созданная при помощи пользовательского значения для 'DelayFactor', намного более точна, и использует меньше полюсов.