new plots for Diss. Mostly AI gen. Few changes in actual codebase
This commit is contained in:
@@ -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");
|
||||
@@ -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}'});
|
||||
@@ -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}%
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user