rationalfitВ этом примере показано, как использовать параметр DelayFactor для улучшения качества вывода rationalfit.
rationalfit функция выбирает рациональную функцию, которая соответствует данным частотной области. Если эти данные содержат значительную «временную задержку», которая представлялась бы как фазовый сдвиг в частотной области, то может быть очень трудно подогнать, используя разумное количество полюсов.
В этих случаях, когда входные данные содержат большой отрицательный наклон (т.е. данные с достаточно большой временной задержкой), мы можем спросить rationalfit сначала удалить часть задержки из данных, а затем найти рациональную функцию, которая наилучшим образом соответствует оставшимся «неотвержденным» данным. rationalfit функция учитывает удаленную задержку, сохраняя ее в параметре «Delay» выходного сигнала. По умолчанию rationalfit не удаляет задержку из данных.
Сначала создайте данные функции дифференциальной передачи из S-параметров 4-портовой объединительной платы. Затем попытайтесь подогнать данные с помощью настроек по умолчанию rationalfit функция. Наконец, используйте параметр «DelayFactor» для повышения точности вывода rationalfit.
Считывайте данные S-параметра 4-портовой объединительной платы из файла default.s4p.
S = sparameters('default.s4p');
fourportdata = S.Parameters;
freq = S.Frequencies;
fourportZ0 = S.Impedance;Преобразование 4-портовых однополюсных S-параметров в 2-портовые дифференциальные S-параметры
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);
Обратите внимание, что параметр 'Delay' равен нулю (задержка не удаляется из данных).
Постройте график между исходными данными и выводом по умолчанию 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);
Обратите внимание, что параметр 'Delay' не равен нулю (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, намного точнее и использует меньшее количество полюсов.