Monday, September 24, 2012


In thinking about BPSK vs. FSK or more accurately, MSK (Minimum Shift Keying) I found myself pondering whether they are functionally equivalent.

MSK is basically FSK with the shift set to ½ the baud rate.  Realistically this is the smallest shift you can use without trading off transmission speed.  At 31.25 baud in MSK your keying frequency shifts are 7.8125 either side of your transmit center frequency.  If you think of the phase of a carrier that is 7.8125 below the transmit center frequency, it will lag by 90 degrees after 32  mS, and at 7.1825 above, it will lead by 90 degrees after 32 mS, so MSK appears to be functionally equivalent to BPSK while using +90 and -90 degree shifts instead of 0 and 180.

I like MSK/FSK when it comes to transmittter design as there is no amplitude modulated component to the signal, greatly simplifying transmitter design as non-linear techniques can be utilized.  I wonder however if there is a price to be paid on the receiver side when trying to decode the signal at low signal levels and in trying to keep simple receiver designs locked onto the signal.


  1. Hello, I wonder if you hack any evolution of this work. Looks very interesting to me as I'm working into building a recharged Pixie with the addition of an AD9850 DDS plus an Arduino Nano board. I was considering to fit into the code beacon capabilities for WSPR, PSK31, RTTY, QRSS and so on. As it's difficult to create the amplitude modulation needed for the PSK31 scheme your approach might be a good substitute. Cheers. Pedro LU7DID.

  2. Hello Pedro,

    So far I have not attempted to implement this using any DDS hardware that I have available to me. You basically have to be able to set a small frequency shift of 7.8125 Hz above and below your carrier frequency within the bit time of 32 ms. This seems highly likely except with very slow I2C or SPI clocks on the control channel of the DDS. It should be simple enough to code it up. The tricky part is that to generate your bit clock of 32 ms you will likely be wanting to use a timer interrupt. The timer interrupt handler must effectively cause the shift in the DDS frequency. The problem here is that the communications with the DDS is likely to itself use interrupts for the I2C or SPI communications which are prevented by the fact that you are already in an interrupt handler and so interrupts are disabled. This would likely be the difficult part of this notion of generating PSK. You might also want to check out my articles on generating PSK31 audio on the Arduino which is in a multi-part series of articles where I basically implement a software DDS. If I get time to pursue this further, I will of course share that work.

    One possible way to implement this would be to have the timer ISR handler just set a flag that code in the main loop is waiting on to indicate the I2C communications should commence. As long as that communicaiton and the rest of the main loop are shorter than the timer period, in theory it should work.

    One further thing that you should keep in mind is that these frequency shifts must be able to be made by the DDS without turning off the DDS output and in a phase continuous fashion. Otherwise there will be unacceptable splatter of the keyed signal. Good luck and let me know how you get on if you attempt to implement this.