1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-19 23:01:51 -05:00
sdrangel/dsd
2016-04-09 19:14:19 +02:00
..
cmake Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
.gitmodules Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
CHANGELOG Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
cmake_uninstall.cmake.in Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
CMakeLists.txt DSD decoder: removed all the pthread shit 2016-04-08 20:52:16 +02:00
config.h Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
configure Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
COPYRIGHT Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
descramble.h Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
dmr_const.c DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
dmr_const.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
dmr_data.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
dmr_voice.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
dsd_audio.c DSD demod plugin: DSD proper integration interim state #1 2016-04-09 13:12:48 +02:00
DSD_Author.pgp Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
dsd_cleanupexit.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
dsd_cleanupexit.h Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
dsd_comp.c DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
dsd_comp.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
dsd_dibit.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
dsd_file.c Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
dsd_filters.c Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
dsd_frame_sync.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
dsd_frame.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
dsd_livescanner.c DSD demod plugin: integration of DSD engine 2016-04-09 02:27:32 +02:00
dsd_livescanner.h DSD demod plugin: integration of DSD engine 2016-04-09 02:27:32 +02:00
dsd_main.c DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
dsd_mbe.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
dsd_nocarrier.c Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
dsd_nocarrier.h Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
dsd_opts.c DSD demod plugin: DSD proper integration interim state #1 2016-04-09 13:12:48 +02:00
dsd_opts.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
dsd_serial.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
dsd_state.c DSD demod plugin: DSD proper integration interim state #1 2016-04-09 13:12:48 +02:00
dsd_state.h DSD demod plugin: DSD proper integration interim state #2 2016-04-09 19:14:19 +02:00
dsd_symbol.c DSD demod plugin: DSD proper integration interim state #1 2016-04-09 13:12:48 +02:00
dsd_upsample.c DSD demod plugin: DSD proper integration interim state #1 2016-04-09 13:12:48 +02:00
dsd.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
dstar_const.c DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
dstar_const.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
dstar_header.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
dstar_header.h Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
dstar.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
fcs.h Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
git_ver.c.in Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
git_ver.h Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
nxdn96_const.c DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
nxdn96_const.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
nxdn96.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
nxdn_const.c DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
nxdn_const.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
nxdn_data.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
nxdn_voice.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
p25_lcw.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
p25p1_const.c DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
p25p1_const.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
p25p1_hdu.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
p25p1_heuristics.c DSD decoder: removed all the pthread shit 2016-04-08 20:52:16 +02:00
p25p1_heuristics.h Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
p25p1_ldu1.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
p25p1_ldu2.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
p25p1_tdulc.c Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
provoice_const.c DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
provoice_const.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
provoice.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
README.md Imported the dsd library from gr-dsd. Make it a library actually removing useless dependencies 2016-04-07 02:00:54 +02:00
x2tdma_const.c DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
x2tdma_const.h DSD demod: this is the end of it. f..k off! 2016-04-08 18:14:50 +02:00
x2tdma_data.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00
x2tdma_voice.c DSD demod: replace printf by fprintf to stderr in DSD code 2016-04-09 04:34:12 +02:00

Digital Speech Decoder 1.7.0-dev

Copyright (C) 2010 DSD Author GPG Key ID: 0x3F1D7FD0 (74EF 430D F7F2 0A48 FCE6 F630 FAA2 635D 3F1D 7FD0)

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

DSD is able to decode several digital voice formats from discriminator tap audio and synthesize the decoded speech. Speech synthesis requires mbelib, which is a separate package.

Supported formats

P25 Phase 1

Widely deployed radio standard used in public safety and amateur radio.

Support includes decoding and synthesis of speech, display of all link control info, and the ability to save and replay .imb data files

ProVoice

EDACS Digital voice format used by public safety and amateur radio.

Support includes decoding and synthesis of speech and the ability to save and replay .imb data files.

Note: not enabled by default, use -fp to enable.

X2-TDMA

Two slot TDMA system currently being deployed by several public safety organizations. Based on the DMR standard with extensions for P25 style signaling.

Support includes decoding and synthesis of speech, display of all link control info, and the ability to save and replay .amb data files

DMR/MOTOTRBO

"Digital Mobile Radio" Eurpoean two slot TDMA standard. MOTOTRBO is a popular implementation of this standard.

Support includes decoding and synthesis of speech and the ability to save and replay .amb data files.

NXDN

Digital radio standard used by NEXEDGE and IDAS brands. Supports both 9600 baud (12.5 kHz) and 4800 baud (6.25 kHz) digital voice.

Support includes decoding and synthesis of speech and the ability to save and replay .amb data files.

D-STAR

Amateur radio digital voice standard

This is an earlier version of the AMBE codec than the one used by most of the protocols. Support for this was added by various developers.

Unsupported formats in version 1.6 considered for future development:

P25 Phase 2

This is not yet a published standard. Full support is expected once the standard is published and there are systems operating to test against. Phase 2 will use a vocoder supported by mbelib.

OpenSKY

It is possible that the four slot version uses a vocoder supported by mbelib. The two slot version does not.

Supported demodulation optimizations in version 1.6:

C4FM

Continuous envelope 2 or 4 level FSK with relatively sharp transitions between symbols. Used by most P25 systems.

Optimizations include calibrating decision points only during sync, 4/10 sample window per symbol, and symbol edge timing calibration.

GFSK

Continuous envelope 2 or 4 level FSK with a narrower Gaussian/"raised cosine" filter that affects transitions between symbols. Used by DMR/MOTOTRBO, NXDN and many others. Noisy C4FM signals may be detected as GFSK

but this is ok, the optimization changes will help with noisy signals.

Optimizations are similar to C4FM except symbol transitions are only kept out of the middle 4 samples and only the middle two samples are used.

QPSK

Quadrature Phase Shift Keying (and variants) used in some P25 systems and all known X2-TDMA systems. May be advertised under the marketing term "LSM"

Optimizations include continuous decision point calibration, using middle two samples, and using the symbol midpoint "spike" for symbol timing.

Installation

DSD should easily compile on any Linux or *BSD system with gcc. There are some debugging/development options in config.h that normal users will want to leave disabled as they can severely impact performance.

Requirements

  • cmake
  • mbelib
  • sndfile

Example building instructions on Ubuntu:

sudo apt-get update
sudo apt-get install git make cmake # Update packages
git clone <URL of git repository>   # Something like: git@github.com:USERNAME/dsd.git
cd dsd                              # Move into source folder
mkdir build                         # Create build directory
cd build                            # Move to build directory
cmake ..                            # Create Makefile for current system
make                                # Compiles DSD
sudo make install                   # Installs DSD to the system

Operation

There are two main operating modes, "Live scanner" and "Play files"

Usage: dsd [options]            Live scanner mode

Live Scanner mode takes 48KHz/16 bit mono audio samples from a sound card input and decodes speech in real time. Options are provided for controling information display and saving mbe data files.

The synthesized speech can be output to a soundcard and/or a .wav file.

Usage:  dsd [options] -r <files> Read/Play saved mbe data from file(s)

Play files mode reads mbe data from files specified on the command line (including wildcards) and synthesizes speech from those files. The synthesized speech can be output to a soundcard and/or a .wav file. The -r command line options is used to activate Play files mode.

Display modes

There are two main display modes in Live scanner mode. "Errorbars" and "Datascope".

Errorbars mode output for P25 Phase 1 looks like this:

Sync:  -P25p1   mod: C4FM inlvl: 39% nac:  5C2 src:        0 tg: 32464  TDULC
Sync:  -P25p1   mod: C4FM inlvl: 39% nac:  5C2 src:        0 tg: 32464  TDULC
Sync:  -P25p1   mod: C4FM inlvl: 39% nac:  5C2 src:        0 tg: 32464  TDULC
Sync:  -P25p1   mod: C4FM inlvl: 39% nac:  5C2 src:        0 tg: 32464  TDULC
Sync:  -P25p1   mod: C4FM inlvl: 38% nac:  5C2 src:        0 tg: 32464  TDU
Sync:  -P25p1   mod: C4FM inlvl: 38% nac:  5C2 src:        0 tg: 32464  HDU
Sync:  -P25p1   mod: C4FM inlvl: 42% nac:  5C2 src:        0 tg: 32464  LDU1  e:
Sync: (-P25p1)  mod: C4FM inlvl: 39% nac:  5C2 src:    52610 tg: 32464 (LDU2) e:
Sync:  -P25p1   mod: C4FM inlvl: 38% nac:  5C2 src:    52610 tg: 32464  LDU1  e:
Sync:  -P25p1   mod: C4FM inlvl: 39% nac:  5C2 src:    52610 tg: 32464  LDU2  e:
Sync:  -P25p1   mod: C4FM inlvl: 39% nac:  5C2 src:    52610 tg: 32464  LDU1  e:
Sync:  -P25p1   mod: C4FM inlvl: 39% nac:  5C2 src:    52610 tg: 32464  LDU2  e:
Sync:  -P25p1   mod: C4FM inlvl: 39% nac:  5C2 src:    52610 tg: 32464  LDU1  e:
  • "Sync" indicates the frame type detected and whether the polarity is positive or negative. DSD automatically detects and handles either polarity except for DMR/MOTOTRBO/X2-TDMA which unfortunatley use both sync polarities.

  • Most combinations of transmitter, receiver and soundcard show netagive (-) polarity for X2-TDMA signals and (+) polarity for DMR/MOTOTRBO so those are the defaults.

    • You may need to use the -x option to select non-inverted polarity if you are not getting usable X2-TDMA/MOTOTRBO/DMR speech. As they use both normal and inverted sync it is not possible to detect polariy automatically.
  • "mod" indicates the current demodulation optimizations.

  • "inlvl" indicates the audio input level. QPSK signals tend to appear much "wider" than C4FM from a discriminator tap so it is important to set your input gain using a QPSK signal if you plan to montir them. It is not necessary nor desirable to get to 100%, in fact your sound card may max out below 100%. It is best to use the Datascope mode for setting input gain (see below). Typical values with good results are 40% for C4FM and 66% for QPSK.

  • "nac" is the P25 Phase 1 Network Access Code. This is a 12 bit field in each P25 Phase 1 header. It should not be confused with the 16 bit System ID used in non-P25 trunking control channels.

  • "src" is the radio id of the trasmitting subscriber unit.

  • "tg" is the talkgroup derived from link control information.

  • "HDU/LDU1/LDU2/TDU/TDULC" are P25 Phase 1 frame types, referred to as frame subtype within DSD.

  • "e:" is the beginning of the errorbars display. Each "=" indicates a detected error within the voice data. "R" and "M" indicat that a voice frame was repeated or muted due to excessive errors.

  • Values in parentheses () indicate an assumption (soft decision) was made based on the previous frame.

Errorbars mode output for X2-TDMA looks like this:

Sync:  -X2-TDMA  mod: QPSK inlvl: 59% src:    17211 tg:   197 [SLOT0]  slot1   VOICE e:
Sync:  -X2-TDMA  mod: QPSK inlvl: 47% src:    17211 tg:   197 [SLOT0]  slot1   VOICE e:
Sync:  -X2-TDMA  mod: QPSK inlvl: 43% src:    17211 tg:   197 [SLOT0]  slot1   VOICE e:
Sync: (-X2-TDMA) mod: QPSK inlvl: 28% src:    17211 tg:   197 [SLOT0]  slot1   VOICE e:

DMR/MOTOTRBO display is similar except it does not yet show source and talkgroup information.

As of version 1.2 DSD shows which specific TDMA slots are active (with capital SLOT letters) and which slot is currently being monitored (with square brackets []. Noisy/degraded signals will affect the accuracy of this display.

The frame subtypes (Voice/LC etc) are shown based on the DMR standard types.

Datascope mode output looks like this:

Demod mode:     C4FM                Nac:                      8C3
Frame Type:     P25 Phase 1         Talkgroup:              16528
Frame Subtype:  LDU1                Source:                     0
TDMA activity:   slot0   slot1      Voice errors:
+----------------------------------------------------------------+
|                   #    ^      !|      ^   #                    |
|                    *           |          *                    |
|                    *           |          *                    |
|                    *           |  *       *                    |
|                    *      *    |  *       *                    |
|                    *      *    |  **      *                    |
|                    *      **   |  **      *                    |
|                   **      **   |  **      *                    |
|                   **      **   |  **      *                    |
|                   **      **   |  **      *                    |
+----------------------------------------------------------------+
                          C4FM Example
Demod mode:     C4FM                Nac:                      126
Frame Type:     P25 Phase 1         Talkgroup:              25283
Frame Subtype:  LDU2                Source:                     0
TDMA activity:   slot0   slot1      Voice errors:
+----------------------------------------------------------------+
|            #      ^            !            ^       #          |
|                          *     |                               |
|                          *     |                               |
|                          **    |                               |
|                          **    |                    *          |
|            *             **    |    *               *          |
|            **            **    |    *               *          |
|            ***           **    |    **              *          |
|            ***           **    |    ***             *          |
|            ***          ****   |   ****           * *          |
+----------------------------------------------------------------+
                          QPSK Example

At the top is various information about the signal, similar to the information provided in Errorbars mode. The large box is similar to a spectrum analyzer viewing the channel bandwidth.

The horizontal axis is the input audio level, minimum on the left and maximum on the right. The vertical axis is the number of samples seend at each audio level.

The "*" symbols represent the number of audio samples that were at each level during the aggregation period. (default = 36 symbols) The -S options controls the aggregation period as well as the QPSK tracking symbol buffer, so changing that will affect QPSK performance as well as the Datascope display.

As you can see from the figures above, clean C4FM signals tend to have four very sharply defined audio levels. The datascope pattern also tends to be faily stable with minor shifts left and right as the receiver tries to frequency track any DC offset.

QPSK signals on the other hand tend to appear much broader (and artifact of how they are distored by FM PLL discriminators). They also tend to vary wildly in width and centering. This is especially true when monitoring simulcast systems. Muliple QPSK signals interfere much more dramatically with an FM discriminator than C4FM signals.

For this reason it is important to isolate your receiver to one
transmitter tower, _especially_ for QPSK signals.

The "#" symbols indicate the detected min/max values that are used
to calibrate the symbol decision points. These are indicated by
"!" for the center decision point and "^" for the mid decision points.

Display Options

There are several options to control the type and quantity of information displayed in Errorbars mode:

-e             Show Frame Info and errorbars (default)
-pe            Show P25 encryption sync bits
-pl            Show P25 link control bits
-ps            Show P25 status bits and low speed data
-pt            Show P25 talkgroup info
-q             Don't show Frame Info/errorbars
-s             Datascope (disables other display options)
-t             Show symbol timing during sync
-v <num>       Frame information Verbosity
-z <num>       Frame rate for datascope

Most of these options are self explanitory. Symbol timing is a noisy option that allows you to view the quality of the frame sync samples and accuracy of the symbol timing adjustments.

Symbol Timing display looks like this:

Symbol Timing:
----------
----------
----------
----------
----------
-+++++++++ 1
+---------- 0
----------
++++++++++ 0
++++++++++
---------- 0
----------
++++++++++ 0
++++++++++
++++++++++
++++++++++
---------- 0
++++++++++ 0
---------- 0
++++++++++ 0
++++++++++
++++++++++
++++++++++
++++++++++
C4FM example
Symbol Timing:
+---------
----------
----------
----------
-----X---- 5
--+++O++++- 4
----------
----X----- 4
++++O++--- 4
--++O++++- 4
----X----- 4
----------
++++O+++-- 4
-+++O+++-- 4
--++O+++-- 4
--++O+++-- 4
----------
++++O++++- 4
----------
++++O+++-- 4
-+++O++++- 4
-+++O+++++ 4
-+++O++--- 4
--++O+++-- 4
QPSK example

Symbol timing is only displayed for symbols during the frame sync period. Each horizontal line represents the 10 audio samples for each symbol. "-" indicates an audio sample below the center reference level and "+" represents a sample above center. "X" indicates a low spike below a reference threshold (reference minimum for C4FM and 80% of reference minimum for QPSK). "O" represents a high spike above the high reference threshold. The numbers to the right indicate which sample position the targeted transition occurred (+/- for C4FM or spike high/low for QPSK). The number of audio samples for the next symbol are adjusted to get this value closer to the target (0 for C4FM and 4 for QPSK). This shows how DSD maintains accurate symbol timing. Symbol timing adjustments are only made during sync, which is the only time reliable transitions can be observed.

In both examples above the symbol timing was off by one sample at the beginning of the frame sync period and was adjusted. Generally if you see any spike values "X/O" in C4FM mode, or lots of them in QPSK mode it indicates noise on the input signal.

Input/Output Options

-i <device/file> Audio input device/file (default is /dev/audio)
-o <device>      Audio output device (default is /dev/audio)
-d <dir>         Create mbe data files, use this directory
-r <files>       Read/Play saved mbe data from file(s)
-g <num>         Audio output gain (default = 0 = auto)
-n               Do not send synthesized speech to audio output device
-w <file>        Output synthesized speech to a .wav file

The audio in device can be a sound card OR a .wav file if the file is in the exact format 48k/16bits/mono/pcm. Audio in should be an unfilterd discriminator tap signal.

The audio out device should be a sound card (use the -w options to output to a .wav file).

If the audio in device is the same as the audio out device, the synthesized speech has to be upsampled to the 48k sample rate required for input. A fast upsample function is provided but still leaves some artifacts.

The best sound and minimum cpu usage is achieved with separate sound
cards for input and output

If you specify different input/output devices DSD will use 8k as the output sample rate and the lack of resampling results in much better audio as well as lowe cpu consumption.

If you are using onboard "AC97" sound device you may find that DSD uses much more cpu than expected, in some cases more than is available. This is because many AC97 sound devices are designed to rely on CPU processing power instead of hardware. You may also find that 8k sample rate output is upsampled in the driver using a very basic algorithim resulting in severe distortion. The solution is to use a real hardware sound device (pci card, usb device etc).

As of version 1.2 DSD now automatically levels the output audio. This greately improves readability and eliminates the painful effects of noise bursts. You can specify a fixed audio output gain with the -g option.

Scanner control options:

-B <num>       Serial port baud rate (default=115200)
-C <device>    Serial port for scanner control (default=/dev/ttyUSB0)
-R <num>      Resume scan after <num> TDULC frames or any PDU or TSDU

On some P25 systems Packet Data Units (PDU) are sent on the same frequencies used for voice traffic. If done constantly this can be a severe hinderance to scanning the system in conventional mode. The -R option enables sending a "resume scan" command to a scanner connected to a serial port. Use -B and -C to set the baud rate and serial port device if necessary.

Decoder options

-fa           Auto-detect frame type (default)
-f1           Decode only P25 Phase 1
-fd           Decode only D-STAR*
-fi           Decode only NXDN48* (6.25 kHz) / IDAS*
-fn           Decode only NXDN96 (12.5 kHz)
-fp           Decode only ProVoice*
-fr           Decode only DMR/MOTOTRBO
-fx           Decode only X2-TDMA
-l            Disable Filters (not recommended)
-ma           Auto-select modulation optimizations (default)
-mc           Use only C4FM modulation optimizations
-mg           Use only GFSK modulation optimizations
-mq           Use only QPSK modulation optimizations
-pu           Unmute Encrypted P25
-u <num>      Unvoiced speech quality (default=3)
-xx           Expect non-inverted X2-TDMA signal
-xr           Expect inverted DMR/MOTOTRBO signal

* denotes frame types that cannot be auto-detected.

ProVoice and NXDN48 not auto-detected as use different symbol rates (9600 and 2400) than most formats (4800).

MBE speech synthesis is broken down into two main types of sounds, "Voiced" and "Unvoiced". Voiced speech bands are synthesized with a single sine wave centered in the frequency band with the appropriate phase and amplitude.

Unvoiced speech is supposed to be generated with a noise source, 256 point DFT a number of band filters, followed by a 256 point inverse DFT. For computational simplicity mbelib uses a different method. For each unvoiced speech band, a number of sine waves are generated, each with a different random initial phase. The number of waves used per band is controlled by the -u option. A setting of 4 would approximate the performance of the 256 point DFT method as the maximum number of voice bands is 56, and very low frequencies are not synthesized. Values less than 3 have a noticable lack of unvoiced speech and/or artifacts. The defualt of 3 provides good speech quality with reasonable cpu use. Increasing the quality above the default rapidly consumes more CPU for increasingly diminishing returns.

Advanced decoder options

-A <num>      QPSK modulation auto detection threshold (default=26)
-S <num>      Symbol buffer size for QPSK decision point tracking
            (default=36)
-M <num>      Min/Max buffer size for QPSK decision point tracking
            (default=15)

Encryption

Decryption of speech is NOT supported, even if you lawfully posess the encryption keys. Decryption support will not be added in the future as the authors wish to steer as far away from the legal issues associated with encryption as possible.

We realize that there are many legitemate and lawful uses of decryption
software including system/interoperability testing and lawful monitoring.
This software is distributed under a liberal BSD license so there is
nothing to stop others from supplying patches, forking this project or
incorporating it into a commercial product and adding decryption support.

There is support for displaying the encryption sync bits transmitted in
the clear on P25 Phase 1 systems.  These bits do not allow for the
decryption of signals without the secret encryption keys.  The
encryption sync bits are useful for determining whether a signal is
encrypted vs merely noisy or degraded.  As the encryption sync bits
typically include long strings of zeros when a transmission is not
encrypted they can also be used to visually estimate bit error rates.