Calculations/Data-Analyzer/+Analyzer/computeSpectralAverages.m

51 lines
1.6 KiB
Matlab

function results = computeSpectralAverages(S_all, scan_reference_values)
%% computeSpectralAverages
% Compute mean and SEM of spectra grouped by scan parameter.
% Handles both 1D curves and 2D matrices.
[uniqueParams, ~, idx] = unique(scan_reference_values);
nParams = numel(uniqueParams);
nTotal = numel(S_all);
nReps = nTotal / nParams;
% Determine data dimensionality
firstData = S_all{1};
dataSize = size(firstData);
isMatrix = (numel(size(firstData)) == 2) && all(size(firstData) > 1);
curves_all = cell(1, nParams);
curves_mean = cell(1, nParams);
curves_err = cell(1, nParams);
for i = 1:nParams
if isMatrix
% --- Case: 2D matrix (e.g., power spectra) ---
data_sum = 0;
for r = 1:nReps
idx_r = (r-1)*nParams + i;
data_sum = data_sum + S_all{idx_r};
end
avg = data_sum / nReps;
curves_all{i} = []; % not used for 2D
curves_mean{i} = avg;
curves_err{i} = [];
else
% --- Case: 1D curve ---
nPoints = numel(S_all{1});
curves = zeros(nReps, nPoints);
for r = 1:nReps
idx_r = (r-1)*nParams + i;
curves(r,:) = S_all{idx_r};
end
curves_all{i} = curves;
curves_mean{i} = mean(curves,1);
curves_err{i} = std(curves,0,1)/sqrt(nReps);
end
end
results.curves_all = curves_all;
results.curves_mean = curves_mean;
results.curves_error = curves_err;
results.scan_parameters = uniqueParams;
end