package org.signalml.plugin.newstager.logic.artifact;
import java.util.Arrays;
import org.signalml.plugin.domain.montage.PluginChannel;
import org.signalml.plugin.newstager.data.NewStagerArtifactAlgorithmData;
import org.signalml.plugin.newstager.exception.NewStagerPluginException;
public class NewStagerArtifactToneEMGAlgorithm extends
NewStagerArtifactAnalysisAlgorithmBase {
private final double percents[] = { 10.0d, 90.0d };
private NewStagerArtifactAlgorithmData data;
public NewStagerArtifactToneEMGAlgorithm(NewStagerArtifactAlgorithmData data) {
this.data = data;
}
public double run(double signal[][]) {
double channelSignal[];
try {
channelSignal = this.getChannelData(this.data.channels,
PluginChannel.EMG, signal);
} catch (NewStagerPluginException e) {
return 0.0d;
}
double mean[] = this.computeItermediateMeanFiltered(channelSignal,
NewStagerArtifactAnalysisAlgorithmBase.butterEMGNum,
NewStagerArtifactAnalysisAlgorithmBase.butterEMGDen,
this.data.constants);
if (mean == null) {
return 0.0d;
}
Arrays.sort(mean);
double percentiles[] = this.percentile(mean, this.percents);
double lowP = percentiles[0];
double highP = percentiles[1];
double sum = 0.0d;
int count = 0;
for (int i = 0; i < mean.length; ++i) {
double value = mean[i];
if (value >= lowP && value <= highP) {
sum += value;
++count;
}
}
if (count <= 0) {
return 0.0d;
}
return sum / count;
}
public double[] percentile(double source[], double percentiles[]) {
double result[] = new double[percentiles.length];
double percents[] = new double[source.length];
if (source.length == 0) {
return result;
}
for (int i = 0; i < source.length; ++i) {
percents[i] = 100.0d / source.length * ((double) (i + 1) - 0.5d);
}
for (int p = 0; p < percentiles.length; ++p) {
int k = Arrays.binarySearch(percents, percentiles[p]);
if (k < 0) {
k = -k - 1;
}
k = Math.max(k, 1);
result[p] = source[k - 1]
+ ((k < source.length) ? (source.length
* (percentiles[p] - percents[k - 1]) / 100.d * (source[k] - source[k - 1]))
: 0);
}
return result;
}
public static void main(String[] args) {
NewStagerArtifactToneEMGAlgorithm a = new NewStagerArtifactToneEMGAlgorithm(
null);
double[] re = a.percentile(new double[] { 15, 20, 35, 40, 50 },
new double[] { 10, 30, 90 });
for (int i = 0; i < re.length; i++) {
System.out.println(re[i]);
}
}
}