classdef Signalgenerator_test < IMDDTestCase methods (Test, TestTags = {'unit', 'fast', 'transmit', 'signalgenerator'}) function constructorStoresDefaultConfiguration(testCase) gen = Signalgenerator(); testCase.verifyEqual(gen.form, signalform.sine); testCase.verifyEqual(gen.length, 1024); testCase.verifyEqual(gen.fs, 1000); testCase.verifyEqual(gen.fsig, 50); testCase.verifyEqual(gen.dimension, 1); testCase.verifyEmpty(gen.M); testCase.verifyEqual(gen.order, 7); testCase.verifyEqual(gen.randkey, 0); testCase.verifyEqual(gen.skip, 0); testCase.verifyFalse(gen.bruijn); end function buildSignalProducesExpectedSineWave(testCase) gen = Signalgenerator( ... "form", signalform.sine, ... "length", 4, ... "fs", 4, ... "fsig", 1); signal = gen.build_signal(); expected = [0 1 0 -1]; testCase.verifySize(signal, [1 4]); testCase.verifyEqual(signal, expected, "AbsTol", 1e-12); end function processWrapsGeneratedSignalInInformationsignal(testCase) gen = Signalgenerator( ... "form", signalform.sine, ... "length", 4, ... "fs", 4, ... "fsig", 1); out = gen.process(); testCase.verifyClass(out, 'Informationsignal'); testCase.verifySize(out.signal, [1 4]); testCase.verifyEqual(out.fs, 4); testCase.verifyEqual(out.signal, [0 1 0 -1], "AbsTol", 1e-12); testCase.verifyEqual(height(out.logbook), 1); end function randomDataIsDeterministicAndColumnShaped(testCase) gen = Signalgenerator( ... "form", signalform.random, ... "length", 8, ... "dimension", 2, ... "randkey", 3); signal = gen.build_signal(); expected = [ ... 1 0; ... 1 0; ... 0 0; ... 1 0; ... 1 1; ... 1 0; ... 0 1; ... 0 1]; testCase.verifySize(signal, [8 2]); testCase.verifyEqual(signal, expected); end function prmsDataUsesMoveItStyleShape(testCase) gen = Signalgenerator( ... "form", signalform.prms, ... "length", 8, ... "dimension", 2, ... "order", 6); signal = gen.build_signal(); expected = [ ... 1 0; ... 1 0; ... 0 1; ... 1 0; ... 0 1; ... 0 0; ... 1 0; ... 0 0]; testCase.verifySize(signal, [8 2]); testCase.verifyEqual(signal, expected); end function prmsLengthDefaultsToPamSourceStyleLength(testCase) pam4Gen = Signalgenerator( ... "form", signalform.prms, ... "dimension", 2, ... "order", 7); pam6Gen = Signalgenerator( ... "form", signalform.prms, ... "dimension", 5, ... "order", 7); testCase.verifyEqual(pam4Gen.length, 2^(7 - 1)); testCase.verifyEqual(pam6Gen.length, 2^(7 - 2)); end function pamFormatSelectsMapperReadyDimension(testCase) pam4Gen = Signalgenerator( ... "form", signalform.prms, ... "M", 4, ... "order", 7); pam6Gen = Signalgenerator( ... "form", signalform.prms, ... "M", 6, ... "order", 7); testCase.verifyEqual(pam4Gen.dimension, 2); testCase.verifyEqual(pam4Gen.length, 2^(7 - 1)); testCase.verifyEqual(pam6Gen.dimension, 5); testCase.verifyEqual(pam6Gen.length, 2^(7 - 2)); end function pam6FormatReturnsMapperReadyVector(testCase) gen = Signalgenerator( ... "form", signalform.prms, ... "M", 6, ... "order", 7); signal = gen.build_signal(); testCase.verifySize(signal, [5 * 2^(7 - 2), 1]); testCase.verifyEqual(mod(numel(signal), 5), 0); end function processWrapsPrmsSignalInInformationsignal(testCase) gen = Signalgenerator( ... "form", signalform.prms, ... "length", 8, ... "dimension", 2, ... "order", 6, ... "fs", 42); out = gen.process(); testCase.verifyClass(out, 'Informationsignal'); testCase.verifySize(out.signal, [8 2]); testCase.verifyEqual(out.fs, 42); testCase.verifyEqual(height(out.logbook), 1); end end end