package org.signalml.plugin.newstager.logic.artifact;
import java.util.Arrays;
import java.util.Map;
import org.signalml.plugin.domain.montage.PluginChannel;
import org.signalml.plugin.domain.montage.PluginChannelAccessHelper;
import org.signalml.plugin.exception.PluginAlgorithmDataException;
import org.signalml.plugin.newstager.data.NewStagerConstants;
import org.signalml.plugin.newstager.exception.NewStagerPluginException;
import org.signalml.plugin.newstager.logic.helper.NewStagerFilterHelper;
public abstract class NewStagerArtifactAnalysisAlgorithmBase {
protected static final double butterEMGNum[] = { 0.787775776356201d,
-3.938878881781003d, 7.877757763562006d, -7.877757763562006d,
3.938878881781003d, -0.787775776356201d
};
protected static final double butterEMGDen[] = { 1.000000000000000d,
-4.523574464001561d, 8.205821335099809d, -7.460219756968050d,
3.398618613518345d, -0.620590673810655d
};
protected double[] getChannelData(Map<String, Integer> channelMap,
PluginChannel channel, double signal[][]) throws NewStagerPluginException {
try {
return PluginChannelAccessHelper.GetChannelSignal(channelMap, channel, signal);
} catch (PluginAlgorithmDataException e) {
throw new NewStagerPluginException(e);
}
}
protected double[] computeItermediateMeanFiltered(double channelSignal[],
double filterNum[], double filterDen[], NewStagerConstants constants) {
double filteredSignal[] = NewStagerFilterHelper.LowPassFilter(
channelSignal, filterNum, filterDen);
return this.computeItermediateMean(filteredSignal, constants);
}
protected double[] computeItermediateMean(double channelSignal[],
NewStagerConstants constants)
{
int length = constants.blockLengthInSecondsINT;
int frequency = (int) constants.frequency;
int lengthNN = (int) Math.round(0.8d * frequency);
double mean[] = new double[length];
assert(channelSignal.length == length * frequency);
if (lengthNN <= 0) {
return null;
}
for (int i = 0; i < channelSignal.length; ++i) {
channelSignal[i] = channelSignal[i] * channelSignal[i];
}
for (int i = 0; i < length; ++i) {
int start = i * frequency;
double v = 0d;
Arrays.sort(channelSignal, start, start + frequency);
for (int j = 0; j < lengthNN; ++j) {
v += channelSignal[start + j];
}
mean[i] = Math.sqrt(v / lengthNN);
}
return mean;
}
}