In this single carrier QPSK receiver, is designed to receive QPSK data from a satellite in Low Earth Orbit. Since the satellite speed in this orbit is around 3000 m/s and our carrier frequency is 12 GHz, the doppler shift will be around 320 KHz.
Our sampling rate is 2 MSPS and our symbol rate is 1 MegaBaud. If I want to blindly estimate the doppler shift of 320 KHz, I won't be able to do it, because of the low sampling rate. So the fft approach (mentioned here won't work).
There are some sources that mention this can be done by using Costas loop, but I thought the Costas loop is going to be used in the Carrier Recovery block, which does the fine frequency and phase compensation. How can I get the coarse frequency estimate here?
This is the MATLAB code I used:
https://github.com/Jacobx0/QPSKRX/blob/main/QPSKRX.m
I have added the power spectrum after pulse shaping on the transmitter side:

