# How to recover symbols from a 4-FSK signal received over the air?

I have an RTL-SDR dongle which is tuned to a carrier frequency in my area which corresponds to a P25 radio channel (506.7375MHz).

Using MATLAB's SDRRTLReceiver function, I sample the signal at 240KHz and collect 1 second worth of signal.

I can see the signal on the spectrum analyzer when the radio channel is active:

And for comparison when the radio is not transmitting:

But when I zoom in to the channel (which occupies a 12.5KHz bandwidth), I cannot see the peaks which correspond to the 4 frequencies used in the modulation (-1800, -600, +600, +1800):

Am I expected to see the peaks at this point?

I have tried using a larger FFT size for the spectrum analyzer, but it does not reveal the peaks. I have also tried averaging multiple spectra together to no avail.

Anyway, I continue with the time-domain signal and try to demodulate it.

I lowpass the signal to only keep my channel (lowpass 5KHz), and then run it through a polar discriminator which I understand (maybe incorrectly?) is supposed to give me the frequency states.

The signal is a stream of complex numbers, which I delay by one sample, take the conjugate of that, and then multiply with the non-delayed data. The arg (angle) of this resulting vector stream should correspond to the frequency state of the modulation.

When I plot that, I get the following:

But I think this is already incorrect.

What am I doing wrong? I know there are other ways to demodulate the FSK data, can someone suggest something please?

• Can you share your signal record? Jul 13 at 7:12
• Usually you have peaks for fsk on spectrum if modulated bits are a pattern or biphase Jul 13 at 9:35
• What is the bitrate? Jul 13 at 9:35
• Your lowpass filter, it is a FIR or IIR? Jul 13 at 9:38
• Hi @gotchi85 thank you for your comments, Sure I can share the signal record, here it is -- github.com/mike6789/signal/blob/main/outsp.txt Jul 13 at 15:31

The OP mentioned in comments that the symbol rate is 4800 sym/sec but the symbols are only separated by 1200 Hz (-1800 Hz, -600 Hz, +600 Hz and +1800 Hz). This would lead to significant inter-symbol interference that would complicate demodulation. The minimum frequency separation to maintain orthogonality between the symbols is $$\frac{1}{2T_s}$$ or 2400 Hz. Alternatively, the maximum symbol rate for the given minimum separation of 1200 Hz is 2400 sym/sec.