function results = extractAutocorrelation(theta_values, angular_spectral_distribution, scan_parameter_values, N_shots, N_angular_bins) %% Extract g² (autocorrelation) from experimental images % Computes angular autocorrelation g² for a set of experimental images. % Uses conductSpectralAnalysis to compute S(θ) and θ-values, then groups % images by scan parameter and computes normalized autocorrelations. % ===== Convert spectral distributions to matrix ===== delta_nkr_all = zeros(N_shots, N_angular_bins); for k = 1:N_shots delta_nkr_all(k, :) = angular_spectral_distribution{k}; end % ===== Group images by scan parameter values ===== [unique_scan_parameter_values, ~, idx] = unique(scan_parameter_values); N_params = length(unique_scan_parameter_values); % ===== Preallocate output arrays ===== g2_all = zeros(N_params, N_angular_bins); g2_error_all = zeros(N_params, N_angular_bins); % ===== Compute g²(θ) for each scan parameter group ===== for i = 1:N_params group_idx = find(idx == i); group_data = delta_nkr_all(group_idx, :); for dtheta = 0:N_angular_bins-1 temp = zeros(length(group_idx), 1); for j = 1:length(group_idx) profile = group_data(j, :); profile_shifted = circshift(profile, -dtheta, 2); num = mean(profile .* profile_shifted); denom = mean(profile.^2); temp(j) = num / denom; end g2_all(i, dtheta+1) = mean(temp, 'omitnan'); g2_error_all(i, dtheta+1) = std(temp, 'omitnan') / sqrt(length(group_idx)); end end % ===== Package results ===== results = struct(); results.g2_all = g2_all; results.g2_error_all = g2_error_all; results.theta_values = theta_values; end