diff --git a/app/src/main/java/xdsopl/robot36/ExponentialMovingAverage.java b/app/src/main/java/xdsopl/robot36/ExponentialMovingAverage.java index c4ba06c..a1c7f88 100644 --- a/app/src/main/java/xdsopl/robot36/ExponentialMovingAverage.java +++ b/app/src/main/java/xdsopl/robot36/ExponentialMovingAverage.java @@ -18,8 +18,15 @@ public class ExponentialMovingAverage { return prev = prev * (1 - alpha) + alpha * input; } - public void reset(float alpha) { + public void alpha(float alpha) { this.alpha = alpha; + } + + public void alpha(float alpha, int order) { + alpha((float) Math.pow(alpha, 1.0 / order)); + } + + public void reset() { prev = 0; } } diff --git a/app/src/main/java/xdsopl/robot36/PaulDon.java b/app/src/main/java/xdsopl/robot36/PaulDon.java index 5234498..a2dc3f3 100644 --- a/app/src/main/java/xdsopl/robot36/PaulDon.java +++ b/app/src/main/java/xdsopl/robot36/PaulDon.java @@ -58,10 +58,11 @@ public class PaulDon implements Mode { public int decodeScanLine(int[] evenBuffer, int[] oddBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples, float frequencyOffset) { if (prevPulseIndex + beginSamples < 0 || prevPulseIndex + endSamples > scanLineBuffer.length) return 0; - lowPassFilter.reset(evenBuffer.length / (float) channelSamples); + lowPassFilter.alpha(evenBuffer.length / (float) channelSamples, 2); + lowPassFilter.reset(); for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); - lowPassFilter.reset(evenBuffer.length / (float) channelSamples); + lowPassFilter.reset(); for (int i = prevPulseIndex + endSamples - 1; i >= prevPulseIndex + beginSamples; --i) scanLineBuffer[i] = freqToLevel(lowPassFilter.avg(scanLineBuffer[i]), frequencyOffset); for (int i = 0; i < evenBuffer.length; ++i) { diff --git a/app/src/main/java/xdsopl/robot36/RGBDecoder.java b/app/src/main/java/xdsopl/robot36/RGBDecoder.java index 29fac62..2e80aa3 100644 --- a/app/src/main/java/xdsopl/robot36/RGBDecoder.java +++ b/app/src/main/java/xdsopl/robot36/RGBDecoder.java @@ -51,10 +51,11 @@ public class RGBDecoder implements Mode { public int decodeScanLine(int[] evenBuffer, int[] oddBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples, float frequencyOffset) { if (prevPulseIndex + beginSamples < 0 || prevPulseIndex + endSamples > scanLineBuffer.length) return 0; - lowPassFilter.reset(evenBuffer.length / (float) greenSamples); + lowPassFilter.alpha(evenBuffer.length / (float) greenSamples, 2); + lowPassFilter.reset(); for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); - lowPassFilter.reset(evenBuffer.length / (float) greenSamples); + lowPassFilter.reset(); for (int i = prevPulseIndex + endSamples - 1; i >= prevPulseIndex + beginSamples; --i) scanLineBuffer[i] = freqToLevel(lowPassFilter.avg(scanLineBuffer[i]), frequencyOffset); for (int i = 0; i < evenBuffer.length; ++i) { diff --git a/app/src/main/java/xdsopl/robot36/RawDecoder.java b/app/src/main/java/xdsopl/robot36/RawDecoder.java index df5fb5f..400f849 100644 --- a/app/src/main/java/xdsopl/robot36/RawDecoder.java +++ b/app/src/main/java/xdsopl/robot36/RawDecoder.java @@ -31,10 +31,11 @@ public class RawDecoder implements Mode { public int decodeScanLine(int[] evenBuffer, int[] oddBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples, float frequencyOffset) { if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples > scanLineBuffer.length) return 0; - lowPassFilter.reset(evenBuffer.length / (float) scanLineSamples); + lowPassFilter.alpha(evenBuffer.length / (float) scanLineSamples, 2); + lowPassFilter.reset(); for (int i = prevPulseIndex; i < prevPulseIndex + scanLineSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); - lowPassFilter.reset(evenBuffer.length / (float) scanLineSamples); + lowPassFilter.reset(); for (int i = prevPulseIndex + scanLineSamples - 1; i >= prevPulseIndex; --i) scanLineBuffer[i] = freqToLevel(lowPassFilter.avg(scanLineBuffer[i]), frequencyOffset); for (int i = 0; i < evenBuffer.length; ++i) { diff --git a/app/src/main/java/xdsopl/robot36/Robot_36_Color.java b/app/src/main/java/xdsopl/robot36/Robot_36_Color.java index 507a97f..9ead77f 100644 --- a/app/src/main/java/xdsopl/robot36/Robot_36_Color.java +++ b/app/src/main/java/xdsopl/robot36/Robot_36_Color.java @@ -67,10 +67,11 @@ public class Robot_36_Color implements Mode { separator += scanLineBuffer[prevPulseIndex + separatorBeginSamples + i]; separator /= separatorSamples; boolean even = separator < 0; - lowPassFilter.reset(evenBuffer.length / (float) luminanceSamples); + lowPassFilter.alpha(evenBuffer.length / (float) luminanceSamples, 2); + lowPassFilter.reset(); for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); - lowPassFilter.reset(evenBuffer.length / (float) luminanceSamples); + lowPassFilter.reset(); for (int i = prevPulseIndex + endSamples - 1; i >= prevPulseIndex + beginSamples; --i) scanLineBuffer[i] = freqToLevel(lowPassFilter.avg(scanLineBuffer[i]), frequencyOffset); for (int i = 0; i < evenBuffer.length; ++i) { diff --git a/app/src/main/java/xdsopl/robot36/Robot_72_Color.java b/app/src/main/java/xdsopl/robot36/Robot_72_Color.java index adf824b..68f47ab 100644 --- a/app/src/main/java/xdsopl/robot36/Robot_72_Color.java +++ b/app/src/main/java/xdsopl/robot36/Robot_72_Color.java @@ -61,10 +61,11 @@ public class Robot_72_Color implements Mode { public int decodeScanLine(int[] evenBuffer, int[] oddBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples, float frequencyOffset) { if (prevPulseIndex + beginSamples < 0 || prevPulseIndex + endSamples > scanLineBuffer.length) return 0; - lowPassFilter.reset(evenBuffer.length / (float) luminanceSamples); + lowPassFilter.alpha(evenBuffer.length / (float) luminanceSamples, 2); + lowPassFilter.reset(); for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); - lowPassFilter.reset(evenBuffer.length / (float) luminanceSamples); + lowPassFilter.reset(); for (int i = prevPulseIndex + endSamples - 1; i >= prevPulseIndex + beginSamples; --i) scanLineBuffer[i] = freqToLevel(lowPassFilter.avg(scanLineBuffer[i]), frequencyOffset); for (int i = 0; i < evenBuffer.length; ++i) {