add smoothing to raw mode too and fix mistakes

This commit is contained in:
Ahmet Inan 2024-04-20 18:08:55 +02:00
parent 6584934516
commit 2d6a4d7aca
5 changed files with 12 additions and 4 deletions

View file

@ -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;

View file

@ -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;

View file

@ -7,8 +7,10 @@ Copyright 2024 Ahmet Inan <xdsopl@gmail.com>
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]);

View file

@ -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;

View file

@ -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;