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