package org.signalml.domain.signal.filter.iir.helper; import static org.junit.Assert.assertEquals; import static org.signalml.SignalMLAssert.assertArrayEquals; import org.junit.Test; import org.signalml.domain.montage.filter.TimeDomainSampleFilter; import org.signalml.domain.signal.filter.TestingSignals; import org.signalml.domain.signal.filter.iir.helper.GrowSignalSampleSource; import org.signalml.domain.signal.samplesource.ChannelSelectorSampleSource; import org.signalml.domain.signal.samplesource.DoubleArraySampleSource; import org.signalml.math.iirdesigner.ApproximationFunctionType; import org.signalml.math.iirdesigner.BadFilterParametersException; import org.signalml.math.iirdesigner.FilterCoefficients; import org.signalml.math.iirdesigner.FilterType; import org.signalml.math.iirdesigner.IIRDesigner; import org.signalml.math.iirdesigner.InitialStateCalculator; public class GrowSignalSampleSourceTest { @Test public void testGetSamples() { double[][] samples = new double[][] {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}}; DoubleArraySampleSource multichannelSampleSource = new DoubleArraySampleSource(samples, samples.length, samples[0].length); ChannelSelectorSampleSource channelSampleSource = new ChannelSelectorSampleSource(multichannelSampleSource, 0); FilterCoefficients filterCoefficients = new FilterCoefficients(new double[] {1.0, 0.3}, new double[] {1.0}); GrowSignalSampleSource growSignalSampleSource = new GrowSignalSampleSource(channelSampleSource, filterCoefficients); double[] expectedGrownSignal = new double[] { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; //whole signal double[] actualGrownSignal = new double[expectedGrownSignal.length]; assertEquals(expectedGrownSignal.length, growSignalSampleSource.getSampleCount()); growSignalSampleSource.getSamples(actualGrownSignal, 0, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //only left added int signalOffset = 1; int sampleCount = 3; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {-4, -3, -2}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //left + center signalOffset = 3; sampleCount = 6; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {-2, -1, 0, 1, 2, 3}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //left + center (small margin) signalOffset = 4; sampleCount = 6; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {-1, 0, 1, 2, 3, 4}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //only center signalOffset = 5; sampleCount = 6; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {0, 1, 2, 3, 4, 5}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //only center signalOffset = 6; sampleCount = 6; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {1, 2, 3, 4, 5, 6}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //only center signalOffset = 7; sampleCount = 6; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {2, 3, 4, 5, 6, 7}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //center + right signalOffset = 18; sampleCount = 4; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {13, 14, 15, 16}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //center + right signalOffset = 19; sampleCount = 7; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {14, 15, 16, 17, 18, 19, 20}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //only right signalOffset = 20; sampleCount = 5; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {15, 16, 17, 18, 19}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //only right signalOffset = 21; sampleCount = 5; actualGrownSignal = new double[sampleCount]; expectedGrownSignal = new double[] {16, 17, 18, 19, 20}; growSignalSampleSource.getSamples(actualGrownSignal, signalOffset, actualGrownSignal.length, 0); assertArrayEquals(expectedGrownSignal, actualGrownSignal, 1e-6); //compare initialSTateCalc & growSignalSampleSource /*InitialStateCalculator initialStateCalculator = new InitialStateCalculator(filterCoefficients); double[] iscSignal = initialStateCalculator.growSignal(samples[0]); actualGrownSignal = new double[growSignalSampleSource.getSampleCount()]; growSignalSampleSource.getSamples(actualGrownSignal, 0, actualGrownSignal.length, 0); assertArrayEquals(iscSignal, actualGrownSignal, 1e-6);*/ } @Test public void compareGrowing() throws BadFilterParametersException { double[][] samples = new double[1][]; samples[0] = TestingSignals.SHORT_SIGNAL; DoubleArraySampleSource multichannelSampleSource = new DoubleArraySampleSource(samples, samples.length, samples[0].length); ChannelSelectorSampleSource channelSampleSource = new ChannelSelectorSampleSource(multichannelSampleSource, 0); TimeDomainSampleFilter timeDomainFilter = new TimeDomainSampleFilter(FilterType.HIGHPASS, ApproximationFunctionType.BUTTERWORTH, new double[] {5.0, 0.0}, new double[] {1.5, 0.0}, 3.0, 10.00); timeDomainFilter.setSamplingFrequency(128.0); FilterCoefficients filterCoefficients = IIRDesigner.designDigitalFilter(timeDomainFilter); //grown GrowSignalSampleSource growSampleSource = new GrowSignalSampleSource(channelSampleSource, filterCoefficients); double[] grownSamples = new double[growSampleSource.getSampleCount()]; growSampleSource.getSamples(grownSamples, 0, grownSamples.length, 0); //initial state InitialStateCalculator initialStateCalculator = new InitialStateCalculator(filterCoefficients); double[] grownSamples2 = initialStateCalculator.growSignal(samples[0]); assertArrayEquals(grownSamples, grownSamples2, 1e-4); } }