new plots for Diss. Mostly AI gen. Few changes in actual codebase

This commit is contained in:
Silas Oettinghaus
2026-07-30 08:35:45 +02:00
parent 125d8508ca
commit 7a9deaeb0c
62 changed files with 6171 additions and 630 deletions

View File

@@ -0,0 +1,274 @@
%AMPLIFIER_GAIN_ANALYSIS Compare the Aeon SOA and Thorlabs PDFA gain.
%
% The first figure shows gain versus wavelength for the pump levels that
% are available in the wavelength-sweep warehouses. The second figure
% shows gain versus pump level at -10 dBm input power and 1310 nm. The
% third and fourth figures show output power and OSNR versus wavelength.
% The fifth figure estimates the optical noise figure from the ASE level.
%
% The 2 dB setup correction follows amplifier_input_output_curve.m:
% gain = Pout - (Pin - 2 dB) = Pout - Pin + 2 dB.
scriptDir = fileparts(mfilename("fullpath"));
repoDir = fileparts(fileparts(scriptDir));
warehouseClassDir = fullfile(repoDir, "Classes", "Warehouse_class", "classes");
if ~contains(string(path), warehouseClassDir)
addpath(warehouseClassDir);
end
inputPowerDb = -10;
inputPowerCorrectionDb = 2;
correctedInputPowerDb = inputPowerDb - inputPowerCorrectionDb;
wavelengthForPumpSweepNm = 1310;
osaResolutionNm = 0.1;
% Wavelength-dependent measurements: pump values are 50, 75, and 100 %.
lambdaSweepAeon = load(fullfile(scriptDir, "aeon_soa_measurement_lambda_plaser_pump.mat"), "wh");
lambdaSweepThorlabs = load(fullfile(scriptDir, "thorlabs_pdfa_measurement_lambda_plaser_pump.mat"), "wh");
whAeonLambda = lambdaSweepAeon.wh;
whThorlabsLambda = lambdaSweepThorlabs.wh;
% Pump-level measurements: pump values are available from 0 to 100 % in 5 % steps.
pumpSweepAeon = load(fullfile(scriptDir, "aeon_soa_measurement_pump_level_sweep.mat"), "wh");
pumpSweepThorlabs = load(fullfile(scriptDir, "thorlabs_pdfa_measurement_pump_level_sweep.mat"), "wh");
whAeonPump = pumpSweepAeon.wh;
whThorlabsPump = pumpSweepThorlabs.wh;
if ~ismember(inputPowerDb, whAeonLambda.parameter.laserpower.values)
error("Input power %g dBm is not present in the wavelength-sweep warehouse.", inputPowerDb);
end
if ~ismember(wavelengthForPumpSweepNm, whAeonPump.parameter.lambda.values)
error("Wavelength %g nm is not present in the pump-sweep warehouse.", wavelengthForPumpSweepNm);
end
% The warehouse uses physical values as query arguments. Vector queries
% return one row per requested physical value.
wavelengthsNm = whAeonLambda.parameter.lambda.values;
pumpLevelsLambda = whAeonLambda.parameter.pump.values;
pumpLevelsSweep = whAeonPump.parameter.pump.values;
%% Gain versus wavelength
figure("Name", "Amplifier gain versus wavelength", "Color", "w");
tiledlayout(1, 2, "TileSpacing", "compact", "Padding", "compact");
lambdaWarehouses = {whAeonLambda, whThorlabsLambda};
amplifierNames = ["Aeon SOA", "Thorlabs PDFA"];
for amplifierIndex = 1:numel(lambdaWarehouses)
nexttile;
hold on;
colors = lines(numel(pumpLevelsLambda));
wh = lambdaWarehouses{amplifierIndex};
for pumpIndex = 1:numel(pumpLevelsLambda)
pumpLevel = pumpLevelsLambda(pumpIndex);
signalOutputDb = wh.getStoValue("psig_osa", inputPowerDb, wavelengthsNm, pumpLevel);
totalOutputDb = wh.getStoValue("psig_total", inputPowerDb, wavelengthsNm, pumpLevel);
signalGainDb = signalOutputDb - correctedInputPowerDb;
totalGainDb = totalOutputDb - correctedInputPowerDb;
plot(wavelengthsNm, signalGainDb, "-", "Color", colors(pumpIndex, :), ...
"LineWidth", 1.5, ...
"DisplayName", sprintf("Pump %g%%: signal", pumpLevel));
plot(wavelengthsNm, totalGainDb, "--", "Color", colors(pumpIndex, :), ...
"LineWidth", 1.2, ...
"DisplayName", sprintf("Pump %g%%: total", pumpLevel));
end
title(amplifierNames(amplifierIndex), "Interpreter", "none");
xlabel("Wavelength [nm]", "Interpreter", "none");
ylabel("Gain [dB]", "Interpreter", "none");
grid on;
box on;
legend("Location", "best", "Interpreter", "none");
end
sgtitle(sprintf("Gain versus wavelength at P_{in} = %g dBm (2 dB setup correction)", inputPowerDb), ...
"Interpreter", "tex");
%% Gain versus pump level at -10 dBm input power
figure("Name", "Amplifier gain versus pump level", "Color", "w");
hold on;
colors = lines(numel(lambdaWarehouses));
pumpWarehouses = {whAeonPump, whThorlabsPump};
for amplifierIndex = 1:numel(pumpWarehouses)
wh = pumpWarehouses{amplifierIndex};
signalOutputDb = wh.getStoValue("psig_osa", inputPowerDb, wavelengthForPumpSweepNm, pumpLevelsSweep);
totalOutputDb = wh.getStoValue("psig_total", inputPowerDb, wavelengthForPumpSweepNm, pumpLevelsSweep);
signalGainDb = signalOutputDb - correctedInputPowerDb;
totalGainDb = totalOutputDb - correctedInputPowerDb;
plot(pumpLevelsSweep, signalGainDb, "-", "Color", colors(amplifierIndex, :), ...
"LineWidth", 1.6, ...
"DisplayName", amplifierNames(amplifierIndex) + " - signal");
plot(pumpLevelsSweep, totalGainDb, "--", "Color", colors(amplifierIndex, :), ...
"LineWidth", 1.3, ...
"DisplayName", amplifierNames(amplifierIndex) + " - total");
end
title(sprintf("Gain versus pump level at P_{in} = %g dBm, %g nm", ...
inputPowerDb, wavelengthForPumpSweepNm), "Interpreter", "tex");
xlabel("Pump level [percent]", "Interpreter", "none");
ylabel("Gain [dB]", "Interpreter", "none");
grid on;
box on;
legend("Location", "best", "Interpreter", "none");
%% Output power versus wavelength
figure("Name", "Amplifier output power versus wavelength", "Color", "w");
tiledlayout(1, 2, "TileSpacing", "compact", "Padding", "compact");
for amplifierIndex = 1:numel(lambdaWarehouses)
nexttile;
hold on;
colors = lines(numel(pumpLevelsLambda));
wh = lambdaWarehouses{amplifierIndex};
legendHandles = gobjects(numel(pumpLevelsLambda), 1);
for pumpIndex = 1:numel(pumpLevelsLambda)
pumpLevel = pumpLevelsLambda(pumpIndex);
signalOutputDb = wh.getStoValue("psig_osa", inputPowerDb, wavelengthsNm, pumpLevel);
totalOutputDb = wh.getStoValue("psig_total", inputPowerDb, wavelengthsNm, pumpLevel);
plot(wavelengthsNm, signalOutputDb, "-", "Color", colors(pumpIndex, :), ...
"LineWidth", 1.5, ...
"DisplayName", sprintf("Pump %g%%: signal", pumpLevel));
plot(wavelengthsNm, totalOutputDb, "--", "Color", colors(pumpIndex, :), ...
"LineWidth", 1.2, ...
"DisplayName", sprintf("Pump %g%%: total", pumpLevel));
end
title(amplifierNames(amplifierIndex), "Interpreter", "none");
xlabel("Wavelength [nm]", "Interpreter", "none");
ylabel("P_{out} [dBm]", "Interpreter", "tex");
grid on;
box on;
legend("Location", "best", "Interpreter", "none");
end
sgtitle(sprintf("Output power versus wavelength at P_{in} = %g dBm", inputPowerDb), ...
"Interpreter", "tex");
%% OSNR versus wavelength
figure("Name", "Amplifier OSNR versus wavelength", "Color", "w");
tiledlayout(1, 2, "TileSpacing", "compact", "Padding", "compact");
for amplifierIndex = 1:numel(lambdaWarehouses)
nexttile;
hold on;
colors = lines(numel(pumpLevelsLambda));
wh = lambdaWarehouses{amplifierIndex};
for pumpIndex = 1:numel(pumpLevelsLambda)
pumpLevel = pumpLevelsLambda(pumpIndex);
% osnr_osa is calculated from spectrum_osa during measurement.
osnrResults = wh.getStoValue("osnr_osa", inputPowerDb, wavelengthsNm, pumpLevel);
osnrDb = cellfun(@(result) result.corrected_dB, osnrResults);
plot(wavelengthsNm, osnrDb, "-", "Color", colors(pumpIndex, :), ...
"LineWidth", 1.5, ...
"DisplayName", sprintf("Pump %g%%", pumpLevel));
end
title(amplifierNames(amplifierIndex), "Interpreter", "none");
xlabel("Wavelength [nm]", "Interpreter", "none");
ylabel("OSNR [dB]", "Interpreter", "none");
grid on;
box on;
legend("Location", "best", "Interpreter", "none");
end
sgtitle(sprintf("OSNR versus wavelength at P_{in} = %g dBm", inputPowerDb), ...
"Interpreter", "tex");
%% Noise figure versus wavelength
% The stored pase_osa values are OSA power readings per resolution
% bandwidth. The measurement script configured the OSA to 0.1 nm.
hPlanck = 6.62607015e-34;
speedOfLight = 299792458;
lambdaMeters = wavelengthsNm(:) .* 1e-9;
opticalFrequencyHz = speedOfLight ./ lambdaMeters;
opticalNoiseBandwidthHz = speedOfLight ./ lambdaMeters.^2 .* (osaResolutionNm * 1e-9);
quantumNoisePowerW = hPlanck .* opticalFrequencyHz .* opticalNoiseBandwidthHz;
figure("Name", "Amplifier noise figure versus wavelength", "Color", "w");
tiledlayout(1, 2, "TileSpacing", "compact", "Padding", "compact");
for amplifierIndex = 1:numel(lambdaWarehouses)
nexttile;
hold on;
colors = lines(numel(pumpLevelsLambda));
wh = lambdaWarehouses{amplifierIndex};
for pumpIndex = 1:numel(pumpLevelsLambda)
pumpLevel = pumpLevelsLambda(pumpIndex);
signalOutputDb = wh.getStoValue("psig_osa", inputPowerDb, wavelengthsNm, pumpLevel);
aseOutputDb = wh.getStoValue("pase_osa", inputPowerDb, wavelengthsNm, pumpLevel);
gainDb = signalOutputDb - correctedInputPowerDb;
linearGain = 10.^(gainDb ./ 10);
asePowerW = 10.^((aseOutputDb - 30) ./ 10);
% Exact estimate including the amplified input shot-noise term.
noiseFactor = 1 ./ linearGain + ...
asePowerW ./ (linearGain .* quantumNoisePowerW);
noiseFigureDb = 10 .* log10(noiseFactor);
legendHandles(pumpIndex) = plot(wavelengthsNm(:), noiseFigureDb, "-", ...
"Color", colors(pumpIndex, :), ...
"LineWidth", 1.5, ...
"DisplayName", sprintf("Pump %g%%", pumpLevel));
end
title(amplifierNames(amplifierIndex), "Interpreter", "none");
xlabel("Wavelength [nm]", "Interpreter", "none");
ylabel("Noise figure [dB]", "Interpreter", "none");
grid on;
box on;
legend(legendHandles, "Location", "best", "Interpreter", "none");
end
sgtitle(sprintf("Estimated noise figure versus wavelength at P_{in} = %g dBm", inputPowerDb), ...
"Interpreter", "tex");
%% Final figure: Thorlabs gain versus wavelength
figure("Name", "Thorlabs PDFA gain versus wavelength", "Color", "w");
hold on;
colors = lines(numel(pumpLevelsLambda));
gainHandles = gobjects(numel(pumpLevelsLambda), 1);
for pumpIndex = 1:numel(pumpLevelsLambda)
pumpLevel = pumpLevelsLambda(pumpIndex);
signalOutputDb = whThorlabsLambda.getStoValue( ...
"psig_osa", inputPowerDb, wavelengthsNm, pumpLevel);
gainDb = signalOutputDb - correctedInputPowerDb;
gainHandles(pumpIndex) = plot(wavelengthsNm, gainDb, "-", ...
"Color", colors(pumpIndex, :), ...
"LineWidth", 1.6, ...
"DisplayName", sprintf("Pump %g%%: gain", pumpLevel));
end
title(sprintf("Thorlabs PDFA: gain versus wavelength at P_{in} = %g dBm", ...
inputPowerDb), "Interpreter", "tex");
xlabel("Wavelength [nm]", "Interpreter", "none");
ylabel("Gain [dB]", "Interpreter", "none");
grid on;
box on;
legend(gainHandles, "Location", "best", "Interpreter", "none");

View File

@@ -0,0 +1,87 @@
%AVAILABLE_OUTPUT_POWER_VS_WAVELENGTH Plot achieved laser output power.
%
% laser_outputpower_sweep_2_many_averages.mat contains the requested
% wavelength and laser-power values. The corresponding 20-trace
% measurements are stored in the local FIG file and are averaged here.
scriptDir = fileparts(mfilename("fullpath"));
parameterData = load(fullfile(scriptDir, "laser_outputpower_sweep_2_many_averages.mat"));
laserparams = parameterData.laserparams;
averagesPerSetpoint = 20;
measurementFigure = openfig( ...
fullfile(scriptDir, "available_output_power_exfo_t100_oband_20_averages.fig"), ...
"invisible");
measurementAxes = findall(measurementFigure, "Type", "axes");
measurementLines = findall(measurementAxes, "Type", "line");
numberOfSetpoints = numel(laserparams.laserpower);
numberOfWavelengths = numel(laserparams.lambda);
expectedLineCount = numberOfSetpoints * averagesPerSetpoint;
if numel(measurementLines) ~= expectedLineCount
close(measurementFigure);
error("Expected %d measurement traces, found %d.", ...
expectedLineCount, numel(measurementLines));
end
measuredLambda = measurementLines(1).XData(:).';
if numel(measuredLambda) ~= numberOfWavelengths || ...
any(abs(measuredLambda - laserparams.lambda) > 1e-9)
close(measurementFigure);
error("Measurement wavelengths do not match laserparams.lambda.");
end
achievedPowerDbm = zeros(numberOfSetpoints, numberOfWavelengths);
for setpointIndex = 1:numberOfSetpoints
firstLine = (setpointIndex - 1) * averagesPerSetpoint + 1;
traces = zeros(averagesPerSetpoint, numberOfWavelengths);
for averageIndex = 1:averagesPerSetpoint
trace = measurementLines(firstLine + averageIndex - 1).YData(:).';
traces(averageIndex, :) = trace;
end
achievedPowerDbm(setpointIndex, :) = mean(traces, 1, "omitnan");
end
close(measurementFigure);
% The measurement traces are stored in descending output-power order.
% Sort them so they match the ascending laserparams.laserpower order.
[~, sortIndex] = sort(mean(achievedPowerDbm, 2, "omitnan"));
achievedPowerDbm = achievedPowerDbm(sortIndex, :);
figure("Name", "Available laser output power", "Color", "w");
hold on;
colors = lines(numberOfSetpoints);
annotationX = laserparams.lambda(end) - 1;
for setpointIndex = 1:numberOfSetpoints
yline(laserparams.laserpower(setpointIndex), ":", ...
"Color", [0.65 0.65 0.65], "HandleVisibility", "off");
plot(laserparams.lambda, achievedPowerDbm(setpointIndex, :), "-", ...
"Color", colors(setpointIndex, :), "LineWidth", 1.6, ...
"DisplayName", sprintf("Target %g dBm: measured", ...
laserparams.laserpower(setpointIndex)));
text(annotationX, laserparams.laserpower(setpointIndex), ...
sprintf("P_{set} = %g dBm", laserparams.laserpower(setpointIndex)), ...
"Color", colors(setpointIndex, :), "Interpreter", "tex", ...
"HorizontalAlignment", "right", "VerticalAlignment", "bottom", ...
"HandleVisibility", "off");
end
title("Available laser output power versus wavelength", "Interpreter", "none");
xlabel("Wavelength [nm]", "Interpreter", "none");
ylabel("Achieved output power [dBm]", "Interpreter", "none");
grid on;
box on;
legend("Location", "northwest", "Interpreter", "none");
% Export the same figure with the repository-local matlab2tikz version.
repoDir = fileparts(fileparts(scriptDir));
addpath(fullfile(repoDir, "Libs", "mat2tikz", "src"));
tikzOutputFile = fullfile(scriptDir, "available_output_power_vs_wavelength.tikz");
matlab2tikz(char(tikzOutputFile), ...
'showInfo', false, ...
'showHiddenStrings', true, ...
'extraAxisOptions', {'legend style={font=\footnotesize}'});

View File

@@ -0,0 +1,350 @@
% This file was created by matlab2tikz.
%
\definecolor{mycolor1}{rgb}{0.89412,0.10196,0.10980}%
\definecolor{mycolor2}{rgb}{0.21569,0.49412,0.72157}%
\definecolor{mycolor3}{rgb}{0.30196,0.68627,0.29020}%
\definecolor{mycolor4}{rgb}{0.59608,0.30588,0.63922}%
\definecolor{mycolor5}{rgb}{1.00000,0.49804,0.00000}%
\definecolor{mycolor6}{rgb}{0.12941,0.12941,0.12941}%
%
\begin{tikzpicture}
\begin{axis}[%
width=6.458in,
height=5.094in,
at={(1.083in,0.688in)},
scale only axis,
xmin=1260,
xmax=1360,
xlabel style={font=\color{mycolor6}},
xlabel={Wavelength [nm]},
ymin=-2,
ymax=12,
ylabel style={font=\color{mycolor6}},
ylabel={Achieved output power [dBm]},
axis background/.style={fill=white},
title style={font=\bfseries\color{mycolor6}},
title={Available laser output power versus wavelength},
xmajorgrids,
ymajorgrids,
grid style={dashed},
legend style={at={(0.03,0.97)}, anchor=north west, legend cell align=left, align=left},
legend style={font=\footnotesize}
]
\addplot [color=white!65!black, dotted, forget plot]
table[row sep=crcr]{%
1260 0\\
1360 0\\
};
\addplot [color=mycolor1, line width=1.6pt]
table[row sep=crcr]{%
1260 -0.00174427500000025\\
1262 0.0049530015000002\\
1264 0.00258243800000004\\
1266 0.047948272\\
1268 0.035907209\\
1270 0.039917379\\
1272 0.0499743345000001\\
1274 0.05230108\\
1276 0.0532826289999999\\
1278 0.0831857375000001\\
1280 0.0627413579999998\\
1282 0.0488831240000001\\
1284 0.0447253150000001\\
1286 0.0355354289999999\\
1288 -0.00749986499999977\\
1290 0.00176488450000019\\
1292 -0.01833745\\
1294 -0.0421456650000001\\
1296 -0.05284091\\
1298 -0.0608307149999999\\
1300 -0.0629399749999999\\
1302 -0.0542474850000001\\
1304 -0.0943844899999999\\
1306 -0.11916809\\
1308 -0.088293575\\
1310 -0.106838255\\
1312 -0.142186045\\
1314 -0.122909425\\
1316 -0.136120425\\
1318 -0.169754955\\
1320 -0.14376953\\
1322 -0.153371705\\
1324 -0.19083209\\
1326 -0.16585443\\
1328 -0.16738367\\
1330 -0.18946759\\
1332 -0.16708397\\
1334 -0.125356505\\
1336 -0.125601985\\
1338 -0.133365665\\
1340 -0.07764601\\
1342 -0.0349484850000002\\
1344 -0.054868575\\
1346 0.0190894669999999\\
1348 0.0787105715000002\\
1350 0.0655493160000001\\
1352 0.0920785395000001\\
1354 0.139883643\\
1356 0.1389105975\\
1358 0.15040566\\
1360 0.1795823165\\
};
\addlegendentry{Target 0 dBm: measured}
\node[above left, align=right, inner sep=0, font=\color{mycolor1}]
at (axis cs:1359,0) {$\text{P}_{\text{set}}\text{ = 0 dBm}$};
\addplot [color=white!65!black, dotted, forget plot]
table[row sep=crcr]{%
1260 3\\
1360 3\\
};
\addplot [color=mycolor2, line width=1.6pt]
table[row sep=crcr]{%
1260 3.001012505\\
1262 3.006422054\\
1264 3.008953025\\
1266 3.0601149535\\
1268 3.0454856245\\
1270 3.047445995\\
1272 3.060657117\\
1274 3.071385682\\
1276 3.06080489\\
1278 3.079472899\\
1280 3.061335045\\
1282 3.050070503\\
1284 3.055032579\\
1286 3.042449593\\
1288 3.0135694995\\
1290 3.0167014675\\
1292 3.0036652445\\
1294 2.9777426285\\
1296 2.9726872215\\
1298 2.9398711715\\
1300 2.916202023\\
1302 2.927803093\\
1304 2.904134328\\
1306 2.888280249\\
1308 2.8835689165\\
1310 2.882305029\\
1312 2.8897452415\\
1314 2.8942784325\\
1316 2.885521624\\
1318 2.8517907965\\
1320 2.843298358\\
1322 2.855958141\\
1324 2.8360024095\\
1326 2.82446217\\
1328 2.8612967225\\
1330 2.8202706295\\
1332 2.8185087195\\
1334 2.8657736085\\
1336 2.859368219\\
1338 2.8706378305\\
1340 2.9512009455\\
1342 2.9559564765\\
1344 2.9683251885\\
1346 3.0288653\\
1348 3.082960566\\
1350 3.0701560325\\
1352 3.1103352335\\
1354 3.148218037\\
1356 3.137503138\\
1358 3.1635465145\\
1360 3.1890315515\\
};
\addlegendentry{Target 3 dBm: measured}
\node[above left, align=right, inner sep=0, font=\color{mycolor2}]
at (axis cs:1359,3) {$\text{P}_{\text{set}}\text{ = 3 dBm}$};
\addplot [color=white!65!black, dotted, forget plot]
table[row sep=crcr]{%
1260 6\\
1360 6\\
};
\addplot [color=mycolor3, line width=1.6pt]
table[row sep=crcr]{%
1260 5.987181772\\
1262 6.01080855\\
1264 6.0196549575\\
1266 6.0658400605\\
1268 6.0468314485\\
1270 6.0572872865\\
1272 6.0622857945\\
1274 6.0605621715\\
1276 6.056511485\\
1278 6.075664353\\
1280 6.0551906125\\
1282 6.0599489405\\
1284 6.0755984025\\
1286 6.0270936715\\
1288 6.0354817275\\
1290 6.022740339\\
1292 6.002313234\\
1294 5.980794718\\
1296 5.976163088\\
1298 5.950657563\\
1300 5.9223667825\\
1302 5.935413683\\
1304 5.9015896255\\
1306 5.8993098045\\
1308 5.891102095\\
1310 5.881858564\\
1312 5.8940111635\\
1314 5.903941552\\
1316 5.888497728\\
1318 5.857725498\\
1320 5.8567185045\\
1322 5.861671574\\
1324 5.8387118195\\
1326 5.833706753\\
1328 5.868907057\\
1330 5.8273320035\\
1332 5.8389400305\\
1334 5.876151523\\
1336 5.8620020595\\
1338 5.892156925\\
1340 5.9586369025\\
1342 5.9567924075\\
1344 5.982374356\\
1346 6.0375119525\\
1348 6.0890175215\\
1350 6.086149783\\
1352 6.1184705185\\
1354 6.1594823235\\
1356 6.1509530645\\
1358 6.180046173\\
1360 6.201404003\\
};
\addlegendentry{Target 6 dBm: measured}
\node[above left, align=right, inner sep=0, font=\color{mycolor3}]
at (axis cs:1359,6) {$\text{P}_{\text{set}}\text{ = 6 dBm}$};
\addplot [color=white!65!black, dotted, forget plot]
table[row sep=crcr]{%
1260 8\\
1360 8\\
};
\addplot [color=mycolor4, line width=1.6pt]
table[row sep=crcr]{%
1260 6.031553038\\
1262 6.475926562\\
1264 6.9678239935\\
1266 7.3812834605\\
1268 7.6372069015\\
1270 7.9191694625\\
1272 8.0705430165\\
1274 8.075813651\\
1276 8.083409099\\
1278 8.084946346\\
1280 8.070698563\\
1282 8.072232142\\
1284 8.0797347955\\
1286 8.0427192865\\
1288 8.0515738335\\
1290 8.0293537885\\
1292 8.003326676\\
1294 7.9976869805\\
1296 7.99008813\\
1298 7.9492751595\\
1300 7.9346835125\\
1302 7.9539901195\\
1304 7.9017661065\\
1306 7.911127979\\
1308 7.907037724\\
1310 7.896197244\\
1312 7.907979363\\
1314 7.9250423625\\
1316 7.8998658815\\
1318 7.869535715\\
1320 7.8711403195\\
1322 7.8730818405\\
1324 7.845561009\\
1326 7.85929528\\
1328 7.8721726815\\
1330 7.843708335\\
1332 7.872582495\\
1334 7.8930589925\\
1336 7.882136431\\
1338 7.920374461\\
1340 7.9612389245\\
1342 7.968047289\\
1344 8.002771872\\
1346 8.054855834\\
1348 8.0969126465\\
1350 8.1158346705\\
1352 8.1537042675\\
1354 8.181075273\\
1356 8.1743607905\\
1358 8.184566916\\
1360 8.231713996\\
};
\addlegendentry{Target 8 dBm: measured}
\node[above left, align=right, inner sep=0, font=\color{mycolor4}]
at (axis cs:1359,8) {$\text{P}_{\text{set}}\text{ = 8 dBm}$};
\addplot [color=white!65!black, dotted, forget plot]
table[row sep=crcr]{%
1260 10\\
1360 10\\
};
\addplot [color=mycolor5, line width=1.6pt]
table[row sep=crcr]{%
1260 5.7017284215\\
1262 6.1986312315\\
1264 6.7501614225\\
1266 7.1907112785\\
1268 7.478677345\\
1270 7.8060430325\\
1272 8.1067171935\\
1274 8.276471823\\
1276 8.4638177645\\
1278 8.6111332305\\
1280 8.743436757\\
1282 8.832386923\\
1284 8.91278028\\
1286 9.04439012185\\
1288 9.04376373615\\
1290 9.0798988258\\
1292 9.03395511625\\
1294 8.9921718725\\
1296 9.0235644005\\
1298 8.984754639\\
1300 9.14610934125\\
1302 9.13106503035\\
1304 9.2086507995\\
1306 9.19881023815\\
1308 9.265719913\\
1310 9.09915279415\\
1312 9.26554581525\\
1314 9.52831931645\\
1316 9.6669975241\\
1318 9.7107443498\\
1320 9.7898754663\\
1322 9.83403242775\\
1324 9.8726901865\\
1326 9.8822262349\\
1328 9.88426970855\\
1330 9.84195532625\\
1332 9.87982448925\\
1334 9.90844454246\\
1336 9.89706352885\\
1338 9.9274772081\\
1340 9.991583686247\\
1342 9.983836191075\\
1344 10.01432601913\\
1346 10.08652218347\\
1348 10.1116048911\\
1350 10.1206856349\\
1352 10.1690383129\\
1354 10.191050599\\
1356 10.19157208575\\
1358 10.21642409705\\
1360 10.24591036845\\
};
\addlegendentry{Target 10 dBm: measured}
\node[above left, align=right, inner sep=0, font=\color{mycolor5}]
at (axis cs:1359,10) {$\text{P}_{\text{set}}\text{ = 10 dBm}$};
\end{axis}
\end{tikzpicture}%

View File

@@ -1,6 +1,6 @@
wh_aeon = load("C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\Lab_analysis\aeon_soa_measurement_lambda_plaser_pump.mat");
wh_aeon = load("C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\Lab_oband_laser_and_amp_analysis\aeon_soa_measurement_lambda_plaser_pump.mat");
wh_aeon = wh_aeon.wh;
wh_thor = load("C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\Lab_analysis\thorlabs_pdfa_measurement_lambda_plaser_pump.mat");
wh_thor = load("C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\Lab_oband_laser_and_amp_analysis\thorlabs_pdfa_measurement_lambda_plaser_pump.mat");
wh_thor = wh_thor.wh;
% Silas' custom "warehouse" datatype
@@ -34,7 +34,8 @@ for p = 1:numel(plasers)
spectrum_osa = wh_aeon.getStoValue('spectrum_osa',plasers(p),lambda,pumps(pmp));
wavelength_osa = wh_aeon.getStoValue('wavelength_osa',plasers(p),lambda,pumps(pmp));
plot(wavelength_osa,spectrum_osa,'DisplayName',sprintf('P_{in}: %d dB ',plasers(p)),'Color',cols(ccnt+1,:));
ylim([-60, 20]);
beautifyBERplot("logscale",false,"setmarkers",0,"setcolors",0);