Используя Параметр 'DelayFactor' с rationalfit

Этот пример показывает, как использовать параметр '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);

Анализируйте Вывод rationalfit при использовании Значения по умолчанию для 'DelayFactor'

Используйте функцию 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'.

Анализируйте Вывод 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', намного более точна, и использует меньше полюсов.