Strengthen WDM and IM/DD optical tests

This commit is contained in:
Silas Oettinghaus
2026-03-25 08:07:31 +01:00
parent 0e6be4a584
commit 76be57515d
26 changed files with 1606 additions and 566 deletions

View File

@@ -1,10 +1,69 @@
classdef Amplifier_test < IMDDTestCase
% Auto-generated placeholder for Amplifier.
% Target: C:/Users/Silas/Documents/MATLAB/imdd_simulation/Classes/02_etc/Amplifier.m
methods (Test, TestTags = {'unit', 'fast', 'etc', 'amplifier'})
function constructorStoresConfiguredModesAndSettings(testCase)
amp = Amplifier( ...
"amp_mode", amp_mode.ideal_no_noise, ...
"gain_mode", gain_mode.gain, ...
"nase_mode", nase_mode.pass_ase, ...
"amplification_db", 7.5, ...
"noifig", 12);
methods (Test, TestTags = {'placeholder', 'todo'})
function testNotImplemented(testCase)
testCase.assumeFail("Tests for Amplifier are not implemented yet.");
testCase.verifyEqual(amp.amp_mode, amp_mode.ideal_no_noise);
testCase.verifyEqual(amp.gain_mode, gain_mode.gain);
testCase.verifyEqual(amp.nase_mode, nase_mode.pass_ase);
testCase.verifyEqual(amp.amplification_db, 7.5);
testCase.verifyEqual(amp.noifig, 12);
end
function gainModeAmplifiesOpticalSignalAndPreservesMetadata(testCase)
inputSignal = makeOpticalSignal([1; -1; 1; -1], 64e9, 1310e-9, 0, 0);
amp = Amplifier( ...
"amp_mode", amp_mode.ideal_no_noise, ...
"gain_mode", gain_mode.gain, ...
"nase_mode", nase_mode.pass_ase, ...
"amplification_db", 6);
outputSignal = amp.process(inputSignal);
expectedScale = 10^(6/20);
testCase.verifyClass(outputSignal, 'Opticalsignal');
testCase.verifyEqual(outputSignal.signal, expectedScale * inputSignal.signal, "AbsTol", 1e-12);
testCase.verifyEqual(outputSignal.nase, inputSignal.nase * expectedScale^2, "AbsTol", 1e-12);
testCase.verifyEqual(outputSignal.fs, inputSignal.fs);
testCase.verifyEqual(outputSignal.lambda, inputSignal.lambda);
testCase.verifyEqual(outputSignal.polrot, inputSignal.polrot);
testCase.verifyEqual(height(outputSignal.logbook), height(inputSignal.logbook) + 1);
testCase.verifyEqual(string(outputSignal.logbook.Description(end)), "Optical Amplifier ");
end
function outputPowerModeTargetsRequestedAveragePower(testCase)
inputSignal = makeOpticalSignal([1; -1; 1; -1], 64e9, 1310e-9, 0, 0);
amp = Amplifier( ...
"amp_mode", amp_mode.ideal_no_noise, ...
"gain_mode", gain_mode.output_power, ...
"nase_mode", nase_mode.pass_ase, ...
"amplification_db", 33);
outputSignal = amp.process(inputSignal);
expectedPowerW = 10^(33/10 - 3);
expectedScale = sqrt(expectedPowerW / mean(abs(inputSignal.signal).^2));
testCase.verifyClass(outputSignal, 'Opticalsignal');
testCase.verifyEqual(outputSignal.signal, expectedScale * inputSignal.signal, "AbsTol", 1e-12);
testCase.verifyEqual(outputSignal.power("unit", power_notation.W), expectedPowerW, "AbsTol", 1e-12);
testCase.verifyEqual(outputSignal.fs, inputSignal.fs);
testCase.verifyEqual(outputSignal.lambda, inputSignal.lambda);
end
end
end
function sig = makeOpticalSignal(values, fs, lambda, nase, polrot)
sig = Opticalsignal(values, ...
"fs", fs, ...
"logbook", Signal(values, "fs", fs).logbook, ...
"lambda", lambda, ...
"nase", nase, ...
"polrot", polrot);
end