classdef Amplifier_test < IMDDTestCase 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); 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