classdef Optical_Multiplex_test < IMDDTestCase methods (Test, TestTags = {'unit', 'fast', 'optical', 'mux'}) function processCombinesChannelsAndPreservesMetadata(testCase) fs = 32e9; lambdaCenter = 1550; lambdaA = 1550e-9; lambdaB = 1550e-9; sigA = makeOpticalSignal( ... [1 2; 1 2; 1 2], ... fs, ... lambdaA, ... 0.10); sigB = makeOpticalSignal( ... [3 4; 3 4; 3 4], ... fs, ... lambdaB, ... 0.90); mux = Optical_Multiplex( ... "fs_in", fs, ... "fs_out", fs, ... "lambda_center", lambdaCenter, ... "delta_f", 0, ... "random_key", 0, ... "attenuation", 0, ... "filtype", 3); out = mux.process({sigA, sigB}); expected = combineSingleChannelMuxOutputs({sigA, sigB}, mux); testCase.verifyClass(out, 'Opticalsignal'); testCase.verifyEqual(size(out.signal), [3 2]); testCase.verifyEqual(out.signal, expected, 'AbsTol', 1e-12); testCase.verifyEqual(out.fs, fs); testCase.verifyEqual(out.lambda, [lambdaA, lambdaB], 'AbsTol', 1e-9); testCase.verifyEqual(out.polrot, [0.10, 0.90], 'AbsTol', 1e-12); testCase.verifyEqual(height(out.logbook), 2); testCase.verifyEqual(string(out.logbook.Description(end)), "Opt. Mux. "); end function processSupportsMoreThanOneInputChannel(testCase) fs = 16e9; lambdaCenter = 1310; sig1 = makeOpticalSignal(ones(4, 2), fs, lambdaCenter * 1e-9, 0.0); sig2 = makeOpticalSignal(2 * ones(4, 2), fs, lambdaCenter * 1e-9, 0.5); sig3 = makeOpticalSignal(3 * ones(4, 2), fs, lambdaCenter * 1e-9, 1.0); mux = Optical_Multiplex( ... "fs_in", fs, ... "fs_out", fs, ... "lambda_center", lambdaCenter, ... "delta_f", 0, ... "random_key", 0, ... "attenuation", 0, ... "filtype", 3); out = mux.process({sig1, sig2, sig3}); expected = combineSingleChannelMuxOutputs({sig1, sig2, sig3}, mux); testCase.verifySize(out.signal, [4, 2]); testCase.verifyEqual(out.signal, expected, 'AbsTol', 1e-12); testCase.verifyEqual(numel(out.lambda), 3); testCase.verifyEqual(numel(out.polrot), 3); end end end function sig = makeOpticalSignal(signal, fs, lambda, polrot) base = Signal(signal, "fs", fs); sig = Opticalsignal( ... signal, ... "fs", fs, ... "logbook", base.logbook, ... "lambda", lambda, ... "nase", 0, ... "polrot", polrot); end function expected = combineSingleChannelMuxOutputs(signals, muxPrototype) expected = []; for idx = 1:numel(signals) mux = Optical_Multiplex( ... "fs_in", muxPrototype.fs_in, ... "fs_out", muxPrototype.fs_out, ... "lambda_center", muxPrototype.lambda_center, ... "delta_f", muxPrototype.delta_f, ... "random_key", muxPrototype.random_key, ... "attenuation", muxPrototype.attenuation, ... "filtype", muxPrototype.filtype); singleOut = mux.process({signals{idx}}); if isempty(expected) expected = zeros(size(singleOut.signal)); end expected = expected + singleOut.signal; end end