discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Discuss-gnuradio] Attempts at Receiving and Decoding MSF


From: Iain Young, G7III
Subject: [Discuss-gnuradio] Attempts at Receiving and Decoding MSF
Date: Sun, 05 May 2013 22:45:25 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130106 Thunderbird/17.0.2

Hi Folks,

I have been spent the last couple of days working on agnuradio
flowgraph to receive the  MSF Time Signal here in the UK on 60kHz,
using it as a learning experience.

I'm hoping that I can eventually use similar code to receive DCF and
also RBU, and the compare the results from my hardware decoders (Not
to mention an IRIG receiver as MIKES in Finland transmits IRIG-B, and
I can hear that on 25 MHz)

The approach I have taken thus far is to tune 1kHz OFF of 60, and use
a Goertzel filter tuned to 1kHz, before sending onto a probe, and
eventually onto a pipe which the other end connects to an external
program to identify the meaning of each 1 or 0, combine them, then
send the info onwards to NTP via the SHM driver.

(Future RBU and IRIG work is the reason to tune off by 1k, then use a
Goertzel filter, as RBU uses 100Hz and 312.5Hz tones to indicate 0 and 1
respectively, not carrier on/off, and IRIG-B modulates a 1kHz signal
AIUI)

There are screenshots at flowgraphs at the following URLs:

http://hal.g7iii.net/GRC/MSF_SDR/MSF_SDR_Screenshot.png
http://hal.g7iii.net/GRC/MSF_SDR/MSF_SDR.png
http://hal.g7iii.net/GRC/MSF_SDR/MSF_SDR.grc

The top left waterfall is the raw 192kHz from my FunCube Dongle Pro
Plus, centered on 150kHz. So MSF is -90kHz away, so I have a FIR
filter set at -59k (so MSF is at 1kHz in the pass band).

I follow the FIR filter with a quick re-sample to 200k purely to make
calculations as to how many samples cover 100ms or 200ms easy. I follow
the re-sampler by a BPF that actually works as a LPF with a high
cut off of 10kHz. The output of this can be seen in the lower
left waterfall

(Note, the multiply by Consts before the WXGUI waterfalls are purely
there to act as an amplifier to make seeing the signals easier!)

This is then followed by a tight BPF between 900 and 1100 Hz, before
being converted to real for the Goertzel filter, the output of
which can be seen in the top right waterfall)

In the bottom left, there is a FFT showing the same data,
but after it has been passed through a Complex to Mag^2 block, and
is the same as is fed to the Prob Avg Mag^2 block.

This gets picked up by the msf_carrier function probe, and the light_1k
checkbox gets set appropriately to indicate if the threshold has been
exceeded or not for visual status display and debug.

The Constant Source also references the light_1k variable, and is
converted to a float, and then a char for sending out to the pipe.


Now, I believe I am 80-90 % of the way there, I've had a few issues
with getting the right rate post the Goertzel filter, and deciding how
much of the processing should be done in gnuradio, and how much should
be done by an external program.

(EG do I increase the length of the Goertzel filter to get the binary
1s and 0s of the time code out of gnuradio, increasing the selectivity
or do I count the number of 1s and 0s samples in the external program)

The other big issue has been setting the threshold levels correctly, which has been frustrating to say the least :)


What I was wondering from those better versed in these things than I
was, is this the general approach they would take ? Or is there a better
way ? What would they do differently ?

(Yes the amount of Complex <-> Real conversions could probably be
reduced, but this is more early development and debug stage, and
certainly would be done once I have it working reliably.)


Best Regards

Iain



reply via email to

[Prev in Thread] Current Thread [Next in Thread]