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

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

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

Используйте функцию 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 делают довольно хорошее задание в центре полосовой области, подгонка плоха на ребрах полосовой области. Возможно, что использование более комплексной рациональной функции достигнет лучшей подгонки.

Анализируйте Вывод rationalfit при использовании Пользовательского Значения для 'NPoles'

Соответствуйте исходным данным 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')

Подгонка с помощью большего числа полюсов ясно более точна.