package org.signalml.domain.signal.filter.export;
import org.signalml.domain.montage.filter.SampleFilterDefinition;
import org.signalml.domain.signal.MultichannelSampleProcessor;
import org.signalml.domain.signal.filter.SinglechannelSampleFilterEngine;
import org.signalml.domain.signal.samplesource.MultichannelSampleSource;
import org.signalml.domain.signal.samplesource.SampleSourceEngine;
import org.signalml.math.iirdesigner.BadFilterParametersException;
/**
* A sample source which is able to filter a multichannel sample source with a single
* filter.
*
* @author Piotr Szachewicz
*/
public abstract class AbstractMultichannelSingleFilterForExport extends MultichannelSampleProcessor {
/**
* Engines for filtering each channel of the sample source.
*/
protected SampleSourceEngine[] filterEngines;
/**
* The filter that should be used to filter the data.
*/
protected SampleFilterDefinition definition;
/**
* Constructor.
* @param source the sample source to be filtered.
* @param definition the definition of the filter to be used.
* @param filterExclusionArray determines which channels should not be filtered.
* @throws BadFilterParametersException
*/
public AbstractMultichannelSingleFilterForExport(MultichannelSampleSource source, SampleFilterDefinition definition, boolean[] filterExclusionArray) throws BadFilterParametersException {
super(source);
this.definition = definition;
}
protected void createEngines(boolean[] filterExclusionArray) throws BadFilterParametersException {
filterEngines = new SinglechannelSampleFilterEngine[this.source.getChannelCount()];
for (int channelNumber = 0; channelNumber < source.getChannelCount(); channelNumber++) {
if (!filterExclusionArray[channelNumber]) {
createEngine(channelNumber, filterExclusionArray);
}
}
}
protected abstract void createEngine(int channelNumber, boolean[] filterExclusionArray) throws BadFilterParametersException;
@Override
public void getSamples(int channel, double[] target, int signalOffset, int count, int arrayOffset) {
SampleSourceEngine engine = filterEngines[channel];
if (engine == null)
source.getSamples(channel, target, signalOffset, count, arrayOffset);
else
engine.getSamples(target, signalOffset, count, arrayOffset);
}
@Override
public int getSampleCount(int channel) {
SampleSourceEngine engine = filterEngines[channel];
if (engine == null)
return source.getSampleCount(channel);
else
return engine.getSampleCount();
}
}