From 2d6a4d7aca4fdfe864d165514f22c62490ed7be1 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Sat, 20 Apr 2024 18:08:55 +0200 Subject: [PATCH] add smoothing to raw mode too and fix mistakes --- 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 | 8 ++++++++ app/src/main/java/xdsopl/robot36/Robot_36_Color.java | 2 +- app/src/main/java/xdsopl/robot36/Robot_72_Color.java | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/xdsopl/robot36/PaulDon.java b/app/src/main/java/xdsopl/robot36/PaulDon.java index bc4cbf4..4112fd7 100644 --- a/app/src/main/java/xdsopl/robot36/PaulDon.java +++ b/app/src/main/java/xdsopl/robot36/PaulDon.java @@ -57,7 +57,7 @@ public class PaulDon implements Mode { for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); lowPassFilter.reset(evenBuffer.length / (float) channelSamples); - for (int i = prevPulseIndex + endSamples - 1; i >= scanLineSamples + beginSamples; --i) + for (int i = prevPulseIndex + endSamples - 1; i >= prevPulseIndex + beginSamples; --i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); for (int i = 0; i < evenBuffer.length; ++i) { int position = (i * channelSamples) / evenBuffer.length + prevPulseIndex; diff --git a/app/src/main/java/xdsopl/robot36/RGBDecoder.java b/app/src/main/java/xdsopl/robot36/RGBDecoder.java index 286863b..dbaf6c7 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 { for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); lowPassFilter.reset(evenBuffer.length / (float) greenSamples); - for (int i = prevPulseIndex + endSamples - 1; i >= scanLineSamples + beginSamples; --i) + for (int i = prevPulseIndex + endSamples - 1; i >= prevPulseIndex + beginSamples; --i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); for (int i = 0; i < evenBuffer.length; ++i) { int redPos = redBeginSamples + (i * redSamples) / evenBuffer.length + prevPulseIndex; diff --git a/app/src/main/java/xdsopl/robot36/RawDecoder.java b/app/src/main/java/xdsopl/robot36/RawDecoder.java index 3812cc4..262cdae 100644 --- a/app/src/main/java/xdsopl/robot36/RawDecoder.java +++ b/app/src/main/java/xdsopl/robot36/RawDecoder.java @@ -7,8 +7,10 @@ Copyright 2024 Ahmet Inan package xdsopl.robot36; public class RawDecoder implements Mode { + private final ExponentialMovingAverage lowPassFilter; RawDecoder() { + lowPassFilter = new ExponentialMovingAverage(); } @Override @@ -25,6 +27,12 @@ public class RawDecoder implements Mode { public int decodeScanLine(int[] evenBuffer, int[] oddBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples) { if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples > scanLineBuffer.length) return 0; + lowPassFilter.reset(evenBuffer.length / (float) scanLineSamples); + for (int i = prevPulseIndex; i < prevPulseIndex + scanLineSamples; ++i) + scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); + lowPassFilter.reset(evenBuffer.length / (float) scanLineSamples); + for (int i = prevPulseIndex + scanLineSamples - 1; i >= prevPulseIndex; --i) + scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); for (int i = 0; i < evenBuffer.length; ++i) { int position = (i * scanLineSamples) / evenBuffer.length + prevPulseIndex; evenBuffer[i] = ColorConverter.GRAY(scanLineBuffer[position]); 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 2cf0ac0..51eaf75 100644 --- a/app/src/main/java/xdsopl/robot36/Robot_36_Color.java +++ b/app/src/main/java/xdsopl/robot36/Robot_36_Color.java @@ -66,7 +66,7 @@ public class Robot_36_Color implements Mode { for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); lowPassFilter.reset(evenBuffer.length / (float) luminanceSamples); - for (int i = prevPulseIndex + endSamples - 1; i >= scanLineSamples + beginSamples; --i) + for (int i = prevPulseIndex + endSamples - 1; i >= prevPulseIndex + beginSamples; --i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); for (int i = 0; i < evenBuffer.length; ++i) { int luminancePos = luminanceBeginSamples + (i * luminanceSamples) / evenBuffer.length + prevPulseIndex; 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 fa2ed8e..364bec9 100644 --- a/app/src/main/java/xdsopl/robot36/Robot_72_Color.java +++ b/app/src/main/java/xdsopl/robot36/Robot_72_Color.java @@ -60,7 +60,7 @@ public class Robot_72_Color implements Mode { for (int i = prevPulseIndex + beginSamples; i < prevPulseIndex + endSamples; ++i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); lowPassFilter.reset(evenBuffer.length / (float) luminanceSamples); - for (int i = prevPulseIndex + endSamples - 1; i >= scanLineSamples + beginSamples; --i) + for (int i = prevPulseIndex + endSamples - 1; i >= prevPulseIndex + beginSamples; --i) scanLineBuffer[i] = lowPassFilter.avg(scanLineBuffer[i]); for (int i = 0; i < evenBuffer.length; ++i) { int yPos = yBeginSamples + (i * luminanceSamples) / evenBuffer.length + prevPulseIndex;