101 lines
3.2 KiB
Matlab
101 lines
3.2 KiB
Matlab
%% Plot cavity signal
|
|
% Load the data from the CSV file
|
|
ScopeData = readmatrix('.csv');
|
|
|
|
% Extract Time and CavitySignal with offsets
|
|
Time = ScopeData(:, 1);
|
|
CavitySignal = ScopeData(:, 2);
|
|
|
|
% Calculate xoffset and yoffset
|
|
xoffset = Time(1);
|
|
yoffset = min(CavitySignal);
|
|
|
|
% Adjust CavitySignal and Time
|
|
CavitySignal = CavitySignal - yoffset;
|
|
Time = Time - xoffset;
|
|
|
|
% Plot the data
|
|
figure;
|
|
scatter(Time, CavitySignal, 10, 'b', 'filled', 'MarkerFaceAlpha', 0.5);
|
|
grid on;
|
|
|
|
% Format the plot
|
|
xlabel('\bf Time (s)', 'FontSize', 16);
|
|
ylabel('\bf Voltage (V)', 'FontSize', 16);
|
|
title('\bf Cavity Signal', 'FontSize', 16);
|
|
set(gca, 'FontSize', 12);
|
|
|
|
%% Fit cavity signal
|
|
|
|
% Extract signal cavity mode
|
|
tstartIdx = 1;
|
|
tendIdx = 50;
|
|
TruncatedScopeData = ScopeData(tstartIdx:tendIdx,:);
|
|
|
|
% Fit and plot Airy function, extracting characteristic parameters
|
|
fitAndplotCavityMode(TruncatedScopeData);
|
|
|
|
|
|
%% Extract distance between consecutive cavity modes and their amplitudes
|
|
|
|
% == Add two Airy functions to fit two consecutive cavity modes == %
|
|
|
|
function fitAndplotCavityMode(dataset)
|
|
% Define the Airy function
|
|
AiryFunc = @(a, b, t) a ./ (1 + b * (sin(t / 2)).^2);
|
|
|
|
% Perform non-linear fitting to find parameters a and b
|
|
t = dataset(:, 1);
|
|
CavitySignal = dataset(:, 2);
|
|
fitParams = fit(t, CavitySignal, @(a, b, t) AiryFunc(a, b, t), ...
|
|
'StartPoint', [1, 1]);
|
|
a = fitParams.a;
|
|
b = fitParams.b; % Coefficient of finesse from fit
|
|
|
|
% Calculate reflectivity (r)
|
|
syms r;
|
|
Reflectivity = solve(b == (4 * r) / (1 - r)^2, r);
|
|
|
|
% Calculate finesse from reflectivity (r)
|
|
Finesse = (pi * sqrt(Reflectivity))/(1 - Reflectivity);
|
|
|
|
% Generate fitted data
|
|
fitData = [t, AiryFunc(a, b, t)];
|
|
|
|
% Find FWHM
|
|
maxSignal = max(fitData(:, 2));
|
|
left = find(fitData(:, 2) >= maxSignal / 2, 1, 'first');
|
|
right = find(fitData(:, 2) >= maxSignal / 2, 1, 'last');
|
|
FWHM = fitData(right, 1) - fitData(left, 1);
|
|
|
|
% Calculate FSR from Finesse and FWHM
|
|
FSR = Finesse * FWHM;
|
|
|
|
% Plot the original data and the fitted curve
|
|
figure;
|
|
plot(dataset(:, 1), dataset(:, 2), 'o', 'MarkerSize', 5, ...
|
|
'MarkerEdgeColor', 'blue', 'MarkerFaceColor', 'blue', ...
|
|
'DisplayName', 'Cavity Signal', 'MarkerFaceAlpha', 0.5);
|
|
hold on;
|
|
plot(fitData(:, 1), fitData(:, 2), '--', 'LineWidth', 1.5, ...
|
|
'Color', [1, 0.5, 0], 'DisplayName', 'Best Fit');
|
|
hold off;
|
|
|
|
% Customize the plot
|
|
grid on;
|
|
xlabel('\bf Time (s)', 'FontSize', 16);
|
|
ylabel('\bf Voltage (V)', 'FontSize', 16);
|
|
title('\bf Airy Function Fit', 'FontSize', 16);
|
|
legend('show', 'Location', 'Best');
|
|
|
|
% Annotate the plot with fit results
|
|
annotation('textbox', [0.6, 0.7, 0.3, 0.2], ...
|
|
'String', sprintf(['Reflectivity = %.1f\n', ...
|
|
'Finesse = %.1f\n', ...
|
|
'FWHM = %.2f \n', ...
|
|
'FSR = %.2f'], ...
|
|
Reflectivity, Finesse, FWHM, FSR), ...
|
|
'EdgeColor', 'none', ...
|
|
'FontSize', 12);
|
|
end
|