classdef Optical_Demultiplex_test < IMDDTestCase methods (Test, TestTags = {'unit', 'fast', 'optical', 'demux'}) function processReturnsOneCellPerChannelAndPreservesMetadata(testCase) fs = 32e9; lambdaCenterNm = 1310; lambdaA = 1309e-9; lambdaB = 1311e-9; sigA = makeOpticalSignal( ... [1 2; 1 2; 1 2; 1 2], ... fs, ... lambdaA, ... 0.10); sigB = makeOpticalSignal( ... [3 4; 3 4; 3 4; 3 4], ... fs, ... lambdaB, ... 0.90); mux = Optical_Multiplex( ... "fs_in", fs, ... "fs_out", fs, ... "lambda_center", lambdaCenterNm, ... "delta_f", 0, ... "random_key", 0, ... "attenuation", 0, ... "filtype", 3, ... "B", 200e9); muxOut = mux.process({sigA, sigB}); demux = Optical_Demultiplex( ... "fs_in", muxOut.fs, ... "fs_out", muxOut.fs, ... "lambda_center", lambdaCenterNm, ... "attenuation", 0, ... "filtype", 3, ... "B", 200e9); out = demux.process(muxOut); testCase.verifyClass(out, 'cell'); testCase.verifyNumElements(out, 2); testCase.verifyClass(out{1}, 'Opticalsignal'); testCase.verifyClass(out{2}, 'Opticalsignal'); testCase.verifyEqual(size(out{1}.signal), size(muxOut.signal)); testCase.verifyEqual(size(out{2}.signal), size(muxOut.signal)); testCase.verifyEqual(out{1}.fs, fs); testCase.verifyEqual(out{2}.fs, fs); testCase.verifyEqual(out{1}.lambda, muxOut.lambda(1), 'AbsTol', 1e-12); testCase.verifyEqual(out{2}.lambda, muxOut.lambda(2), 'AbsTol', 1e-12); end function roundTripThroughMuxAndDemuxPreservesChannelMagnitudes(testCase) fs = 16e9; lambdaCenterNm = 1310; sigA = makeOpticalSignal(ones(8, 2), fs, 1309.5e-9, 0.0); mux = Optical_Multiplex( ... "fs_in", fs, ... "fs_out", fs, ... "lambda_center", lambdaCenterNm, ... "delta_f", 0, ... "random_key", 0, ... "attenuation", 0, ... "filtype", 3, ... "B", 200e9); muxOut = mux.process({sigA}); demux = Optical_Demultiplex( ... "fs_in", muxOut.fs, ... "fs_out", muxOut.fs, ... "lambda_center", lambdaCenterNm, ... "attenuation", 0, ... "filtype", 3, ... "B", 200e9); out = demux.process(muxOut); testCase.verifyNumElements(out, 1); testCase.verifyEqual(size(out{1}.signal), size(sigA.signal)); testCase.verifyEqual(out{1}.fs, fs); testCase.verifyEqual(out{1}.lambda, muxOut.lambda(1), 'AbsTol', 1e-12); testCase.verifyEqual(mean(abs(out{1}.signal), 'all'), mean(abs(sigA.signal), 'all'), 'AbsTol', 1e-6); 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