classdef FFE_test < IMDDTestCase methods (Test, TestTags = {'unit', 'fast', 'dsp', 'ffe'}) function constructorStoresDefaultsAndInitialState(testCase) ffe = FFE(); testCase.verifyEqual(ffe.sps, 2); testCase.verifyEqual(ffe.order, 15); testCase.verifyEqual(ffe.len_tr, 4096); testCase.verifyEqual(ffe.mu_tr, 0); testCase.verifyEqual(ffe.epochs_tr, 5); testCase.verifyEqual(ffe.adaption_technique, adaption_method.lms); testCase.verifyEqual(ffe.dd_mode, 1); testCase.verifyEqual(ffe.mu_dd, 1e-5); testCase.verifyEqual(ffe.epochs_dd, 5); testCase.verifyFalse(logical(ffe.optimize_dc_params)); testCase.verifyEqual(ffe.dc_optimization_delay_weight, 1e-3); testCase.verifyFalse(ffe.decide); testCase.verifyEqual(ffe.e, zeros(ffe.order, 1)); testCase.verifyEqual(ffe.error, 0); end function noUpdateModeKeepsWeightsAtZeroAndPreservesSamplingRate(testCase) x = makeSignal([-1; 1; -1; 1], 32e9); d = makeSignal([-1; 1; -1; 1], 8e9); ffe = FFE( ... "sps", 1, ... "order", 1, ... "len_tr", length(x), ... "mu_tr", 0, ... "epochs_tr", 1, ... "mu_dd", 0, ... "epochs_dd", 1, ... "dd_mode", 0, ... "decide", false, ... "adaption_technique", adaption_method.lms); [y, noi] = ffe.process(x, d); testCase.verifyEqual(ffe.e, 0); testCase.verifyEqual(ffe.e_tr, 0); testCase.verifyEqual(y.signal, zeros(size(x.signal)), "AbsTol", 1e-12); testCase.verifyEqual(y.fs, d.fs); testCase.verifyEqual(noi.signal, -d.signal, "AbsTol", 1e-12); testCase.verifyEqual(length(y.signal), length(x.signal)); end function trainingModeLearnsFromTinySyntheticChannel(testCase) x = makeSignal([1; -1; 1; -1], 16e9); d = makeSignal([1; -1; 1; -1], 4e9); ffe = FFE( ... "sps", 1, ... "order", 1, ... "len_tr", length(x), ... "mu_tr", 0.5, ... "epochs_tr", 1, ... "mu_dd", 0, ... "epochs_dd", 1, ... "dd_mode", 0, ... "decide", false, ... "adaption_technique", adaption_method.lms); [y, noi] = ffe.process(x, d); testCase.verifyEqual(y.fs, d.fs); testCase.verifyClass(y, 'Informationsignal'); testCase.verifyClass(noi, 'Informationsignal'); testCase.verifyNotEqual(ffe.e, 0); testCase.verifyNotEqual(ffe.e_tr, 0); testCase.verifyNotEqual(y.signal, zeros(size(x.signal))); testCase.verifyEqual(length(y.signal), length(x.signal)); end end end function sig = makeSignal(values, fs) base = Signal(values); sig = Informationsignal(values, "fs", fs, "logbook", base.logbook); end