'Weight'
Параметр с rationalfit
В этом примере показано, как использовать 'Weight'
параметр для улучшения качества выхода rationalfit
.
По умолчанию в rationalfit
функция минимизирует абсолютную ошибку между данными и рациональной функцией, одинаково обрабатывая все точки данных. Если вы хотите подчеркнуть некоторые точки данных больше, чем другие, используйте 'Weight'
параметр.
Для примера, если амплитуда входных данных имеет большую динамическую область значений, часто полезно быть более обеспокоенной относительной погрешностью в каждой точке данных, чем абсолютной ошибкой в каждой точке данных, так что точки данных с относительно меньшими величинами точно подгоняются. Общим способом сделать это является задать параметр 'Weight' равным 1./abs(data)
.
Чтобы изложить приведенный выше пример на практике, выполните следующие шаги.
Считайте в фильтре SAW данные, содержащиеся в файле sawfilter.s2p
, и постройте график S21
данные.
Используйте rationalfit
функция для соответствия рациональной функции S21
данных, с 'Weight'
Набор параметров к значению по умолчанию и визуально сравните результаты с исходными данными.
Использование rationalfit
снова на этот раз установка 'Weight'
параметр, который будет 1./abs(S21)
, и посмотреть, улучшится ли результат.
Считывайте и визуализируйте данные S-параметров фильтра SAW.
S = sparameters('sawfilter.s2p'); figure subplot(2,1,1) rfplot(S,2,1,'db') subplot(2,1,2) rfplot(S,2,1,'angle')
rationalfit
При использовании значения по умолчанию для 'Weight'
Используйте 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')
Использование параметра 'Weight', чтобы сделать эти данные относительно более важными, может помочь точности подгонки.
rationalfit
При использовании пользовательского значения для 'Weight'
При помощи 'Weight' 1./abs(s21)
, rationalfit
минимизирует относительную погрешность системы вместо абсолютной ошибки системы.
customfit = rationalfit(datafreq,s21,'Weight',1./abs(s21));
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.
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 = ['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')
График показывает, что пользовательский 'Weight'
параметр создал лучшую подгонку для точек данных с меньшими величинами.
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')