Strengthen WDM and IM/DD optical tests
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user