General principle: In GNU Radio you cannot ever have a flow graph with a loop in it. If you wish to have feedback of some kind, it must be implemented in a single block.
(There are many existing blocks that do this, such as AGC blocks and IIR filter blocks, and classes to help create them, though they still require writing C++ code.)
However, you do not need feedback to implement a FM demodulator. The key block to FM demodulation in GNU Radio is the Quadrature Demod (gnuradio.analog.quadrature_demod_cf
) block. This block takes in a complex signal and outputs the phase difference — or instantaneous frequency — of every successive pair of samples, which is exactly the core of FM demodulation.
Besides the Quadrature Demod block, you will want
- A low-pass filter on the input, as with any demodulator.
- A suitable FM de-emphasis filter (provided in the FM Deemphasis block).
- Optionally a DC blocking filter, because if the input signal is not centered at 0 there will be a corresponding DC offset in the output audio, which will create clicks at start/stop if minor or clipping of the audio if severe.