В этом примере показано, как использовать параметр 'Веса', чтобы улучшить качество выхода rationalfit
. По умолчанию, rationalfit
функция минимизирует абсолютную погрешность между данными и рациональной функцией, обрабатывая все точки данных одинаково. Когда будет полезно подчеркнуть некоторые точки данных больше, чем другие, используйте параметр 'Веса'.
Если величина входных данных имеет большой динамический диапазон, часто полезно более касаться относительной погрешности в каждой точке данных, а не абсолютной погрешности в каждой точке данных, так, чтобы точки данных с относительно меньшими величинами были подходящими точно. Распространенный способ сделать это должно установить параметр 'Веса' на 1./abs(data)
.
Во-первых, считайте в данных о фильтре пилы, содержавшихся в файле sawfilter.s2p
, и постройте S21
данные. Затем используйте rationalfit
функционируйте, чтобы соответствовать рациональной функции к S21
данные, с набором параметра 'Веса' к его значению по умолчанию, и визуально сравнивают результаты с исходными данными. Наконец, используйте rationalfit
снова, на этот раз задавая параметр 'Веса', чтобы быть 1./abs(S21)
, и смотрите, улучшается ли результат.
S = sparameters('sawfilter.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);
Используйте freqresp
функция, чтобы вычислить ответ выхода rationalfit
.
respfreq = 1e9:1.5e6:4e9; 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 Weight (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
не ужасно, это не совпадает с областями в данных, которые очень малы в величине.
figure plot(datafreq,20*log10(abs(s21)),'.-') hold on plot(respfreq,20*log10(abs(defaultresp))) hold off axis([2.25e9 2.65e9 -75 -30]) xlabel('Frequency (Hz)') ylabel('Magnitude (dB)') title('Accuracy at Small Magnitudes Using Default Weight') legend('Original Data','Default rationalfit','Location','best')
Используя параметр 'Веса', чтобы сделать те данные относительно более важными может помочь точности подгонки.
При помощи 'Веса' 1./abs(s21)
, rationalfit
минимизирует относительную погрешность системы, вместо абсолютной погрешности системы.
customfit = rationalfit(datafreq,s21,'Weight',1./abs(s21));
customresp = freqresp(customfit,respfreq);
Warning: Achieved only -39.7 dB accuracy with 48 poles, not -40.0 dB. Consider specifying a larger number of poles using the 'NPoles' parameter.
Сравните исходные данные с частотной характеристикой пользовательской рациональной функции, вычисленной 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 = ['Weight = 1./abs(s21) (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')
График показывает, что пользовательский параметр 'Веса' создал лучшее пригодное для точек данных с меньшими величинами.
figure plot(datafreq,20*log10(abs(s21)),'.-') hold on plot(respfreq,20*log10(abs(customresp))) hold off axis([2.25e9 2.65e9 -75 -30]) xlabel('Frequency (Hz)') ylabel('Magnitude (dB)') title('Accuracy at Small Magnitudes Using Custom Weight') legend('Original Data','Custom rationalfit','Location','best')