From bbbb8c4fbe1e2707fa79531d5abdb44864097d1b Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Mon, 22 Apr 2024 18:04:50 +0200 Subject: [PATCH] removed scanline SMA and relaxed base band filter --- .../main/java/xdsopl/robot36/Demodulator.java | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/xdsopl/robot36/Demodulator.java b/app/src/main/java/xdsopl/robot36/Demodulator.java index 08865b6..463e17f 100644 --- a/app/src/main/java/xdsopl/robot36/Demodulator.java +++ b/app/src/main/java/xdsopl/robot36/Demodulator.java @@ -11,12 +11,10 @@ public class Demodulator { private final ComplexMovingAverage syncPulse5msFilter; private final ComplexMovingAverage syncPulse9msFilter; private final ComplexMovingAverage syncPulse20msFilter; - private final ComplexMovingAverage scanLineFilter; private final ComplexConvolution baseBandLowPass; private final FrequencyModulation scanLineDemod; private final SchmittTrigger syncPulseTrigger; private final Phasor syncPulseOscillator; - private final Phasor scanLineOscillator; private final Phasor baseBandOscillator; private final Delay syncPulse5msDelay; private final Delay syncPulse9msDelay; @@ -35,7 +33,6 @@ public class Demodulator { private Complex syncPulse5ms; private Complex syncPulse9ms; private Complex syncPulse20ms; - private Complex scanLine; public enum SyncPulseWidth { FiveMilliSeconds, @@ -54,9 +51,6 @@ public class Demodulator { float whiteFrequency = 2300; float scanLineBandwidth = whiteFrequency - blackFrequency; scanLineDemod = new FrequencyModulation(scanLineBandwidth, sampleRate); - float scanLineCutoff = scanLineBandwidth / 2; - int scanLineFilterSamples = (int) Math.round(0.443 * sampleRate / scanLineCutoff) | 1; - scanLineFilter = new ComplexMovingAverage(scanLineFilterSamples); double syncPulse5msSeconds = 0.0055; double syncPulse9msSeconds = 0.009; double syncPulse20msSeconds = 0.020; @@ -68,21 +62,19 @@ public class Demodulator { syncPulse5msFilter = new ComplexMovingAverage(syncPulse5msSamples); syncPulse9msFilter = new ComplexMovingAverage(syncPulse9msSamples); syncPulse20msFilter = new ComplexMovingAverage(syncPulse20msSamples); - float lowestFrequency = 1100; - float highestFrequency = 2300; + float lowestFrequency = 1000; + float highestFrequency = 2800; float cutoffFrequency = (highestFrequency - lowestFrequency) / 2; double baseBandLowPassSeconds = 0.002; int baseBandLowPassSamples = (int) Math.round(baseBandLowPassSeconds * sampleRate) | 1; baseBandLowPass = new ComplexConvolution(baseBandLowPassSamples); Kaiser kaiser = new Kaiser(); for (int i = 0; i < baseBandLowPass.length; ++i) - baseBandLowPass.taps[i] = (float) (kaiser.window(2.0, i, baseBandLowPass.length) * Filter.lowPass(cutoffFrequency, i, baseBandLowPass.length)); + baseBandLowPass.taps[i] = (float) (kaiser.window(2.0, i, baseBandLowPass.length) * Filter.lowPass(cutoffFrequency, sampleRate, i, baseBandLowPass.length)); float centerFrequency = (lowestFrequency + highestFrequency) / 2; baseBandOscillator = new Phasor(-centerFrequency, sampleRate); float syncPulseFrequency = 1200; syncPulseOscillator = new Phasor(-(syncPulseFrequency - centerFrequency), sampleRate); - float grayFrequency = (blackFrequency + whiteFrequency) / 2; - scanLineOscillator = new Phasor(-(grayFrequency - centerFrequency), sampleRate); int syncPulse5msDelaySamples = (powerWindowSamples - 1) / 2 - (syncPulse5msSamples - 1) / 2; int syncPulse9msDelaySamples = (powerWindowSamples - 1) / 2 - (syncPulse9msSamples - 1) / 2; int syncPulse20msDelaySamples = (powerWindowSamples - 1) / 2 - (syncPulse20msSamples - 1) / 2; @@ -95,7 +87,6 @@ public class Demodulator { syncPulse5ms = new Complex(); syncPulse9ms = new Complex(); syncPulse20ms = new Complex(); - scanLine = new Complex(); } public boolean process(float[] buffer) { @@ -106,12 +97,11 @@ public class Demodulator { syncPulse5ms = syncPulse5msFilter.avg(syncPulse5ms.set(syncPulse)); syncPulse9ms = syncPulse9msFilter.avg(syncPulse9ms.set(syncPulse)); syncPulse20ms = syncPulse20msFilter.avg(syncPulse20ms.set(syncPulse)); - scanLine = scanLineFilter.avg(scanLine.set(baseBand).mul(scanLineOscillator.rotate())); float averagePower = powerAvg.avg(baseBand.norm()); float syncPulse5msValue = syncPulse5msDelay.push(syncPulse5ms.norm()) / averagePower; float syncPulse9msValue = syncPulse9msDelay.push(syncPulse9ms.norm()) / averagePower; float syncPulse20msValue = syncPulse20msDelay.push(syncPulse20ms.norm()) / averagePower; - float scanLineValue = scanLineDemod.demod(scanLine); + float scanLineValue = scanLineDemod.demod(baseBand); float scanLineLevel = 0.5f * (scanLineValue + 1); if (syncPulseTrigger.latch(syncPulse5msValue)) { if (syncPulse5msMaxValue < syncPulse5msValue) { @@ -128,7 +118,7 @@ public class Demodulator { } ++syncPulseCounter; } else if (syncPulseCounter > syncPulseLowMark && syncPulseCounter < syncPulseHighMark) { - int filterDelay = (powerAvg.length - 1) / 2 - (scanLineFilter.length - 1) / 2; + int filterDelay = (powerAvg.length - 1) / 2; syncPulseOffset = i - syncPulseCounter - filterDelay; float mid9ms20msSum = ((9.f / 20.f) + 1.f) / 2.f; float mid9ms20msPwr = mid9ms20msSum * mid9ms20msSum;