В этом примере показано, как использовать параметр 'NPoles', чтобы улучшить качество выхода rationalfit
. По умолчанию, rationalfit
функционируйте использует 48 или меньше полюсов, чтобы найти рациональную функцию что лучшие соответствия данные. Если 48 полюсов недостаточно, может быть выгодно изменить область значений количества полюсов, используемых rationalfit
.
Во-первых, считайте в данных о полосовом фильтре, содержавшихся в файле npoles_bandpass_example.s2p
, и постройте S21
данные. Затем используйте rationalfit
функционируйте, чтобы соответствовать рациональной функции к S21
данные, с набором параметров 'NPoles' к его значению по умолчанию, и визуально сравнивают результаты с исходными данными. Наконец, используйте rationalfit
снова, на этот раз определение большего числа полюсов, и видит, улучшается ли результат.
S = sparameters('npoles_bandpass_example.s2p'); figure subplot(2,1,1) rfplot(S,2,1,'db') subplot(2,1,2) rfplot(S,2,1,'angle')
Используйте rfparam
функционируйте, чтобы извлечь S21
значения, и затем вызывают rationalfit
.
s21 = rfparam(S,2,1); datafreq = S.Frequencies; defaultfit = rationalfit(datafreq,s21);
Warning: Achieved only -13.0 dB accuracy with 48 poles, not -40.0 dB. Consider specifying a larger number of poles using the 'NPoles' parameter.
Используйте freqresp
функция, чтобы вычислить ответ выхода rationalfit
.
respfreq = 2.25e9:2e5:2.75e9; defaultresp = freqresp(defaultfit,respfreq);
Сравните исходные данные с частотной характеристикой рациональной функции по умолчанию, вычисленной rationalfit
.
subplot(2,1,1) plot(datafreq,20*log10(abs(s21)),'.-') hold on plot(respfreq,20*log10(abs(defaultresp))) hold off xlabel('Frequency (Hz)') ylabel('Magnitude (dB)') defaultnpoles = numel(defaultfit.A); defaultstr = ['Default NPoles (Uses ',num2str(defaultnpoles),' poles)']; title(defaultstr) legend('Original Data','Default rationalfit','Location','best') subplot(2,1,2) plot(datafreq,unwrap(angle(s21))*180/pi,'.-') hold on plot(respfreq,unwrap(angle(defaultresp))*180/pi) hold off xlabel('Frequency (Hz)') ylabel('Angle (degrees)') legend('Original Data','Default rationalfit','Location','best')
Анализ, как хорошо выход rationalfit
совпадает с исходными данными, кажется что в то время как значения по умолчанию rationalfit
сделайте довольно хорошее задание в центре полосовой области, подгонка плоха на ребрах полосовой области. Возможно, что использование более комплексной рациональной функции достигнет лучшей подгонки.
Соответствуйте исходному S21
данные, но на этот раз, сообщают rationalfit
использовать между 49 и 60 полюсами с помощью параметра 'NPoles'.
customfit = rationalfit(datafreq,s21,'NPoles',[49 60]);
customresp = freqresp(customfit,respfreq);
Сравните исходные данные с частотной характеристикой пользовательской рациональной функции, вычисленной rationalfit
.
figure subplot(2,1,1) plot(datafreq,20*log10(abs(s21)),'.-') hold on plot(respfreq,20*log10(abs(customresp))) hold off xlabel('Frequency (Hz)') ylabel('Magnitude (dB)') customnpoles = numel(customfit.A); customstr = ['NPoles = [49 60] (Uses ',num2str(customnpoles),' poles)']; title(customstr) legend('Original Data','Custom rationalfit','Location','best') subplot(2,1,2) plot(datafreq,unwrap(angle(s21))*180/pi,'.-') hold on plot(respfreq,unwrap(angle(customresp))*180/pi) hold off xlabel('Frequency (Hz)') ylabel('Angle (degrees)') legend('Original Data','Custom rationalfit','Location','best')
Подгонка с помощью большего числа полюсов ясно более точна.