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

View File

@@ -1,10 +1,71 @@
classdef Filter_test < IMDDTestCase
% Auto-generated placeholder for Filter.
% Target: C:/Users/Silas/Documents/MATLAB/imdd_simulation/Classes/02_etc/Filter.m
methods (Test, TestTags = {'unit', 'fast', 'filter', 'etc'})
function constructorBuildsFilterWhenSamplingRateAndLengthAreKnown(testCase)
flt = Filter( ...
"active", true, ...
"filterType", filtertypes.butterworth, ...
"f_cutoff", 3.5, ...
"fs", 8, ...
"signal_length", 8, ...
"filtdegree", 3, ...
"lowpass", 1);
methods (Test, TestTags = {'placeholder', 'todo'})
function testNotImplemented(testCase)
testCase.assumeFail("Tests for Filter are not implemented yet.");
testCase.verifyEqual(flt.active, true);
testCase.verifyEqual(flt.filterType, filtertypes.butterworth);
testCase.verifyEqual(flt.f_cutoff, 3.5);
testCase.verifyEqual(flt.fs, 8);
testCase.verifyEqual(flt.signal_length, 8);
testCase.verifyNotEmpty(flt.H);
testCase.verifyNotEmpty(flt.w);
testCase.verifyEqual(numel(flt.H), 8);
testCase.verifyEqual(numel(flt.w), 8);
end
function inactiveFilterIsExactPassThrough(testCase)
flt = Filter( ...
"active", false, ...
"filterType", filtertypes.butterworth, ...
"f_cutoff", 3.5, ...
"fs", 8, ...
"signal_length", 8, ...
"filtdegree", 3);
sig = Signal([1; 2; 3], "fs", 8);
numIn = [1; -2; 3];
sigOut = flt.process(sig);
numOut = flt.process(numIn);
testCase.verifyClass(sigOut, "Signal");
testCase.verifyEqual(sigOut.signal, sig.signal);
testCase.verifyEqual(sigOut.fs, sig.fs);
testCase.verifyEqual(height(sigOut.logbook), height(sig.logbook));
testCase.verifyEqual(numOut, numIn);
end
function activeButterworthFilterPreservesConstantSignals(testCase)
flt = Filter( ...
"active", true, ...
"filterType", filtertypes.butterworth, ...
"f_cutoff", 3.5, ...
"fs", 8, ...
"signal_length", 8, ...
"filtdegree", 3, ...
"lowpass", 1);
sig = Signal(ones(8, 1), "fs", 8);
numIn = ones(8, 1);
sigOut = flt.process(sig);
numOut = flt.process_(numIn);
testCase.verifyEqual(size(sigOut.signal), size(sig.signal));
testCase.verifyEqual(sigOut.signal, ones(8, 1), "AbsTol", 1e-12);
testCase.verifyEqual(sigOut.fs, sig.fs);
testCase.verifyEqual(height(sigOut.logbook), 1);
testCase.verifyEqual(size(numOut), size(numIn));
testCase.verifyEqual(numOut, ones(8, 1), "AbsTol", 1e-12);
end
end
end