discuss-gnuradio
[Top][All Lists]
Advanced

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

Re: [Discuss-gnuradio] VrFSKDemod


From: Eric Blossom
Subject: Re: [Discuss-gnuradio] VrFSKDemod
Date: Sun, 11 Jan 2004 23:33:06 -0800
User-agent: Mutt/1.4.1i

On Sun, Jan 11, 2004 at 09:50:51PM -0700, address@hidden wrote:
> 
> 
> I'm trying to piece together everything necessary to decode a 9600bps EDACS
> trunked radio control channel.

Sounds like a good GNU Radio application...

> The data is 2 level FSK.  I found the needs-work/VrFSKDemod.h.  How much work
> does this need and/or is there a suitable alternative elsewhere?
>
> Attempting to use it gets complaints that VrSigProc is not a template class--
> rightly so as it is not.  Any suggestions?
> 

It was written for what looks like a very early version of the SPECTRA
system.  All the glue is different, which wouldn't be too much of
problem to fix (take a look at the stuff in src/gnu/lib/dtv for a wide
variety of examples), but I'm not even sure that the demod technique
is robust.

You may want to start by taking a look a communication theory book,
and code a couple of things up.  It's a great way to learn, and when
you're done, we'll all be able to take advantage of your new FSK
demodulator.

... I just took a look at "Contemporary Communcation Systems using
MATLAB" (ISBN 0-534-37173-6).  On page 318, they recommend a
non-coherent demodulator for M-ary FSK.

It goes like this...

  Instead, we consider a method for demodulation and detection that
does not require knowledge fo the carrier phases.  The demodulation
may be accomplished as shown in Figure 7.27.  In this case, there are
two correlators per signal waveform, or a total of 2M correlators in
general.  The received signal is correlated with the basis functions
(quadrature carriers)

   sqrt(2/T) * cos (2*pi*Fc*t + 2*pi*m*deltaF*t) and
   sqrt(2/T) * sin (2*pi*Fc*t + 2*pi*m*deltaF*t) for m = 0,1, ... M-1.

[Translation: For each frequency they're trying to detect, they're
 multiplying the received signal by the sin and cosine of each.
 That's what the m*deltaF term is.  Then they integrate (read: add up)
 the result of each multiplication over a time period equal to the
 expected symbol time.   They then feed that into a envelope detector:
 sqrt (x*x + y*y).  The correlator with the largest envelope is the
 value.]


For the binary case with a center freq F and deviation deltaF it looks
like this:


          +--- * cos (F-deltaF/2) --- integrator ---|-----------|
          |                                         | x*x + y*y |---- env 0
          +--- * sin (F-deltaF/2) --- integrator ---|-----------|
          |   
signal -- +        
          |
          +--- * cos (F+deltaF/2) --- integrator ---|-----------|
          |                                         | x*x + y*y |--- env 1
          +--- * sin (F+deltaF/2) --- integrator ---|-----------|


The cos and sin blocks are called gr_nco in GNU Radio.  

This doesn't handle some real problems such as ensuring that you're
sampling the integrator at the middle of a bit...

Eric




reply via email to

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