#2494 P25P1 and NXDN Decoder Enhancements. (#2514)

- Updates P25P1 C4FM decoder to use same pattern developed for NXDN.
- Both share the C4FM symbol processor and equalizer.
- P25P1 updated with Garner style timing error detector
- NXDN filters updated to use a combined RRC and inverse sync filter all in one.
- P25P1 replaces RRC with band limiting filter
- P25P1 enhanced with dynamic PLL balance updates to combat multi-path fading, in addition to the sync detection training window.
- Decoder PPM error reports now only sent after 2x consecutive sync detections to prevent tuner PPM corrections from noisy/isolated false sync detects.
- Soft error correction added to both P25P1 and IDEN.

Co-authored-by: denny <dennis.sheirer@gmail.com>
This commit is contained in:
Denny Sheirer
2026-10-25 09:44:50 -04:00
committed by GitHub
parent df739f525f
commit 5635341d12
51 changed files with 4035 additions and 1504 deletions

View File

@@ -0,0 +1,34 @@
package io.github.dsheirer.dsp.c4fm;
import io.github.dsheirer.dsp.symbol.Dibit;
/**
* C4FM message framer base class.
*/
public abstract class C4FMMessageFramer
{
/**
* Process the symbol
* @param symbol in radians
* @return true if the framer emits a valid message that includes this symbol, so that corrective measurement
* can be sent to a feedback decoder.
*/
public abstract boolean process(Dibit symbol);
/**
* Process the symbol decision along with the soft symbol it was decided from. Framers that can use soft symbols
* (ie soft decision decoding) override this method. Default implementation discards the soft symbol.
* @param symbol decision
* @param softSymbol equalized soft symbol in radians
* @return true if the framer emits a valid message that includes this symbol.
*/
public boolean process(Dibit symbol, float softSymbol)
{
return process(symbol);
}
/**
* A sync pattern is detected
*/
public abstract void syncDetected();
}