Skip to content

Trunking Configuration

ralphl edited this page Aug 2, 2026 · 2 revisions

Trunking Configuration

Detailed setup for the trunked-radio systems NyxScope follows: P25 Phase 1 + Phase 2, EDACS (Standard and EA), NXDN48 and NXDN96. The MANUAL.md has the conceptual overview; this page is the practical reference for getting a specific system to work.

P25 Phase 1

P25 Phase 1 is C4FM-modulated at 4800 baud with IMBE voice. NyxScope decodes it natively (no DSD subprocess needed for voice).

Setting it up

  1. Open Trunking in the right dock → + New System.
  2. Type: P25 (leave the modulation on Auto — it detects regular C4FM vs simulcast LSM on its own; see the simulcast section below).
  3. Add the control channel frequencies (one or more — NyxScope rotates if one becomes unreachable).
  4. Optional: set the NAC explicitly (a 12-bit hex value like 0x293). If you leave NAC unset, NyxScope accepts whichever NAC is seen on the CC.
  5. Add talkgroups by ID (decimal), each with a friendly name. CSV/JSON import is in the right-click menu.
  6. Click SaveActivate.

NyxScope will lock onto the control channel, parse TSBKs, follow voice grants to the assigned voice channel, and decode IMBE audio.

What "94–96% frame recovery" means

NyxScope's native P25 voice decoder uses soft-NID and best-effort IMBE FEC — it produces useful audio on weak signals where stock decoders give up entirely. On a marginal P25 system (low signal, multipath, edge of coverage) you'll typically get 8–8.5 IMBE frames per LDU (out of 9 max).

You'll notice some audio artifacts on weak frames but the call stays intelligible. On strong signals, you get full-quality audio.

Talkgroups appearing without names

The system is decoding but you don't have a talkgroup imported for that TGID yet. Either:

  • Add it manually in the Trunking dock.
  • Use Frequency Lookup (right-click) to check the RadioReference database for the system's TG list.
  • Import from a CHIRP/RadioReference CSV (Trunking → Import).

RadioReference import

Importing from RadioReference creates the System with its Sites underneath — each site is its own control-channel set, shown in an expand/collapse hierarchy in the Trunking dock. Non-US systems import too: search by RadioReference System ID instead of the US state/county browser.

P25 simulcast (LSM / CQPSK)

Most modern public-safety P25 networks are simulcast: multiple towers transmit the same signal at once, using LSM (linear simulcast modulation, a CQPSK variant) instead of plain C4FM. A simulcast control channel looks strong on the waterfall but never decodes through a C4FM slicer — before 1.35, NyxScope could see these systems and never lock them.

They decode now, and the setup is nothing:

  1. Create the system with type Auto (or leave an existing P25 system on Auto).
  2. NyxScope works out on its own whether the control channel is regular C4FM or simulcast and switches the demodulator accordingly.

You only need to care about the distinction if you've forced a type manually. If a P25 system shows sync activity but zero decoded TSBKs, it's almost always a simulcast CC being read as C4FM — set it back to Auto.

Known limitation: P25 systems whose control channel itself is TDMA (Phase 2 control channels, rare but they exist) are not supported. The tell: plenty of sync events, zero NID/TSBK decodes, zero CRC errors. Voice on Phase 2 TDMA channels is fine — this is only about the control channel.

P25 Phase 2 TDMA

Phase 2 voice channels use H-DQPSK with AMBE+2 vocoding and TDMA timeslots. The control channel is still Phase 1 C4FM — only voice channels are TDMA.

Setting it up

Phase 2 is auto-detected from the IDEN_UP_TDMA ($33) message on the control channel. If the system advertises a TDMA frequency table, NyxScope automatically routes voice grants on those channels through the Phase 2 decoder.

You don't configure Phase 2 separately. Set the system up as P25 (Auto), and Phase 2 voice channels are followed automatically when present.

A small orange P2 badge appears next to the voice frequency in the Trunking dock when Phase 2 is active.

Honest status

Phase 2 voice is still attempted rather than finished. Calls follow correctly and produce audio, but on some systems the voice comes out robotic or stays silent. If you have a Phase 2 system nearby, a short IQ recording of a live call is the most useful thing you can send.

Also set expectations about encryption: many Phase 2 public-safety systems encrypt nearly everything (AES-256 on all main talkgroups is common). If every call on a system shows silence, check the lock icons before suspecting the decoder — the clear talkgroups on such systems are often the Phase 1 interop channels.

When Phase 2 doesn't work

  • Confirm the system actually broadcasts IDEN_UP_TDMA. Some systems run mixed Phase 1 + Phase 2, others are pure Phase 1.
  • Marginal signal hurts Phase 2 harder than Phase 1 because H-DQPSK is more sensitive to multipath. If voice is garbled, try a better antenna or a closer site before assuming a decode bug.
  • Update to 1.36+ — earlier versions cut Phase 2 calls off after three seconds and could resolve Phase 2 channel numbers to the wrong frequency.

EDACS

EDACS (Enhanced Digital Access Communications System) is a GE / Ericsson trunking standard still in use by some legacy public-safety systems. NyxScope's native EDACS decoder handles Standard and EA (Extended Addressing) modes; ESK is auto-detected.

Setting it up

  1. + New System → Type: EDACS-Standard or EDACS-EA.
  2. Add the control channel frequency (EDACS uses a single dedicated CC; not rotating).
  3. Add LCN ↔ frequency mapping — EDACS systems index voice channels by Logical Channel Number, not frequency. The system's LCN map must be entered manually (CSV import works).
  4. Add talkgroups by AFS (Standard) or 16-bit TGID (EA).
  5. Save and activate.

Standard vs. EA mode

NyxScope auto-detects from the site-ID pattern. EA mode is identified by mt1=0x1F, mt2=0xA system messages. If you're unsure which your system is, leave it on whichever the auto-detect picks; the badge in the Trunking dock shows the active mode.

Why dsd-neo doesn't decode EDACS

dsd-neo's -fh EDACS mode is broken (SPS hunt loops endlessly, 0 frames). NyxScope ships a native EDACS CC decoder that doesn't go through dsd-neo. Voice channels (analog FM, or digital ProVoice if enabled) still go through the FM demod / dsd-neo path.

Confirmed working

Florida SLERS (Hudson site) — EA + ESK — confirmed 13 voice grants over an 8-minute test, voice follows with the standard 15-second CC check-in cycle.

NXDN

NXDN48 is 4FSK at 4800 baud with 6.25 kHz channel spacing. NXDN96 is 9600 baud / 12.5 kHz. NyxScope ships native CC decoders for both.

Setting it up

  1. + New System → Type: NXDN-48 or NXDN-96.
  2. Add control channel frequency.
  3. Add LCN ↔ frequency mapping (NXDN uses LCNs the same way EDACS does).
  4. Add talkgroups by TGID.

Voice channels

Voice is decoded via the bundled digital-voice decoder running in nxdn48 or nxdn96 mode (lazy-started on the first voice grant — no idle subprocess). NXDN trunking is verified end-to-end on live systems as of 1.36: control channel locks, grants follow, voice decodes.

Hardware caveat: NXDN48's narrow 6.25 kHz channels are unforgiving of LO offset. A PlutoSDR's typical frequency error is enough to give 100% sync and 0% valid frames — use an RTL-SDR or HackRF for NXDN48 trunking.

Control-channel discovery

If you know there's a P25 system in your area but don't have the CC frequency, NyxScope can find it:

  1. Right-click a scan range in the left panel.
  2. Discover Trunked Systems — starts an overlay scan that watches for P25 sync patterns across the band.
  3. The Trunk Discovery dock pop-out shows candidate frequencies as they're confirmed (NAC, WACN, RFSS, Site ID).
  4. Right-click a confirmed row → Add to config to create a system entry pre-populated with the CC frequency and NAC.

Discovery is also auto-armed on the 800 MHz public-safety band by default. See the Trunk Discovery section of MANUAL.md.

Discovery validation: NyxScope filters out synthetic NAC values that noise produces (0, 0xF7E "ReceiveAny", 0xF7F "RepeatAny", 0xFFF "all-ones"). If you're seeing zero discoveries in a band you know has activity, the threshold is 8 valid TSBKs within a 5-second window — make sure the signal is strong enough to actually decode that many frames.

Talkgroup management

Manual entry

Trunking dock → system → Talkgroups tab → + Add TG. Fields:

  • TGID (decimal)
  • Alpha tag (short name shown in call history)
  • Description (longer)
  • Category (Fire / EMS / PD / etc.)
  • Priority (1–5; higher numbers preempt lower)

Bulk import

Right-click → Import TGs from CSV. Expected columns: tgid,alpha_tag,description,category,priority. Compatible with RadioReference CSV exports.

Blocking and skipping

  • Block a TG → its calls are silenced but still logged.
  • Skip a TG → its grants are ignored entirely (NyxScope won't tune voice channel).
  • Priority hold → if a higher-priority call comes in mid-call, NyxScope can preempt.

Encryption

NyxScope detects encrypted P25 calls via the Crypto Control field in LDU2 (algid + keyid). Encrypted calls are shown in the Trunking dock with a lock icon and tag color shift; audio is silenced (no point decoding noise).

P25 supports DES, AES, ADP and others. NyxScope does NOT decrypt — that requires the actual key material from the system operator. The badge tells you whether it's encrypted; that's all.

The default_encrypted flag on a system tells NyxScope to assume encryption when the Crypto Control field is unrecoverable (common on weak signals).

Common problems

"I hear the CC but no voice." Usually one of:

  • Voice channel frequency mapping is wrong (LCN table mismatch for EDACS/NXDN).
  • TG is blocked or its priority is below the active hold.
  • The call is encrypted — check for the lock icon.
  • Signal is too weak on the voice freq (CC and voice channels may not have identical coverage).

"Voice is garbled." Phase 1 voice should be intelligible at any signal level NyxScope holds a sync on (94-96% IMBE recovery). Phase 2 is more fragile to multipath. EDACS ProVoice depends on the bundled decoder. NXDN voice is generally clean but watch CPU load — if the decoder is starving for samples, audio breaks. On 1.36+ the app also corrects for a radio that's slightly off frequency — on older versions, an uncorrected PPM error is the single biggest cause of "strong signal, garbled or no audio" on digital voice.

"Trunking won't start / wrong sample rate." The trunking capture rate setting (Settings → Trunking) controls the rate used while following a system. Auto picks a rate that decodes reliably on your radio — including avoiding rates that connect fine but never decode (a real case on the RTL-SDR Blog V4). If Auto doesn't suit your radio, set the rate by hand.

"Discovery returns 0xFFF NACs." Filtered as of v1.25.0 — those are noise-decoded BCH outputs, not real systems. If you saw them in an older version, upgrade.

"Wrong NAC reported." Soft-NID decode mode can emit 0xF7E (ReceiveAny) when BCH errors exceed the strict-correction limit. NyxScope filters this from the discovery validation gate but it can briefly appear in active-decode metadata before the next clean NID lands.

"P25 voice ended but NyxScope didn't return to CC." TDU/TDULC detection works most of the time on strong signals but can miss on weak ones. NyxScope falls back to a voice-hold timer (default 3 seconds of silence → return to CC). Adjustable per-system in the trunking config.


Next: HD-Radio-Setup · Troubleshooting · FAQ