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

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

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

Используйте функцию 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')

Используя параметр 'Веса', чтобы сделать те данные относительно более важными может помочь точности подгонки.

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

При помощи 'Веса' 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')