adjust alpha for second order

This commit is contained in:
Ahmet Inan 2024-04-24 08:40:10 +02:00
parent 1f221aa79a
commit c0cfc62636
6 changed files with 23 additions and 11 deletions

View file

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

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {