Этот пример показывает, как использовать параметр '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')
Подгонка с помощью большего числа полюсов ясно более точна.