Decoding CPFSK

I’m trying to use GNURadio to decode a bit-stream from an FM signal and
could do with some help.

  1. Having removed the narrowband-FM modulation from the signal, I’m left
    with the following.

  2. 1200Hz/1800Hz continuous-phase FSK encoding 1200 bits per second.
    i.e. each output bit is either 1 cycle of a 1200Hz wave (1-bit) or 1.5
    cycles of an 1800Hz wave (0-bit). The start of each bit is at a
    zero-crossing (although there are obviously zero-crossings which aren’t
    the start of a bit).

  3. I then need to extract the data in bytes from the bit stream (1 start
    bit, 8 data bits, 1 stop bit, no parity bits per byte).

I’ve done step 1 (using a scanner for now - although one day I may use a
USRP for this). I’m struggling with step 2. Does GNURadio have a block
(or blocks) for doing this? Step 3 is trivial. The only reason I
mention it is because I believe steps 2 & 3 together are a fairly common
method of encoding digital data for radio transmission - and therefore
there might be a single block that does steps 2 & 3 in a single go.

Andrew

Andrew R. wrote:

  1. 1200Hz/1800Hz continuous-phase FSK encoding 1200 bits per second.
    i.e. each output bit is either 1 cycle of a 1200Hz wave (1-bit) or 1.5
    cycles of an 1800Hz wave (0-bit). The start of each bit is at a
    zero-crossing (although there are obviously zero-crossings which aren’t
    the start of a bit).

What you are describing is called Mean Shift Keying. It is a
specialized form of FSK that is designed to have more efficient
bandwidth utilization. I would guess that you could use the
Gaussian Mean Shift Keying (GMSK) demodulator, or construct
your own using a quadrature demodulator and a root-rased-cosine
filter.

@(^.^)@ Ed

Andrew R. wrote:

  1. 1200Hz/1800Hz continuous-phase FSK encoding 1200 bits per second.
    i.e. each output bit is either 1 cycle of a 1200Hz wave (1-bit) or 1.5
    cycles of an 1800Hz wave (0-bit). The start of each bit is at a
    zero-crossing (although there are obviously zero-crossings which aren’t
    the start of a bit).

This modulation is known as Fast-Frequency-Shift-Keying (FFSK) or more
accurately as Minimum Shift Keying (MSK).

A nice description of the algorithm is contained in a 1990 masters
thesis by Tim Wescott:

http://www.wescottdesign.com/articles/MSK/mskTop.html

The decoder in that project was written for a DSP chip, but you should
be able follow the theory enough to figure out the right signal chain in
GNU Radio. Since you’re using the audio output of a scanner, you’ll be
doing something slightly different, as the typical way to decode FFSK
starts with the complex baseband, and doesn’t use FM demodulation.

FFSK is a popular modem for low speed bursty data, and is very commonly
used in public safety transmitter identification. That “braap” you hear
at the start or end of many police and fire radio transmissions is
usually an FFSK modulated burst of the radio serial number. Some
ambulance rigs have a set of push-buttons for the driver to indicate
they have arrived, or are driving with lights and sirens, or other
status updates, and these go out over a channel as FFSK bursts.

Another source of documentation for this protocol are the various
chipsets used in the above radios. You’ll get far more hits Googling
for FFSK than for MSK, though, as FFSK is the “marketing” name while MSK
is the more accurate term.

When you get this working, we’d love to incorporate it as a standard
block or hierarchical block in GNU Radio, if you’re willing.


Johnathan C.
Corgan Enterprises LLC
http://corganenterprises.com

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs