# Designing an optimal BPSK and/or QPSK transciever in SDR

I'm currently working on writing firmware for the modem on a cube satellite for my university's satellite team. My primary goal is to implement the data uplink & downlink.

The RF system, completed before I arrived, receives on the 2m band and transmits on the 70cm band. The RF system takes the signals (IF of 10.7 MHz) and converts them using an I-Q transceiver to a 48 kHz wide zero-IF complex baseband, which are passed to and from the digital realm through an audio stereo codec.

The DSP itself is to be performed on a PIC32 microcontroller using fixed point arithmetic, and my task is to write the firmware for it.

For the data channel, I was just planning do something "simple" like BPSK or QPSK as they have good performance under high noise conditions.

My question then is this: what is the ideal structure of an optimal BPSK transceiver, and what would be the most efficient way to do it in SDR?

I know that I'll need to include some sort of pulse shaping, such as a root-raised cosine filter. As far as I know, the ideal BPSK transmitter should look something like this:

1. Input bitstream at 2 kB/sec
2. Differentially encode bits
3. Upsample differential bitstream to 48 kS/s and pass through Root Raised Cosine filter for pulse shaping.
4. Take output of RRC filter to be I(t), and take Q(t) to be zero
5. Multiply by complex sinusoid to shift up by a few kHz (there will also be an FM voice channel and I would like to keep them well separated)
6. Pass complex samples to codec output where they will be mixed to RF by the upconversion chain.

Does this seem correct?

I'm a bit lost for the receiver though. As far as I know, this is what I need to do:

1. Recover and track the carrier, use it to train the local oscillator.
2. Downconversion using synchronized oscillator, giving I(t) and Q(t)
3. Assuming perfect synchronization, I(t) is the message signal and Q(t) is zero, so pass I(t) through a RRC filter to eliminate noise and ISI.
4. Perform clock synchronization, differential decoding, and and data recovery on I(t)

I'm a bit confused on how to best perform carrier recovery. I know about Multiply-Filter-Divide, but that would mean I may need to upsample the signal depending on its frequency offset (as aliasing may occur if the outside edge of the band is less than half my upper bandwidth, or less than a quarter in the case of QPSK).

I know that Costas Loops exist, but not much beyond that (my university has never been very big on practical stuff and my comms textbook essentially mentions "these are a thing") - would this be a reasonable way to do carrier recovery in SDR?

Clock synchronization is another iffy point - what's the best way to do this? Barker code preamble? 8b/10b?

• You might get a very good answer here, but you might also try amsat.org, amsat-uk.org, AMSAT-VK (Australia) etc. I believe AMSAT UK have a receiver solution in their funcube dongle. They are friendly people, and may give advice. Also, if the university will buy some, you might be able to use it to test parts of your design. NB: I have no commercial relationship with AMSAT-UK. Sep 17, 2014 at 17:21
• Why are you required to share this channel with voice? Also, this could probably be done simpler, is this a requirement of your project 'boss'? Sep 19, 2014 at 11:40
• It also seems a bit unclear to me which carrier you are referring to where it says "how to best perform carrier recovery". Do you mean the codec side/bitstream carrier specifically? Sep 19, 2014 at 11:44
• @ErikFriesen We want an FM voice repeater on the satellite (ie: an OSCAR). As the SDR gives us 48 kHz of effective bandwidth, we were going to use part of the spectrum for the data channel and part of the spectrum for the voice repeater. For the carrier, I'm referring to the center frequency of the PSK signal, which will not be synchronized with the receiver due to a combination of propagation delay, oscillator drift, and most importantly Doppler shift from the satellite moving at 8 km/sec relative to the ground station. Sep 19, 2014 at 19:54

For a project of mine(uhf radios, pic32mx450f), I went with bpsk and 8b/10b encoding, with a 10 sine + 8b/10b k_28_1 preamble. This allows syncing to the correct phase, and then I run the moving bitstream through the detector until it hits the special code.

For phase detection, I looked at quite a few different ways, but ended up doing simple peak tracking and phase adjustment on each peak detect, which could be construed as a form of locked loop. I ended up locking clock adjustment after the preamble, but it would work to keep it open as well. Incoming audio is filtered with low and high pass fir filters to clean the signal and remove sub audibles. Everything I read seemed to point to the filter being an important part of the detector.

I think locking onto a raised root sine filtered drifting qpsk is going to be a challenge, bpsk less so, but probably more doable. The best options will depend on channel quality, I'd say.

I suppose that since this is a university project, perhaps you have chosen some of these complex items for the challenge? One alternative that comes to mind in place of directly sharing voice with data, would be to use a sub audible, or low frequency carrier to differentiate between repeated voice and data, similar to sub-audible tones used by uhf radio systems.

This isn't really a direct answer for all your questions, but this is too lengthy for a comment.

Here are some links I studied from dsp.stackexchange.com, which incidentally may be better suited to this question, or have more folks familiar with your questions nuances.

https://dsp.stackexchange.com/questions/8456/how-to-perform-carrier-phase-recovery-in-software

https://dsp.stackexchange.com/questions/3158/how-to-demodulate-an-afsk-signal-in-software?rq=1