Quadrature Demod

The Quadrature Demod block accepts a stream of complex samples, such as the narrow baseband stream containing the desired signal, and produces a stream of floats that represent a frequency demodulation. This block is most useful in demodulating FM, FSK, GMSK, and similar modulations that carry information through changes in frequency.

This block does not support C++ output, so it cannot be used when the output language of a flowgraph in GRC is C++.

Mathematical Description
The output of the block is the signal frequency in relation to the sample rate, multiplied with the gain. It produces this by calculating the product of the one-sample delayed-&-conjugated input and the undelayed signal, and then calculates the argument (a.k.a. angle, in radians) of the resulting complex number:

$$y[n] = \mathrm{arg}\left(x[n] \, \bar x [n-1]\right)$$

Let x be a complex sinusoid with amplitude A>0, (absolute) frequency $$f\in\mathbb R$$ and phase $$\phi_0\in[0;2\pi]$$ sampled at f_s>0 so, without loss of generality,

$$x[n]= A e^{j2\pi( \frac f{f_s} n + \phi_0)}$$

then

$$y[n] = \mathrm{arg}\left(A e^{j2\pi\left( \frac f{f_s} n + \phi_0\right)} \overline{A e^{j2\pi( \frac f{f_s} (n-1) + \phi_0)}}\right)\ $$

$$ = \mathrm{arg}\left(A^2 e^{j2\pi\left( \frac f{f_s} n + \phi_0\right)} e^{-j2\pi( \frac f{f_s} (n-1) + \phi_0)}\right)\ $$

$$ = \mathrm{arg}\left( A^2 e^{j2\pi\left( \frac f{f_s} n + \phi_0 - \frac f{f_s} (n-1) - \phi_0\right)}\right)\ = \mathrm{arg}\left( A^2 e^{j2\pi\left( \frac f{f_s} n - \frac f{f_s} (n-1)\right)}\right)\ $$

$$ = \mathrm{arg}\left( A^2 e^{j2\pi\left( \frac f{f_s} \left(n-(n-1)\right)\right)}\right)\ $$

$$ = \mathrm{arg}\left( A^2 e^{j2\pi \frac f{f_s}}\right) $$

$$A$$ is real, and so is $$A^2$$, and hence only scales, therefore $$\mathrm{arg}(\cdot)$$ is invariant: = arg $$\left( e^{j2 \pi \frac{f}{f_s}} \right) = \frac{f}{f_s}$$

Parameters

 * Gain
 * Gain setting to adjust the output amplitude. Set based on converting the phase difference between samples to a nominal output value. Default: "samp_rate/(2*math.pi*fsk_deviation_hz)".

Example Flowgraph
This flowgraph shows the Quadrature Demod block as a Frequency Shift Keying detector. First, the Frequency Xlating FIR Filter acts as a channelizer, extracting a narrow baseband signal from a wider stream. The Squelch block only passes samples that exceed a given threshold, thus culling periods of time when no signal is detected. Then the Quadrature Demod block returns floats that are >1 if the upper frequency is louder, 0 if they are equal, and <0 if the lower frequency is louder, thus demodulating FSK. In this scenario, if fsk_deviation is defined as the difference between the upper and lower frequencies, and the baseband sampling rate is known (after the decimating from the Freq Xlating FIR Filter block), then a good formula for the gain parameter would be working_samp_rate / (math.pi * fsk_deviation). This causes the block to produce output floats that will never have a magnitude greater than 1.0.



This flowgraph shows BFSK signal recovery using Quadrature Demod block



Transmitted and received bits using above example



Source Files

 * C++ files
 * quadrature_demod_cf_impl.cc


 * Header files
 * quadrature_demod_cf_impl.h


 * Public header files
 * quadrature_demod_cf.h


 * Block definition
 * analog_quadrature_demod_cf.block.yml