From 95aa9f8803fb8c3b79abd4cdddcb24435a9e595f Mon Sep 17 00:00:00 2001 From: Denny Date: Wed, 18 Apr 2018 05:47:17 -0400 Subject: [PATCH 1/4] Adds automatic gain control to P25 C4FM decoder to condition the samples prior to interpolation. Resolves issue with using incorrect quadrature index when pulling a sample from the interpolating buffer. Resolves issue where the instrumented version of the interpolating buffer was being constructed in the non-interpolated decoder component. --- .../dsheirer/dsp/psk/InterpolatingSampleBuffer.java | 2 +- .../dsheirer/module/decode/p25/P25_C4FMDecoder.java | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/github/dsheirer/dsp/psk/InterpolatingSampleBuffer.java b/src/main/java/io/github/dsheirer/dsp/psk/InterpolatingSampleBuffer.java index 15adbd9a..f08e6a50 100644 --- a/src/main/java/io/github/dsheirer/dsp/psk/InterpolatingSampleBuffer.java +++ b/src/main/java/io/github/dsheirer/dsp/psk/InterpolatingSampleBuffer.java @@ -130,7 +130,7 @@ public class InterpolatingSampleBuffer */ public Complex getPrecedingSample() { - mPrecedingSample.setValues(mDelayLineInphase[mDelayLinePointer + 4], mDelayLineQuadrature[mDelayLinePointer + 3]); + mPrecedingSample.setValues(mDelayLineInphase[mDelayLinePointer + 3], mDelayLineQuadrature[mDelayLinePointer + 3]); return mPrecedingSample; } diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/P25_C4FMDecoder.java b/src/main/java/io/github/dsheirer/module/decode/p25/P25_C4FMDecoder.java index 6923bc37..b1969b16 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/P25_C4FMDecoder.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/P25_C4FMDecoder.java @@ -20,9 +20,9 @@ import io.github.dsheirer.dsp.filter.FilterFactory; import io.github.dsheirer.dsp.filter.design.FilterDesignException; import io.github.dsheirer.dsp.filter.fir.FIRFilterSpecification; import io.github.dsheirer.dsp.filter.fir.complex.ComplexFIRFilter; +import io.github.dsheirer.dsp.gain.ComplexFeedForwardGainControl; import io.github.dsheirer.dsp.psk.DQPSKDemodulator; import io.github.dsheirer.dsp.psk.InterpolatingSampleBuffer; -import io.github.dsheirer.dsp.psk.InterpolatingSampleBufferInstrumented; import io.github.dsheirer.dsp.psk.pll.CostasLoop; import io.github.dsheirer.sample.Listener; import io.github.dsheirer.sample.complex.ComplexBuffer; @@ -38,6 +38,7 @@ import java.util.concurrent.ScheduledExecutorService; public class P25_C4FMDecoder extends P25Decoder implements IComplexBufferListener, Listener { private final static Logger mLog = LoggerFactory.getLogger(P25_C4FMDecoder.class); + private ComplexFeedForwardGainControl mAGC = new ComplexFeedForwardGainControl(32); protected static final double SYMBOL_RATE = 4800; protected InterpolatingSampleBuffer mInterpolatingSampleBuffer; protected DQPSKDemodulator mQPSKDemodulator; @@ -65,7 +66,7 @@ public class P25_C4FMDecoder extends P25Decoder implements IComplexBufferListene mCostasLoop = new CostasLoop(mSampleRate, SYMBOL_RATE); - mInterpolatingSampleBuffer = new InterpolatingSampleBufferInstrumented((float)(sampleRate / SYMBOL_RATE)); + mInterpolatingSampleBuffer = new InterpolatingSampleBuffer((float)(sampleRate / SYMBOL_RATE)); mQPSKDemodulator = new DQPSKDemodulator(mCostasLoop, mInterpolatingSampleBuffer); //Message framer can trigger a symbol-inversion correction to the PLL when detected @@ -77,8 +78,11 @@ public class P25_C4FMDecoder extends P25Decoder implements IComplexBufferListene @Override public void receive(ComplexBuffer complexBuffer) { - ComplexBuffer filtered = filter(complexBuffer); - mQPSKDemodulator.receive(filtered); + ComplexBuffer basebandFiltered = filter(complexBuffer); + + ComplexBuffer gainApplied = mAGC.filter(basebandFiltered); + + mQPSKDemodulator.receive(gainApplied); } protected ComplexBuffer filter(ComplexBuffer complexBuffer) From 5bfc5bf4564ab4b9fbf0b5f47b588ae601bb2963 Mon Sep 17 00:00:00 2001 From: Denny Date: Wed, 18 Apr 2018 05:49:04 -0400 Subject: [PATCH 2/4] Increments build to 0.3.4 beta 2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 284b6999..e107ee72 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ repositories { mavenCentral() } -version = '0.3.4-beta.1' +version = '0.3.4-beta.2' sourceCompatibility = 1.8 sourceSets { From 81c9a352a8fab08fdda77e9d66983396b2189a37 Mon Sep 17 00:00:00 2001 From: Denny Date: Wed, 18 Apr 2018 05:51:55 -0400 Subject: [PATCH 3/4] Updates changelog --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index d9f7b9d7..8d7c0d65 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,5 @@ 0.3.4 20180210 + - New P25 C4FM decoder that uses Differential QPSK decoder instead of FM demodulation with 4FSK. - Adds channel auto-start and ordering capability with startup dialog allowing user to invoke or bypass channel auto-start. Provides user with more control over startup configuration. - Adds preferred tuner attribute to channel configuration allowing user to select a preferred tuner for the channel From dfaf506e23cadfe8f695e2076e0c87bf2e2e7766 Mon Sep 17 00:00:00 2001 From: Denny Date: Wed, 18 Apr 2018 05:52:15 -0400 Subject: [PATCH 4/4] Updates changelog --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 8d7c0d65..14e41046 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -0.3.4 20180210 +0.3.4 20180418 - New P25 C4FM decoder that uses Differential QPSK decoder instead of FM demodulation with 4FSK. - Adds channel auto-start and ordering capability with startup dialog allowing user to invoke or bypass channel auto-start. Provides user with more control over startup configuration.