rationalfit
В этом примере показано, как использовать параметр 'DelayFactor', чтобы улучшить качество выхода rationalfit
.
rationalfit
функция выбирает рациональную функцию, которая совпадает с данными частотной области. Если бы те данные содержат значительную "задержку", которая представила бы себя как фазу, переключают частотный диапазон на нижний регистр, то это может очень затруднить, чтобы соответствовать использованию разумного количества полюсов.
В этих случаях, когда входные данные содержит большой отрицательный наклон (т.е. данные с достаточно большой задержкой), мы можем спросить rationalfit
сначала удалить часть задержки из данных, и затем найти рациональную функцию что лучшие подгонки остающиеся "незадержанные" данные. rationalfit
функционируйте составляет удаленную задержку путем хранения его в параметре 'Задержки' выхода. По умолчанию, rationalfit
не удаляет задержки из данных.
Во-первых, создайте дифференциальные данные о передаточной функции из S-параметров основной платы с 4 портами. Затем попытайтесь соответствовать данным с помощью настроек по умолчанию rationalfit
функция. Наконец, используйте параметр 'DelayFactor', чтобы улучшить точность выхода rationalfit
.
Читайте в данных S-параметра основной платы с 4 портами из 'default.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)
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'
respfreq = 0:4e6:20e9; defaultresp = freqresp(defaultfit,respfreq);
Обратите внимание на то, что параметр 'Задержки' является нулем (никакая задержка, удаленная из данных).
Отобразите исходные данные на графике по сравнению с выходом по умолчанию 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)
customfit = rfmodel.rational with properties: A: [31x1 double] C: [31x1 double] D: 0 Delay: 6.5521e-09 Name: 'Rational Function'
customresp = freqresp(customfit,respfreq);
Обратите внимание на то, что параметр 'Задержки' не является нулем (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', намного более точна, и использует меньше полюсов.