88 lines
3.5 KiB
Matlab
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
|