arancormonk

DSD-neo | mbelib-neo
Joined
Dec 12, 2025
Messages
47
Reaction score
53
Hey all,

DSD-neo v1.0.0 is now available:


This is not meant as a sales pitch. A lot of RadioReference users already know DSD, DSD-FME, SDRTrunk, OP25, Unitrunker, etc., and I’d like to get DSD-neo in front of people who can actually exercise it against real systems and report what breaks.

To be clear, I work on this project because I am its primary user. I use it all the time, so the goal is to make it better for real monitoring workflows, not to promote something I do not personally depend on.

DSD-neo is a modular fork in the DSD/DSD-FME family, with similar protocol coverage but a more modern CMake build, portable release packages, and some newer input/control workflows.

A few things worth checking out:

- DMR, dPMR, D-STAR, NXDN, P25 Phase 1/2, X2-TDMA, EDACS, ProVoice, M17, and YSF support
- Built-in P25/DMR trunk following with channel maps and group lists
- RTL-SDR, RTL-TCP, SoapySDR, TCP/UDP PCM, WAV/file, and M17 UDP input/output paths
- Interactive ncurses UI with constellation, eye diagram, spectrum, FSK histogram, and live controls
- RTL quality-of-life features like bias tee control, gain/bandwidth/squelch controls, PPM correction, and optional auto-PPM
- IQ capture/replay support for reproducing decode problems
- Linux AppImage, macOS DMG, and Windows native ZIP builds

The areas where feedback would be especially useful:

- P25 Phase 1/2 trunking behavior, especially simulcast testing. For simulcast, use `-mq` with a direct RTL/SDR input path such as `-i rtl`, `-i rtltcp`, or `-i soapy`. The new CQPSK/simulcast path works from SDR/IQ-derived input, not discriminator/audio input.
- DMR trunking and Tier III/Cap+/Con+ style workflows
- RTL-TCP and SoapySDR device behavior
- Windows console/audio behavior
- EDACS/ProVoice, NXDN, M17, and YSF regressions
- Any cases where DSD-FME behaves better on the same signal/input

If you try it and run into trouble, please include the OS, build/download used, input method, command line/config, protocol/system type, and any useful logs or short reproducible captures if possible.

Issues can be filed here:


Thanks to everyone who gives it a spin, and thanks to @lwvmobile for a solid starting point when I began this modernization effort. The goal right now is practical field feedback: what works, what regresses, and what needs cleanup.
 

dispatchgeek

Control channel goes "brrrrr"
Joined
Feb 29, 2004
Messages
445
Reaction score
454
Location
Between the cornfields and the pastures, Michigan.
I know this might be a pipe dream, but you know what would really help me? Ability to scan between sites/systems. I really want to scan the P25 site to my west and the P25 site to my east, plus a DMR control channel on one stick by changing frequencies when the control channel is idle or none of my white listed talkgroups are active.

I love using DSDPlus, but don't want to run three instances of it at the same time.
With SDRTrunk, I'd be into 8 RTL SDRs to cover the frequency spread I need.
OP25 does this with the rx.py, but all development has stopped to prefer multiple tuners using multi_rx.py.
I've done this with my SDS100 left at home and attached to Proscan, but that has it's own drawbacks as well.

Is this feature something that is possible or that you would be interested in?
 

arancormonk

DSD-neo | mbelib-neo
Joined
Dec 12, 2025
Messages
47
Reaction score
53
I know this might be a pipe dream, but you know what would really help me? Ability to scan between sites/systems. I really want to scan the P25 site to my west and the P25 site to my east, plus a DMR control channel on one stick by changing frequencies when the control channel is idle or none of my white listed talkgroups are active.

I love using DSDPlus, but don't want to run three instances of it at the same time.
With SDRTrunk, I'd be into 8 RTL SDRs to cover the frequency spread I need.
OP25 does this with the rx.py, but all development has stopped to prefer multiple tuners using multi_rx.py.
I've done this with my SDS100 left at home and attached to Proscan, but that has it's own drawbacks as well.

Is this feature something that is possible or that you would be interested in?

Yeah, this is possible in principle, and it’s something I’d be interested in exploring.

The main catch is that with one SDR, DSD-neo could only listen to one control channel at a time, so it would inevitably miss some activity while parked on another site/system. But a “trunk scan” mode that rotates between configured P25/DMR control channels when there’s no whitelisted/active call sounds realistic.

It would not be as complete as running multiple tuners, but for your use case it could be a useful middle ground: one stick, multiple sites/systems, follow only the traffic you care about.

I can make an issue to track this.
 

dispatchgeek

Control channel goes "brrrrr"
Joined
Feb 29, 2004
Messages
445
Reaction score
454
Location
Between the cornfields and the pastures, Michigan.
Yeah, this is possible in principle, and it’s something I’d be interested in exploring.

The main catch is that with one SDR, DSD-neo could only listen to one control channel at a time, so it would inevitably miss some activity while parked on another site/system. But a “trunk scan” mode that rotates between configured P25/DMR control channels when there’s no whitelisted/active call sounds realistic.

It would not be as complete as running multiple tuners, but for your use case it could be a useful middle ground: one stick, multiple sites/systems, follow only the traffic you care about.

I can make an issue to track this.
This would be exactly what I am looking for. You're right, it's not as complete as multiple tuners, but it is a useful middle ground. I'd be down for a big monster of a PC with SDRTrunk sucking up whatever it sees, but it's not in the cards right now. Frugal is the name of the game. It would be great if you made an issue on github for this.

I appreciate it!
 

arancormonk

DSD-neo | mbelib-neo
Joined
Dec 12, 2025
Messages
47
Reaction score
53
This would be exactly what I am looking for. You're right, it's not as complete as multiple tuners, but it is a useful middle ground. I'd be down for a big monster of a PC with SDRTrunk sucking up whatever it sees, but it's not in the cards right now. Frugal is the name of the game. It would be great if you made an issue on github for this.

I appreciate it!
done, Add single-tuner trunk scan mode for rotating P25/DMR control channels · Issue #92 · arancormonk/dsd-neo
 

W4KRR

Member
Premium Subscriber
Joined
Apr 1, 2001
Messages
3,670
Reaction score
284
Location
Coconut Creek
This version is working well for me. I have been using your previous versions, both for Linux and Windows.

What I would like to see is having the active talkgroup and alias stand out from the rest of the surrounding text, either by way of a larger font and/or a different color. Just my personal preference.
 

dispatchgeek

Control channel goes "brrrrr"
Joined
Feb 29, 2004
Messages
445
Reaction score
454
Location
Between the cornfields and the pastures, Michigan.
I am having decent luck with this version. I have it running at work, monitoring a local P25 simulcast cell, doing per call recording and shipping those off to RDIO-Scanner. I occasionally drop sync and the SNR drops from 20 db down to around 1 db. I can't be sure this isn't a local issue, as this location is absolutely brutal for RFI. I assume this could be set up to run multiple instances from multiple folders/RTLSDRs? I'd like to try three instances (Two P25 and a DMR) on my server at home.
 

arancormonk

DSD-neo | mbelib-neo
Joined
Dec 12, 2025
Messages
47
Reaction score
53
I am having decent luck with this version. I have it running at work, monitoring a local P25 simulcast cell, doing per call recording and shipping those off to RDIO-Scanner. I occasionally drop sync and the SNR drops from 20 db down to around 1 db. I can't be sure this isn't a local issue, as this location is absolutely brutal for RFI. I assume this could be set up to run multiple instances from multiple folders/RTLSDRs? I'd like to try three instances (Two P25 and a DMR) on my server at home.
yep, you just need to set the right RTL index:

Code:
dsd-neo -i rtl:0:769.76875M:30:1 -mq -T -N --enc-lockout
Code:
dsd-neo -i rtl:1:855.5875M:0:1 -fs -N

i print it out at startup if you dont know what index matches to the SN:

Code:
NOTICE: P25: Encrypted call lockout: On (skip encrypted).
NOTICE: Enabling only QPSK modulation optimizations.
NOTICE: ------------------------------------------------------------------------------
NOTICE: | Digital Speech Decoder: DSD-neo v1.0.0-3-gef92ac9e (ef92ac9)
NOTICE: ------------------------------------------------------------------------------
NOTICE: MBElib-neo Version: 2.0.0
NOTICE: RTL Input: NOTICE: Found 2 device(s):
NOTICE:   0:  Nooelec, NESDR SMArt v5, SN: 56435444
NOTICE: Selected Device #0 with Serial Number: 56435444
NOTICE:   1:  Nooelec, NESDR SMArt v5, SN: 00000001
NOTICE: RTL #0: Freq=769768750 Gain=30 PPM=1 DSP-BW=48kHz SQ=-110.0dB VOL=2
Audio In Device: rtl:0:769.76875M:30:1
Requested RTL PPM Error Set to 1
Setting DSP baseband to 48000 Hz
Setting RTL Power Squelch Level to -110.0 dB
soft stopping...
NOTICE:
NOTICE: Total audio errors: 53
NOTICE: Total header errors: 24
NOTICE: Total irrecoverable header errors: 0
NOTICE: Exiting.
 

saioke

Member
Joined
Apr 18, 2010
Messages
284
Reaction score
139
Any cases where DSD-FME behaves better on the same signal/input

Just curious but how would one go about providing such information? DSD FME works way better than Neo in my experience. My p25 signal isn't the best but the decodes are quite smooth on dsd fme provided talkgroups aren't speaking on a particularly weak VC frequency. That being said, DSD+ is the best at decodes, even pulling in the weak VC much better. Neo on the other hand will often fail even on fairly strong signals, sometimes even cutting out on a current decode even if it's clear. Missing replies as well. It's like, neo can't swap between CC and VC quick enough compared to fme.

But if I can help Neo somehow get to the point of dsd+ decodes, I'll do what I can. Currently run dsd fme and neo with the same arguments interchangeably -i rtl:0:774.53125M:0:0:0:0 -f1 -T -N -7 "C:\MARCS-Jackson-Calls" -P
 
Last edited:

arancormonk

DSD-neo | mbelib-neo
Joined
Dec 12, 2025
Messages
47
Reaction score
53
Just curious but how would one go about providing such information? DSD FME works way better than Neo in my experience. My p25 signal isn't the best but the decodes are quite smooth on dsd fme provided talkgroups aren't speaking on a particularly weak VC frequency. That being said, DSD+ is the best at decodes, even pulling in the weak VC much better. Neo on the other hand will often fail even on fairly strong signals, sometimes even cutting out on a current decode even if it's clear. Missing replies as well. It's like, neo can't swap between CC and VC quick enough compared to fme.

But if I can help Neo somehow get to the point of dsd+ decodes, I'll do what I can. Currently run dsd fme and neo with the same arguments interchangeably -i rtl:0:774.53125M:0:0:0:0 -f1 -T -N -7 "C:\MARCS-Jackson-Calls" -P

Thanks. A couple things stand out from that command.

In Neo, the RTL string is
Code:
rtl:dev:freq:gain:ppm:bw:sql:vol
. Your current string has gain=0, which means RTL hardware auto gain, and bw=0, which falls back to Neo’s default. For this test, please avoid auto gain because it can overdrive or pump levels during trunking/retunes and make P25 decode worse even when the signal looks strong.

Also, -f1 in Neo means “P25 Phase 1 only.” For trunk following, please test with -ft so P25 Phase 1 control plus P25 Phase 1/Phase 2 voice paths are enabled.

Please try this exact baseline first:

Code:
dsd-neo -i rtl:0:774.53125M:28:0:48:0:2 -ft -T -N -7 "C:\MARCS-Jackson-Calls" -P

If gain 28 is worse, try 22, 26, 32, and 36. The goal is not maximum signal strength; it is a clean signal without clipping/overload.

If it still misses replies or cuts out mid-call, the most useful thing is a replayable IQ capture from a short period where FME/DSD+ would decode but Neo does not. Please run:

Code:
New-Item -ItemType Directory -Force C:\neo-debug | Out-Null
$env:DSD_NEO_DEBUG_SYNC = "1"
$env:DSD_NEO_DEBUG_CQPSK = "1"

dsd-neo -i rtl:0:774.53125M:28:0:48:0:2 -ft -T -N -7 "C:\MARCS-Jackson-Calls" -P --iq-capture "C:\neo-debug\marcs-jackson.iq" --iq-capture-max-mb 768 -J "C:\neo-debug\events.log" --frame-log "C:\neo-debug\frames.log" 2> "C:\neo-debug\console.log"

Stop it with Ctrl-C shortly after a missed reply or cutout happens, then run:

Code:
dsd-neo --iq-info "C:\neo-debug\marcs-jackson.iq.json" > "C:\neo-debug\iq-info.txt" 2>&1
dsd-neo -i rtl:0:774.53125M:28:0:48:0:2 -ft -T -N -7 "C:\MARCS-Jackson-Calls" -P --print-config > "C:\neo-debug\effective-config.ini" 2> "C:\neo-debug\print-config.log"

Please zip/7z the debug files and share them with SwissTransfer: SwissTransfer - Send large files securely and free of charge. It is free and supports large temporary transfers, so it works better than forum attachments.

Please include:

- console.log
- events.log
- frames.log
- iq-info.txt
- effective-config.ini
- marcs-jackson.iq AND marcs-jackson.iq.json
- approximate local time when the miss/cutout occurred
- exact DSD-FME and DSD+ commands/settings used for comparison
- RTL model, antenna setup, gain/PPM used, and whether this is a simulcast site

The IQ capture is the key artifact because it lets us replay the same CC/VC transitions locally instead of guessing from the final audio WAVs.
 

nd5y

Member
Joined
Dec 19, 2002
Messages
12,535
Reaction score
4,829
Location
Wichita Falls, TX
I am using the Linux AppImage and it runs and looks like it is decoding the CC but doesn't appear to do anything else.

Is there any documentation on how to make or save or load config files containing these? If that's even possible. (I don't have a paid RR membership so I can't import anything.)
system names
site numbers
site names
talkgroups names
RID lables or aliases

All I see is this
Where is docs/cli.md? Is this a file or some URL on GitHub?
 
Last edited:

arancormonk

DSD-neo | mbelib-neo
Joined
Dec 12, 2025
Messages
47
Reaction score
53
I am using the Linux AppImage and it runs and looks like it is decoding the CC but doesn't appear to do anything else.

Is there any documentation on how to make or save or load config files containing these? If that's even possible.
system names
site numbers
site names
talkgroups names
RID lables or aliases

All I see is this
Where is docs/cli.md? Is this a file or some URL on GitHub?
If it is decoding the CC, the basic signal path is working. To hear calls, DSD-neo needs trunking enabled and a way to retune to the voice channels: direct RTL input can retune itself, or external SDR software needs rigctl. Use -T for trunking, and depending on the system you may also need a channel map CSV with -C.

Config files are supported, but they are mostly for runtime settings and paths, not a full RadioReference-style system database. Run:

Code:
./dsd-neo-linux-*.AppImage --dump-config-template > ~/.config/dsd-neo/config.ini
./dsd-neo-linux-*.AppImage --config ~/.config/dsd-neo/config.ini

Talkgroup labels are loaded from a separate CSV using -G group.csv, or from config with:

Code:
[trunking]
enabled = true
group_csv = "/path/to/group.csv"
chan_csv = "/path/to/channels.csv"

Basic group.csv format is:

Code:
id,mode,name
1449,A,Fire Dispatch
929,A,Fire Tac
22033,DE,Law Dispatch

A is normal/allowed, B blocks, and DE marks encrypted/locked out. The same label table can also label source IDs/RIDs in some displays/logs, but it is currently a flat ID list, not a separate TG database plus RID alias database, so ID collisions can be confusing.

System/site numbers are decoded from the control channel. User-entered system names and site names are not really a separate saved database feature yet. That would be a good feature request.

Docs are here: dsd-neo/docs at main · arancormonk/dsd-neo
 
Last edited:

gary123

Member
Joined
Sep 11, 2002
Messages
3,106
Reaction score
1,553
I think it would be a good idea to include a text file with a basic template for the Groups_csv, Chan_csv like in the post above for the gropus.csv. This would make it easier for newer users to just edit a good template with their local system information.

I know the directions are in the .csv-formats.md file however my experience has been that an actual template is much easier for a user to work with and edit.
 

jimlawrence

Member
Joined
Apr 17, 2004
Messages
291
Reaction score
16
I'm guessing (and this is just a guess, I may be really wrong) that in the case where one has a TIII DMR system with two or more control channel frequencies that rotate every 24 hours, this command will follow the system successfully using SDR++?? Or there there another argument required to tell rig-ctrl to hunt for a new control channel? Thanks!!

bin\dsd-neo.exe -ft -i tcp:127.0.0.1:7355 -U 4532 -t 2 -e -T -C dmr_t3_chan.csv -N 2> NUL
 

arancormonk

DSD-neo | mbelib-neo
Joined
Dec 12, 2025
Messages
47
Reaction score
53
I'm guessing (and this is just a guess, I may be really wrong) that in the case where one has a TIII DMR system with two or more control channel frequencies that rotate every 24 hours, this command will follow the system successfully using SDR++?? Or there there another argument required to tell rig-ctrl to hunt for a new control channel? Thanks!!

bin\dsd-neo.exe -ft -i tcp:127.0.0.1:7355 -U 4532 -t 2 -e -T -C dmr_t3_chan.csv -N 2> NUL
-U 4532 is the SDR++ rigctl control path. There is not a separate “rigctl hunt” argument.

For a DMR Tier III site, DSD-neo needs to be sitting on a valid current control channel first. Once it is decoding the CC, -T plus -C dmr_t3_chan.csv lets it resolve channel numbers to RF frequencies and retune SDR++ for voice grants. If the TIII system announces/withdraws TSCCs and the alternate CC LCNs are present in the CSV, DSD-neo should be able to retune SDR++ to the announced alternate.

The caveat is that the CSV does not make trunking mode blindly scan all possible control channels after the current one goes dead. If the daily rotation happens without DSD-neo decoding an alternate/withdrawal announcement, you may need to start SDR++ on the active CC again, or use a separate scan/manual method to find it. -Y is scanner mode, not the normal trunk-follow mode.

I would also consider using -fs for a DMR-only system instead of -ft, and while testing use 2> dsd.log rather than 2> NUL so you can see whether it logs a CC switch or tune event. -B 7000 or -B 12000 can be useful if you want DSD-neo to set SDR++’s NFM bandwidth on retunes.
 
Top