Forum: GNU Radio FM demodulation of a real signal

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
635b8cf1ca106f565815ca16ccc438ae?d=identicon&s=25 Matteo Campanella (Guest)
on 2006-04-05 15:48
(Received via mailing list)
Hello, I am quite stuck at a problem, that is, how to demodulate a FM
signal that is NOT in complex form using existing gnuradio blocks. The
quadrature demodulator works only with complex input; I have tried to
build an analytic signal out of my real one, but the result of the
demodulation is then quite poor.

Any suggestions?
Matteo
3719f4fea703e38bcbf8de6fe6bcdf55?d=identicon&s=25 Martin Dvh (Guest)
on 2006-04-05 17:35
(Received via mailing list)
Matteo Campanella wrote:
> Hello, I am quite stuck at a problem, that is, how to demodulate a FM
> signal that is NOT in complex form using existing gnuradio blocks. The
> quadrature demodulator works only with complex input; I have tried to
> build an analytic signal out of my real one, but the result of the
> demodulation is then quite poor.
How did you try to "build an analytic signal out of my real one".
The easiest way of doing that is to use gr.hilbert_fc (numberoftaps)
The numberoftaps in combination with the samplerate determines the
lowest frequency for which the hilbert transform is accurate.
(The higher the number, the more accurate the transform)
Try and experiment with the numberoftaps value.
Most of the time a value like 256 will do.

You can also try to use the usrp_wfm_pll.py example.
This one uses a pll to recover the frequency modulation which should
perform much better with a real source.

The pll it uses is gr.pll_freqdet_cf
You could build a gr.gr_pll_freqdet_ff block to go straight from real
data to frequency detection.

(You can look in the old code atsc/GrAtscFPLL.cc
This is the PLL which was used for atsc demodulation. It works with real
input data.)
Greetings,
Martin
635b8cf1ca106f565815ca16ccc438ae?d=identicon&s=25 Matteo Campanella (Guest)
on 2006-04-05 17:51
(Received via mailing list)
I have tried building the analytic by hilbert, but I think that, because
of the many near DC components of the signal, I do not get a nice
quadrature demod output...I will try with a pll, thanks for the
suggestion!

MC
745d8202ef5a58c1058d0e5395a78f9c?d=identicon&s=25 Eric Blossom (Guest)
on 2006-04-05 19:35
(Received via mailing list)
On Wed, Apr 05, 2006 at 03:44:59PM +0200, Matteo Campanella wrote:
> Hello, I am quite stuck at a problem, that is, how to demodulate a FM
> signal that is NOT in complex form using existing gnuradio blocks. The
> quadrature demodulator works only with complex input; I have tried to
> build an analytic signal out of my real one, but the result of the
> demodulation is then quite poor.
>
> Any suggestions?
> Matteo

Is your real signal at a non-zero IF?

If so, just multiply by a complex sinusoid to translate to baseband,
then use existing code path.  We come from the complex is simple
school of signal processing...
Ce36ad4142338c14c9b260303e847f71?d=identicon&s=25 Robert McGwier (Guest)
on 2006-04-05 22:57
(Received via mailing list)
It will not be possible to recover the signal if the real signal is at
zero IF (and predetection) so we will assume that it is not at zero.

The simplest possible FM detector is a zero crossing counter.  That is,
you output a signal that is proportional to the distance between zero
crossings.  After filtration,  this will provide a usable FM detection.
It works much better if you do a  bandpass filter first, count distance
between zero crossings and then lpf the "distance" signals.  The zero
crossing should not be the number of samples.

Given a sample N and N+1 where we have a zero crossing between,  one can
do

(S(N+1)-S(N))
---------------     = slope
           1

is the slope and the zero crossing then is the solution to:


slope*Xnew + S(n) = 0

or

Xnew = - S(n)/slope.   Where we have decided to find the place where the
connecting line crosses.

Xnew - Xold is the zero crossing distance and is output as the detected
FM.

now set

Xold = Xnew and go do it again.

Bob


Eric Blossom wrote:
>>
>
> Is your real signal at a non-zero IF?
>
> If so, just multiply by a complex sinusoid to translate to baseband,
> then use existing code path.  We come from the complex is simple
> school of signal processing...
>
>
>


--
AMSAT VP Engineering. Member: ARRL, AMSAT-DL, TAPR, Packrats,
NJQRP/AMQRP, QRP ARCI, QCWA, FRC. ARRL SDR Wrk Grp Chairman
Laziness is the number one inspiration for ingenuity.  Guilty as
charged!
This topic is locked and can not be replied to.