use a better approximation

This commit is contained in:
Ahmet Inan 2024-04-24 11:43:25 +02:00
parent c0cfc62636
commit a9fdf1eeff
6 changed files with 14 additions and 5 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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