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:
- Input bitstream at 2 kB/sec
- Differentially encode bits
- Upsample differential bitstream to 48 kS/s and pass through Root Raised Cosine filter for pulse shaping.
- Take output of RRC filter to be I(t), and take Q(t) to be zero
- 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)
- 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:
- Recover and track the carrier, use it to train the local oscillator.
- Downconversion using synchronized oscillator, giving I(t) and Q(t)
- 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.
- 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?