[time-nuts] Software Defined MSF and DCF Receiver

Iain Young iain at g7iii.net
Sun May 18 10:33:06 EDT 2014


Hi Folks,

While not exactly nanosecond class, I thought at least some of you
might be interested in my latest experiments with writing a MSF and
DCF decoder in SDR (gnuradio in this case)

The gnuradio flowgraph is shown here:

http://hal.g7iii.net/GRC/Radio_Clocks/Multi_Radio_Clock_Receiver.png

(The GRC file itself is also there for those who wish to play with it
in the gnuradio companion, along with some prototypes)

This tunes to 250Hz off the carrier, and uses a Goertzel filter at
250Hz to detect it. We then do a Complex to Mag^2 to effectively
get rid of any negative values, before a threshold block essentially
converts the signal to a square wave (via a moving average to help
with interference and noise, as well as general signal level changes
throughout the day]

The eventual output is a 1 kHz stream of 1s and 0's, sent via UDP
(You will notice the significance of the port numbers selected
- 12360 and 12377 in the flowgraph :)].

A separate application (currently using nc and stdin/stdout) looks for
the Start of Minute marker, then grabs the rest of the second's data.
Once completed it decodes[1] it, and sends it on to NTP via the SHM
driver.

This code is currently running on the same machine, but could be run
on any capable UDP host. I intend to try it on a beaglebone[2], and see
what the difference is.

Now, I was expecting some pretty awful jitter etc, but have been rather
surprised. Here are a few random ntpq outputs taken over a few hours
(nothing scientific):

ntpq> pe
      remote           refid      st t when poll reach   delay   offset
  jitter
==============================================================================
  SHM(0)          .MSF.            0 l    7   64  377    0.000    6.622
   0.859
  SHM(1)          .DCF.            0 l    6   64  377    0.000   -3.321
   0.900
*cerberus.local  192.36.143.153   2 u   15   64  377    0.061   -0.265
  0.347

ntpq> pe
      remote           refid      st t when poll reach   delay   offset
  jitter
==============================================================================
  SHM(0)          .MSF.            0 l   13   64  377    0.000    6.932
   0.193
  SHM(1)          .DCF.            0 l   12   64  277    0.000   -2.913
   0.107
*cerberus.local  192.36.143.153   2 u  255  256  377    0.099    0.606
  2.365

ntpq> pe
      remote           refid      st t when poll reach   delay   offset
  jitter
==============================================================================
  SHM(0)          .MSF.            0 l   10   64  377    0.000    7.062
   0.146
  SHM(1)          .DCF.            0 l    9   64  325    0.000    7.193
   3.888
*cerberus.local  192.36.143.153   2 u  174  256  377    0.099    0.606
  4.162

Both radio clocks were set to noselect. cerberus was serving as a
reference, and was talking to a cesium over the internet, but for
this experiment was more than sufficient.

The jitter and offset figures are far better than I had been expecting,
and more than sufficient for numbering the seconds and Time-Of-Day,
before a PPS source takes over (See [2]). They are also far better
than I had been getting from one of the available modules


For anyone wanting to try this, the hardware was simply my LF
Antenna/Preamp [which primarily does LORAN duty, but has a 4 way
splitter on the end], plugged into my 192k soundcard.

Those in UK/Europe may get by with a long wire (I haven't tried
it yet - my own has other duties right now), but I could audibly still
detect MSF with it when I did a quick check]


If HF ever recovers here, I shall have a go at detecting and decoding
the MIKES IRIG station in Finland on 25 MHz. I'm also trying to
write a flowgraph for RBU, but that it proving a challenge (it uses
100Hz and 312.5 Hz tones to indicate 0 and 1 in the time code,
but even with SDR techniques it's difficult to separate the two, not
to mention it's far less powerful and further away than both MSF and
DCF from me.


Iain

[1] At present, this code is a lash up. It doesn't check for leap
seconds, will break come the 3rd weekend in October here in Europe,
and doesn't check Parity. That said, the decoding is so solid for
me, that even when (usually the DCF side) decodes things incorrectly
it's so far out, NTP just laughs at it. I'm lazy. The RF code was far
more interesting to write than "is this bit set, is that bit set ?" :)

[2] Said beaglebone currently has a PPS input from an Austron 2100
locked to Anthorn, but needs an internet host to set the time-of-day


More information about the time-nuts mailing list