classdef Fiber_test < IMDDTestCase methods (Test, TestTags = {'unit', 'fast', 'optical', 'fiber'}) function zeroLengthPropagationLeavesSignalUnchanged(testCase) fiber = Fiber("fsimu", 64e9, "fiber_length", 0, "alpha", 0, "D", 0, ... "Dslope", 0, "lambda0", 1310, "gamma", 0); inputSig = makeOpticalsignal([1 + 1i; -2 + 0.5i; 0.25 - 0.75i], 64e9, 1310e-9); outputSig = fiber.process_(inputSig); testCase.verifyClass(outputSig, 'Opticalsignal'); testCase.verifyEqual(outputSig.signal, inputSig.signal, "AbsTol", 1e-12); testCase.verifyEqual(outputSig.lambda, inputSig.lambda); testCase.verifyEqual(outputSig.fs, inputSig.fs); end function attenuationOnlyMatchesAnalyticalFieldScaling(testCase) fs = 32e9; lambda = 1310e-9; fiberLengthKm = 2.5; alphaDbPerKm = 0.2; inputSignal = [1 + 2i; -0.5 + 0.25i; 0.75 - 1.25i; 2 - 1i]; fiber = Fiber("fsimu", fs, "fiber_length", fiberLengthKm, "alpha", alphaDbPerKm, ... "D", 0, "Dslope", 0, "lambda0", 1310, "gamma", 0); inputSig = makeOpticalsignal(inputSignal, fs, lambda); outputSig = fiber.process_(inputSig); alphaLin = alphaDbPerKm / 10 * log(10) / 1e3; expected = inputSignal .* exp(-alphaLin / 2 * fiber.fiber_length); testCase.verifyEqual(outputSig.signal, expected, "AbsTol", 1e-12); end function linearOnlyPropagationPreservesShapeAndEnergyWhenLossless(testCase) fs = 64e9; lambda = 1310e-9; inputSignal = [1 + 0.5i; -1i; 0.75; 2 - 0.25i]; fiber = Fiber("fsimu", fs, "fiber_length", 0.3, "alpha", 0, ... "D", 0, "Dslope", 0, "lambda0", 1310, "gamma", 0); inputSig = makeOpticalsignal(inputSignal, fs, lambda); outputSig = fiber.process_(inputSig); testCase.verifySize(outputSig.signal, size(inputSignal)); testCase.verifyEqual(outputSig.signal, inputSignal, "AbsTol", 1e-12); testCase.verifyEqual(norm(outputSig.signal), norm(inputSignal), "AbsTol", 1e-12); end function processAddsLogbookEntryAndReturnsOpticalsignal(testCase) fs = 32e9; lambda = 1310e-9; fiber = Fiber("fsimu", fs, "fiber_length", 0, "alpha", 0, "D", 0, ... "Dslope", 0, "lambda0", 1310, "gamma", 0); inputSig = makeOpticalsignal([1; -1; 2], fs, lambda); outputSig = fiber.process(inputSig); testCase.verifyClass(outputSig, 'Opticalsignal'); testCase.verifyEqual(outputSig.signal, inputSig.signal, "AbsTol", 1e-12); testCase.verifyEqual(height(outputSig.logbook), height(inputSig.logbook) + 1); testCase.verifyEqual(string(outputSig.logbook.Description(end)), "Fiber "); end end end function sig = makeOpticalsignal(values, fs, lambda) sig = Opticalsignal(values, ... "fs", fs, ... "logbook", emptyLogbook(), ... "lambda", lambda, ... "nase", 0, ... "polrot", 0); end function lb = emptyLogbook() SignalType = []; TimeStamp = []; Length = []; SignalPower = []; Nase = []; SignalCopy = []; ModifierName = []; ModifierCopy = {}; Description = []; lb = table(SignalType, TimeStamp, Length, SignalPower, Nase, SignalCopy, ModifierName, ModifierCopy, Description); end