Files
imdd_silas/Tests/02_optical/Fiber_test.m
2026-03-24 17:23:02 +01:00

88 lines
3.5 KiB
Matlab

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