Этот пример показывает, как выполнить статистический анализ набора файлов данных S-параметра. Во-первых, считайте двенадцать файлов S-параметра, представляющих двенадцать подобных фильтров РФ в рабочее пространство MATLAB, и постройте их. Затем, постройте и анализируйте ответ полосы пропускания этих фильтров, чтобы гарантировать, что они соответствуют статистическим нормам.
Используйте встроенные функции RF Toolbox для чтения набора файлов данных S-параметра. Для каждого фильтра соберите и постройте необработанные значения S21 и значения дБ S21. Имена файлов являются AWS_Filter_1.s2p через AWS_Filter_12.s2p и расположены в директории: MATLABROOT/toolbox/rf/rfdemos. Эти файлы представляют 12 фильтров полосы пропускания с подобными спецификациями.
numfiles = 12; numfreq = 801; % Number of frequency points per file for n = 1:numfiles filename = ['AWS_Filter_',num2str(n),'.s2p']; S = sparameters(filename); s21 = rfparam(S,2,1); s21_data(:,n) = s21; s21_db(:,n) = 20*log10(abs(s21)); end freq = S.Frequencies; % Frequency values are the same for all files figure plot(freq/1e9,s21_db) xlabel('Frequency (GHz)') ylabel('Filter Response (dB)') title('Transmission performance of 12 filters') axis on grid on
В этом разделе найдите, сохраните и отобразите данные S21 на графике из только полосы нисходящего канала AWS (2.11 к 2,17 ГГц).
idx = find((freq >= 2.11e9) & (freq <= 2.17e9)); freq_pass_ghz = freq(idx)/1e9; for n = 1:numfiles s21_pass_db(:,n) = s21_db(idx,n); s21_pass_data(:,n) = s21_data(idx,n); end plot(freq_pass_ghz,s21_pass_db) xlabel('Frequency (GHz)') ylabel('Filter Response (dB)') title('Passband variation of 12 filters') axis([min(freq_pass_ghz) max(freq_pass_ghz) -1 0]) grid on
Выполните Статистический анализ значения и фазы всей полосы пропускания наборы данных S21. Это определяет, следуют ли данные за нормальным распределением и если существуют данные о выбросе.
% Calculate the mean and standard deviation of the magnitude of the entire % passband S21 data set. mean_abs_S21 = mean(abs(s21_pass_data(:))) std_abs_S21 = std(abs(s21_pass_data(:))) % Calculate the mean and standard deviation of the passband magnitude % response at each frequency point. This determines if the data follows a % normal distribution. mean_abs_S21_freq = mean(abs(s21_pass_data),2); std_abs_S21_freq = std(abs(s21_pass_data),0,2);
mean_abs_S21 = 0.9289 std_abs_S21 = 0.0104
Отобразите все необработанные данные о значении полосы пропускания на графике как функцию частоты, а также верхнее и нижние пределы, заданные основным статистическим анализом.
hold on plot(freq_pass_ghz,mean_abs_S21_freq) plot(freq_pass_ghz,mean_abs_S21_freq + 2*std_abs_S21_freq,'r') plot(freq_pass_ghz,mean_abs_S21_freq - 2*std_abs_S21_freq,'k') legend('Mean','Mean + 2*STD','Mean - 2*STD') plot(freq_pass_ghz,abs(s21_pass_data),'c','HandleVisibility','off') grid on axis([min(freq_pass_ghz) max(freq_pass_ghz) 0.9 1]); ylabel('Magnitude S21') xlabel('Frequency (GHz)') title('S21 (Magnitude) - Statistical Analysis') hold off
Постройте гистограмму для данных о значении полосы пропускания. Это определяет, следуют ли верхнее и нижние пределы данных за нормальным распределением.
histfit(abs(s21_pass_data(:))) grid on axis([0.8 1 0 100]) xlabel('Magnitude S21') ylabel('Distribution') title('Compare filter passband response vs. a normal distribution')
Вычислите фазовый отклик полосы пропускания данные S21, затем среднее и стандартное отклонение на частоту фазового отклика. Все данные о фазе S21 полосы пропускания затем собраны в один вектор для более позднего анализа.
pha_s21 = angle(s21_pass_data)*180/pi; mean_pha_S21 = mean(pha_s21,2); std_pha_S21 = std(pha_s21,0,2); all_pha_data = reshape(pha_s21.',numel(pha_s21),1); % Plot all the raw passband phase data as a function of frequency, as well % as the upper and lower limits defined by the basic statistical analysis. hold on plot(freq_pass_ghz,mean_pha_S21) plot(freq_pass_ghz,mean_pha_S21 + 2*std_pha_S21,'r') plot(freq_pass_ghz,mean_pha_S21 - 2*std_pha_S21,'k') legend('Mean','Mean + 2*STD','Mean - 2*STD') plot(freq_pass_ghz,pha_s21,'c','HandleVisibility','off') grid on axis([min(freq_pass_ghz) max(freq_pass_ghz) -180 180]) ylabel('Phase S21') xlabel('Frequency (GHz)') title('S21 (Phase) - Statistical Analysis') hold off
Постройте гистограмму для данных о фазе полосы пропускания. Это определяет, следуют ли верхнее и нижние пределы данных за равномерным распределением.
histogram(all_pha_data,35) grid on axis([-180 180 0 100]) xlabel('Phase S21 (degrees)') ylabel('Distribution') title('Histogram of the filter phase response')
% Perform ANOVA analysis on both the magnitude and phase passband data. anova1(abs(s21_pass_data).',freq_pass_ghz); ylabel('Magnitude S21') xlabel('Frequency (GHz)') ax1 = gca; ax1.XTick = 0.5:10:120.5; ax1.XTickLabel = {2.11,'',2.12,'',2.13,'',2.14,'',2.15,'',2.16,'',2.17}; title('Analysis of variance (ANOVA) of passband loss') grid on
anova1(pha_s21.',freq_pass_ghz); ylabel('Phase S21 (degrees)') xlabel('Frequency (GHz)') ax2 = gca; ax2.XTick = 0.5:10:120.5; ax2.XTickLabel = {2.11,'',2.12,'',2.13,'',2.14,'',2.15,'',2.16,'',2.17}; title('Analysis of variance (ANOVA) of passband phase response') grid on
% Perform a curve fit of the S21 phase data using a linear regression % model. phase_s21_fit = fit(repmat(freq_pass_ghz,numfiles,1),all_pha_data,'poly1')
phase_s21_fit = Linear model Poly1: phase_s21_fit(x) = p1*x + p2 Coefficients (with 95% confidence bounds): p1 = -310.8 (-500.9, -120.6) p2 = 665.3 (258.3, 1072)