removed scanline SMA and relaxed base band filter

pull/11/head
Ahmet Inan 2024-04-22 18:04:50 +02:00
rodzic 8fc46077c8
commit bbbb8c4fbe
1 zmienionych plików z 5 dodań i 15 usunięć

Wyświetl plik

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