Используя Параметр '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')

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