M17 4FSK Modulator & Demodulator in C++ (GPL)
 
 
 
 
 
Go to file
Rob Riggs 4825a4f527 Small update to DeviationError. Add unit tests to CMake build. Add Golay24 implementation and tests. 2020-12-06 19:37:18 -06:00
tests Small update to DeviationError. Add unit tests to CMake build. Add Golay24 implementation and tests. 2020-12-06 19:37:18 -06:00
.gitignore add basic cmake build 2020-11-22 14:23:49 +01:00
CMakeLists.txt Small update to DeviationError. Add unit tests to CMake build. Add Golay24 implementation and tests. 2020-12-06 19:37:18 -06:00
CRC16.h Initial commit. 2020-11-19 21:57:02 -06:00
CarrierDetect.h Simplify CarrierDetect. 2020-11-30 18:52:12 -06:00
Convolution.h New Viterbi decoder -- no restriction on use. 2020-11-25 08:49:23 -06:00
DeviationError.h Small update to DeviationError. Add unit tests to CMake build. Add Golay24 implementation and tests. 2020-12-06 19:37:18 -06:00
ESG-upload.py Add a utility file used to upload files to an ESG-D series vector signal generator. 2020-11-30 21:34:28 -06:00
Filter.h Initial commit. 2020-11-19 21:57:02 -06:00
FirFilter.h Initial commit. 2020-11-19 21:57:02 -06:00
FrequencyError.h Improve frequency offset handling. 2020-11-25 22:11:29 -06:00
Fsk4Demod.h Improve frequency offset handling. 2020-11-25 22:11:29 -06:00
Golay24.h Small update to DeviationError. Add unit tests to CMake build. Add Golay24 implementation and tests. 2020-12-06 19:37:18 -06:00
IirFilter.h Initial commit. 2020-11-19 21:57:02 -06:00
LICENSE Initial commit 2020-11-19 21:39:50 -06:00
LinkSetupFrame.h Add missing include. 2020-11-22 16:45:28 -06:00
M17FrameDecoder.h LLR(4) decoding. Relax sync requirement during framing. Simplify decode state machine. 2020-11-30 20:43:33 -06:00
M17Framer.h Add missing include. 2020-12-02 09:17:38 -06:00
M17Randomizer.h LLR(4) decoding. Relax sync requirement during framing. Simplify decode state machine. 2020-11-30 20:43:33 -06:00
M17Synchronizer.h Initial commit. 2020-11-19 21:57:02 -06:00
PhaseEstimator.h Simplify PhaseEstimator. 2020-11-30 18:58:16 -06:00
PolynomialInterleaver.h Initial commit. 2020-11-19 21:57:02 -06:00
README.md Update README with correct (modern) CLI options. 2020-12-01 08:13:31 -06:00
SymbolEvm.h Clamp sample and compress EVM at extremes. 2020-11-30 18:59:43 -06:00
Trellis.h New Viterbi decoder -- no restriction on use. 2020-11-25 08:49:23 -06:00
Util.h Add support for LLR symbol decoding. 2020-11-30 19:02:02 -06:00
Viterbi.h Return minimum cost as BER from Viterbi. 2020-11-30 19:11:54 -06:00
m17-demod.cpp LLR(4) decoding. Relax sync requirement during framing. Simplify decode state machine. 2020-11-30 20:43:33 -06:00
m17-demod.h Initial commit. 2020-11-19 21:57:02 -06:00

README.md

m17-cxx-demod

M17 Demodulator in C++ (GPL)

This program reads a 48K SPS 16-bit, little-endian, single channel, M17 4-FSK baseband input stream from STDIN and writes a demodulated/decoded 8K SPS 16-bit, single channel audio stream to STDOUT.

Some diagnostic information is written to STDERR while the demodulator is running.

Build

This code requires the codec2-devel package be installed.

mkdir build
cd build
cmake ..
make
sudo make install

Running

This program was designed to be used with RTL-SDR, specifically rtl-fm.

rtl_fm -E offset -f 144.91M -s 48k | m17-demod | play -b 16 -r 8000 -c1 -t s16 -

Note that the oscillators on the PlutoSDR and on most RTL-SDR dongles are rather inaccurate. You will need to have both tuned to the same frequency, correcting for clock inaccuracies on one or both devices.

Also note that I need to use -E offset to decode the data well, even though I see this in the rtl_fm output:

WARNING: Failed to set offset tuning.

This was tested using the m17-gnuradio GNU Radio block feeding an Analog Devices ADALM Pluto SDR, modulating the m17.bin file from the m17-demodulator repo.

Notes

As of now, this is using the older versions of the sync word and LICH encoding. It is out of date with the current M17 spec.

Thanks

Thanks to the M17 team to for the great work on the spec.