Wednesday, October 31, 2018

Decoding STANAG 4285 using KiwiSDR and GNURadio

Below are some examples of STANAG 4285 signals on shortwave picked up by a KiwiSDR located in Scandinavia. These signals were decoded live using the new KiwiSDR GNURadio block gr-kiwisdr, see this blog post, and another GNURadio block I started to work on, called gr-digitalhf:
  • gr-digitalhf contains an adaptive decision feedback equalizer (DFE) and a local oscillator for Doppler correction, implemented in C++. These are separated from the description of the physical layer (synch preamble, frame format, constellation, ...) which is provided in Python. You may have a look at the description of STANAG 4285 here which is an almost literal translation of the standard document.
  • The DFE unscrambles a given symbol, computes a hard decision using the constellation valid for the unscrambled symbol, and then uses the scrambled symbol from the hard decision for computing the error. For this it only needs to have (1) an estimate of the Doppler (=frequency offset) correction and it needs to know (2) if a given symbol is known or unknown. Both, (1) and (2) are provided by the description of the physical layer in Python.
  • Currently the implementation is limited to providing soft decisions. The two final steps, deinterleaving and convolutional decoding, are still missing.
The aim of gr-digitalhf is to make it easy to adapt it to other digital modes based on N-ary PSK/QAM modulation which have a more complicated physical layer compared to STANAG 4285, like, e.g., MIL-STD-188-110A.

STANAG 4285 signal (BPSK unscrambled data, 600 baud) with severe multi-path.
Another STANAG 4285 signal (BPSK unscrambled data, 600 baud)
An example of a 1200 baud STANAG 4285 signal (QPSK unscrambled data)

No comments: