From a9fdf1eefff0caa62f42dccf92ee441ee824e804 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Wed, 24 Apr 2024 11:43:25 +0200 Subject: [PATCH] use a better approximation --- .../java/xdsopl/robot36/ExponentialMovingAverage.java | 9 +++++++++ app/src/main/java/xdsopl/robot36/PaulDon.java | 2 +- app/src/main/java/xdsopl/robot36/RGBDecoder.java | 2 +- app/src/main/java/xdsopl/robot36/RawDecoder.java | 2 +- app/src/main/java/xdsopl/robot36/Robot_36_Color.java | 2 +- app/src/main/java/xdsopl/robot36/Robot_72_Color.java | 2 +- 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/xdsopl/robot36/ExponentialMovingAverage.java b/app/src/main/java/xdsopl/robot36/ExponentialMovingAverage.java index a1c7f88..472f2db 100644 --- a/app/src/main/java/xdsopl/robot36/ExponentialMovingAverage.java +++ b/app/src/main/java/xdsopl/robot36/ExponentialMovingAverage.java @@ -26,6 +26,15 @@ public class ExponentialMovingAverage { alpha((float) Math.pow(alpha, 1.0 / order)); } + public void cutoff(float freq, float rate, int order) { + double x = Math.cos(2 * Math.PI * freq / rate); + alpha((float) (x-1+Math.sqrt(x*(x-4)+3)), order); + } + + public void cutoff(float freq, float rate) { + cutoff(freq, rate, 1); + } + 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 a2dc3f3..8443f69 100644 --- a/app/src/main/java/xdsopl/robot36/PaulDon.java +++ b/app/src/main/java/xdsopl/robot36/PaulDon.java @@ -58,7 +58,7 @@ 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.alpha(evenBuffer.length / (float) channelSamples, 2); + lowPassFilter.cutoff(evenBuffer.length, 2 * channelSamples, 2); lowPassFilter.reset(); for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); diff --git a/app/src/main/java/xdsopl/robot36/RGBDecoder.java b/app/src/main/java/xdsopl/robot36/RGBDecoder.java index 2e80aa3..5350c47 100644 --- a/app/src/main/java/xdsopl/robot36/RGBDecoder.java +++ b/app/src/main/java/xdsopl/robot36/RGBDecoder.java @@ -51,7 +51,7 @@ 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.alpha(evenBuffer.length / (float) greenSamples, 2); + lowPassFilter.cutoff(evenBuffer.length, 2 * greenSamples, 2); lowPassFilter.reset(); for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); diff --git a/app/src/main/java/xdsopl/robot36/RawDecoder.java b/app/src/main/java/xdsopl/robot36/RawDecoder.java index 400f849..94d940c 100644 --- a/app/src/main/java/xdsopl/robot36/RawDecoder.java +++ b/app/src/main/java/xdsopl/robot36/RawDecoder.java @@ -31,7 +31,7 @@ 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.alpha(evenBuffer.length / (float) scanLineSamples, 2); + lowPassFilter.cutoff(evenBuffer.length, 2 * scanLineSamples, 2); lowPassFilter.reset(); for (int i = prevPulseIndex; i < prevPulseIndex + scanLineSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[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 9ead77f..b5e7bcc 100644 --- a/app/src/main/java/xdsopl/robot36/Robot_36_Color.java +++ b/app/src/main/java/xdsopl/robot36/Robot_36_Color.java @@ -67,7 +67,7 @@ public class Robot_36_Color implements Mode { separator += scanLineBuffer[prevPulseIndex + separatorBeginSamples + i]; separator /= separatorSamples; boolean even = separator < 0; - lowPassFilter.alpha(evenBuffer.length / (float) luminanceSamples, 2); + lowPassFilter.cutoff(evenBuffer.length, 2 * luminanceSamples, 2); lowPassFilter.reset(); for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[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 68f47ab..29cc5d6 100644 --- a/app/src/main/java/xdsopl/robot36/Robot_72_Color.java +++ b/app/src/main/java/xdsopl/robot36/Robot_72_Color.java @@ -61,7 +61,7 @@ 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.alpha(evenBuffer.length / (float) luminanceSamples, 2); + lowPassFilter.cutoff(evenBuffer.length, 2 * luminanceSamples, 2); lowPassFilter.reset(); for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]);