50 lines
1.9 KiB
Matlab
50 lines
1.9 KiB
Matlab
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
|