Parallel Median Filter
//import everything
public class SecondMedianFilter extends RecursiveAction {
float[] numbers;
static int filter;
int window;
int length;
int lo;
int hi;
static final int SEQUENTIAL_CUTOFF = 500;
float[] outArray;
public SecondMedianFilter(float[] numbers, int filter, int lo, int hi) {
this.numbers = numbers;
this.filter = filter;
this.lo = lo;
this.hi = hi;
length = numbers.length;
window = (filter - 1) / 2;
}
public float[] getRes() {
return result;
}
protected void compute() {
result = new float[length];
if ((hi - lo) < SEQUENTIAL_CUTOFF) {
for (int a = lo; a < hi; a++) {
for (int i = 0; i < length; i++) {
if (i < window || i >= length - window) {
result[i] = numbers[i];
} else {
float[] subArray = Arrays.copyOfRange(numbers, i - window, i + window + 1);
Arrays.sort(subArray);
float median = subArray[(subArray.length / 2)];
result[i] = median;
}
}
}
} else {
SecondMedianFilter left = new SecondMedianFilter(filtered, filter, lo, (hi + lo) / 2);
SecondMedianFilter right = new SecondMedianFilter(filtered, filter, (hi + lo) / 2, hi);
left.fork();
right.compute();
left.join();
}
}
public static void main(String[] args) {
//reads in a file, processes each line into an array of floats that
// I call inArray, which gets filtered into outIntArray
float[] outIntArray = new float[inArray.length];
if (window < 3 || window > 21 || window % 2 == 0) {
System.out.println("Window size error.");
} else {
SecondMedianFilter smf = new SecondMedianFilter(inArray, window, 0, inArray.length);
smf.compute();
outIntArray = smf.getRes();
// loops through outIntArray and writes to file.
}//end main
}
}