FSK over FM

I’m interested in developing a VHF mode for FreeDV. One intriguing possibility is to connect a modem to legacy analog FM radios, which would allow them to be re-purposed for digital voice. One candidate is FSK at 1200 bit/s, which is often used over FM for APRS. This operates through FM radios using the mic/speaker ports on $50 HTs, no special data ports required.

So I want to know the performance of FSK over FM in terms of Bit Error Rate (BER) for a given SNR. That got me thinking. When you send FSK through a SSB radio, it faithfully mixes the tones up to RF and you get FSK over the channel. The SSB radio just adds a frequency translation step. So we can model FSK like this:

However sending a FSK modem signal through a FM radio is very different:

FSK over FM is not FSK when you look at the over the air waveform. The spectrum is no longer two tones bouncing back and forth. So what is it?

I wrote a simulation called fsk.m to find out. This involved building up a FSK modem, and an analog FM radio simulation. The modem took me only a few hours but I was struggling with the analog FM simulation for a week! In particular making my FM demodulator get the same results as the theory. FM is a bit old school for me, so I had to hit the ARRL handbook and do a bit of research.

FSK Modem

It’s a BEL202 simulation (as used for the APRS physical layer); 1200/2200 Hz tones, 1200 bit/s. I’m using the integrate and dump demodulation method and it matches the theoretical curves for non-coherent BFSK. Here is the FSK modem in action. First the FSK time domain signal and spectrum. The spectrum is a bunch of energy between 1200 and 2200 Hz. Makes sense as the modulator keeps moving back and forth between those two frequencies.

The next figure shows the same signals with a 10dB SNR. Although the time domain signal looks bad, it actually has a Bit Error Rate (BER) of one error in every 1000 bits (BER = 0.001 = 1E-3). The reason it looks so bad is that in the time domain we are seeing the noise from the entire bandwidth (our sample rate is Fs=96kHz). The demod effectively filters most of that out.

This next plot shows the output from the 1200 and 2200Hz integrators in the FSK demodulator for the 10dB SNR case. The height measures the energy of the tone during that bit period. As we would expect, they are mirror images. When one detects a large amount of energy, the other detects a small amount of the other tone.

Analog FM

The next step was to build a simulation of the modulator and demodulator in an analog FM radio. I wrote some code to test the input Carrier to Noise Ratio (CNR) versus output SNR. The test signal was a 1000 Hz tone, and the modulator had a maximum deviation of 5kHz, and a maximum input audio frequency of 3 kHz. After the demodulator I notched out the 1000 Hz tone so I could measure the noise power, the input to the notch filter was signal plus noise.

Here is the spectrum at the FM demodulator input for a 1000 Hz test tone:

The top plot is the tx signal centred on a 24 kHz carrier, in the bottom plot it has been mixed down to baseband and filtered. The FM signal is 16 kHz wide, as per Carsons rule. Here is the output of the FM demodulator:

At the top is a nice sine wave, and the bottom also shows the sine wave. You can see the effect of the output 3kHz low pass filter used to limit the noise bandwidth of the demod output.

When tested over a range of CNR inputs, I achieved output SNRs (red) in line with the text books (green):

At about 9dB the demodulator falls away from theory as the FM demodulator falls over, this is pretty typical. The theoretical model I have used is only valid above this 9dB threshold. You often hear this threshold effect in FM. The blue line is SSB for comparison. Over a certain threshold FM does quite a bit better in terms of output SNR for the same input CNR.

FSK over FM

OK so lets combine the simulations and look at the BER performance:

Oh dear. If my simulations are accurate, it appears FSK over FM is a lemon. About 7dB worse than regular FSK for the same BER. So using a FSK modem over a SSB radio would allow you to use 7dB less power than running the same modem through a FM radio. Coherent PSK is 3dB better again that FSK so that would get you a 10dB improvement. Simple FSK or PSK transmitters are easy to build too, and needing 7-10dB less output power would simplify them again (e.g. 100mW versus 1W).

Here is the spectrum at the FM demodulator input when sending FSK:

Note the FM spectrum looks nothing like regular FSK “over the air”, which looks like this:

So What went Wrong?

Given the plot of analog FM performance (say compared to SSB) above I had expected better results from FSK over FM.

I think I know where the problem lies. The input CNR is a measure of carrier power to noise power in the input bandwidth of the demodulator. Another way of looking at the VHF channel noise is a “floor”, which can be modelled as the average noise power per 1 Hz of bandwidth, called No.

So the Universe has given us a fixed “noise floor”, which will be the same for any modem. The FM demod input bandwidth is much wider, so it’s sucking up much more noise from the channel, which the poor demodulator has to deal with.

Lets plot the analog FM demod performance again, this time against C/No rather than C/N:

This takes into account the noise bandwidth, everything is “normalised” to the noise floor. When the C/No is beneath 48dB SSB looks much better. We can see a 7dB improvement over FM at low C/No values. This also explains why the microwave guys prefer SSB for their long shots.

Here is the BER curve scaled for C/No:


It appears the key to good modem performance is the RF bandwidth of the signal. Given a constant noise floor No, the signal bandwidth sets the total noise power N=NoB the demodulator has to deal with.

This has put me off the idea of a FreeDV VHF mode based on BEL202 FSK through legacy FM radios. I’d really like to come up with a mode that has sparkling BER versus SNR performance. I haven’t spent years making Codec 2 operate at low bit rates just to throw those gains away in the modem!

Couple of ways forward:

  • Take a look at GMSK.
  • Consider developing a version of the SM1000 into an (open source) VHF SDR radio that can do PSK. Not as crazy as it seems. We are already planning a HF SDR version. Radio hardware is getting simple now the signal processing is all moving to software. We can make the modem so efficient that the PA can be modest (100s of mW).
  • Dream up waveforms that can pass through legacy FM radios and have a low over-the air bandwidth. For example FSK that shifts between 300 and 400 Hz. In the past I’ve dreamed up new Codec 2 modes (1300 and 450 bit/s) to suit the properties of HF channels. So why not design a modem waveform to suit us? Go open source!
  • Cop the performance hit and use BEL202 FSK. It might still be useful to use legacy FM radios for DV even with a 7dB loss in modem performance. It seems to work fine for APRS. If your C/No is high (as is often the case) then FSK over FM will have zero errors.

16 thoughts on “FSK over FM”

  1. Hi David,

    One way to think about problem is that FM has a “threshhold” effect. That effect DOES depend on the choice of demodulator !!

    AM would probably do MUCH better.

    I favor a simple DSP approach. XMTR is multi-fsk. constant power like Olivia.

    RCVR is wide ADC and small FPGA to some cheap board. Maybe BBB?

    With care should be only a few chips. Wide band, 0-30mhz.

    Cheap and simple to build, understand, modify, etc.


    1. Hello John,

      Yes I also think a simple FSK or even PSK transmitter for applications like APRS is the way to go. Could be made for $5 these days. For receivers a SDR dongle.



  2. Hi David,

    There may want to be a bandpass preamp ahead of the SDR dongle?

    Also shaping of fsk shift waveform. Pretty simple with a simple CPU program.

    I am thinking maybe BBB as the ‘main’ cpu?

    We just need ‘ping’ command giving signal level and some error vector magnitude type of thing so each can optimize things from his end.

    How cheap can we make it?

    IMHO – pretty cheap !!


      1. More than hackable they need to be easy to use as most are easy sourced as modules because their use in the arduino an similar platforms. Actually there are a lot of chips that are more interesting because they offer IQ signals like the CMX991 (also the RDA1847 but this one is near impossible to source in low quantity an the datasheet is under NDA). Actually the CMX991 + STM32F407VG is a good combo for a portable VHF-UHF SDR transceiver.

  3. Hi David,
    I am not good at analog electronics but I tried passing fdm modem(freedv pc sofware) signals over my two handheld fm radios and it can decode, at least in 200 meters range. What is the reason that you don’t simply use this modem?

    Afaik, gmsk modulation needs an external circuitry to integrate old fm radios, which is generally very difficult or impossible. So, I’am not comfortable with this idea. Are there any other options that can be used without opening the radio’s case?

  4. FreeDV currently uses DPSK which has the same performance as FSK discussed in this post. So I would expect it to degrade by about the same (7dB) when passed through FM radios. But sure, it will work OK if the signal is strong.

    – David

  5. What we would need is kind of HackRF board with the output power and price of a Wouxun… How about trying the approach used in 9k6 packet radio? Of course, most of the cheap transceivers dont offer a DC path directly to the modulator and from the demodulator.

  6. Here’s a thought that’s probably a bit off-the-wall but anyway…

    Why not on-off keying through the FM carrier? 9600 baud packet is basically doing a form of pulse-shaped ASK directly into the modulator, which is why it needs a DC-clean path. Perhaps if the “pulse” were a tone, that might work?

    I’m speculating here, but it’d be interesting to try and model it.

  7. Hi David,

    Before reading this post I was wondering how energy efficient and how much power was required to send PSK/FSK over NBFM. So I did my own simulations in Matlab independently http://jontio.zapto.org/hda1/psk-and-fsk-over-fm.html . I come up with comparable BER/EbNo and BER/CNo plots for FSK1200/NBFM. My main interest though is currently PSK31 so I also simulated DBPSK31/NBFM, DBPSK1200/NBFM and DQPSK1200/NBFM. The most efficient scheme I found was DQPSK1200/NBFM (600 symbols a second, bit rate of 1200) and had a BER of 10^-5 when EbNo was about 16 or 17 dB. That’s about five or six dB improvement over FSK1200/NBFM.


    1. FB Jonti, good to see other people working in this area! I’ve read you post. Another way of looking at PSK31 c.f. FSK1200 is 10log10(1200/31)=15.8dB, about the gains you have found. So FSK at 31 bit/s might give you a similar result.

      My conclusion is that rather than using FM radios and copping such a huge loss in performance we need a new crop or VHF radios. Time to step away from the past. Hence the SM2000 project…..

      BTW it would be great if there is a way to comment on your posts!



        1. Oh and I checked out yr PSK31/LDPC paper. I’m getting similar gains with coherent PSK, and diversity of fading channels (just sending the signals twice at two different frequencies then recombining in the demod). No large blocks are rqd in this case. A strong code could also be added on top of course.

          1. Hi David,

            I like non-coherent differential PSK. I was originally looking into OFDM without pilots and using the neighboring symbols in frequency to differentially decode. I was sending two OFDM blocks the first being a preamble and the second one containing a packet, I was making a burst modem. I then kind of got sidetracked with whether or not you can obtain the same EbNo with noncoherent PSK as with coherent PSK. Differential encoding is a rate 1 convolutional code, if this is then wrapped in something like LDPC you end up getting a concatenated code, I then thought you should be able to use the turbo idea to improve the performance of noncoherent PSK. I wasn’t the first to think of this and it’s called turbo DPSK http://citeseerx.ist.psu.edu/viewdoc/download?doi= http://lit.lnt.de/papers/tr_it_pauli_06_1.pdf http://www.researchgate.net/publication/235712182_Soft-decision_LDPC_turbo_decoding_for_DQPSK_modulation_in_coherent_optical_receivers . However I struggled understanding it. I haven’t got it and when trying to implement something like it in Matlab using “comm.APPDecoder” I didn’t understand what I was supposed to do with the rotation before going into the APP decoder and my log likelihood ratios on each iteration became really massive. However, whatever I implemented I managed to get an EbNo of 3.6 dB with a BER of less than 10^-5 in AWGN. But I’m not convinced I created anything more than a fancy coherent receiver.

            I also had a quick look at implementing CPFSK using 16 frequencies in Matlab. With that I got down to I think 4.7 dB with a BER of less than 10^-5 without LDPC as I recall. Matlab decodes CPFSK using a vitibi decoder and outputs just hard decisions. This meant that I couldn’t just put on LDPC to shave off a dB or two. I’m not sure how it decides what path is best and though I feel you should be able to somehow create soft decisions I don’t how to do this as my understanding of CPFSK is just not up to scratch.

            From CPFSK I thought to the AD9850 modules that you can change the phase not continuously but instead in little 11° steps and wondered if you could use this to produce a nicer signal than you would get if you just used an AD9850 module with something simple such as PSK. So I put together a few bits and pieces and created a nice way to arbitrarily modulate phase of an AD9850 from the comfort of the PC. Today I had a look at what BPSK and Pi/2-BPSK looked like when produced using the AD9850 module http://jontio.zapto.org/hda1/BPSK_test_on_DDS.html .


  8. Fine work Jonti – the concept of DPSK as a rate 1 code is interesting, but yes DPSK it is a state machine after all. I have also seen some other papers on multi-symbol DPSK decoding that gets to within 1dB of coherent PSK.

    Would be interesting to see how it goes on fading channels.

Comments are closed.