mirror of
https://github.com/xdsopl/robot36.git
synced 2026-01-03 15:10:03 +01:00
use a better approximation
This commit is contained in:
parent
c0cfc62636
commit
a9fdf1eeff
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
Loading…
Reference in a new issue