Doppler effect correction will be a necessary step in our communication procedure. In a worst case scenario, with a pass directly overhead (90 degree elevation) the relative velocity will be around 7800 m/s giving a total change in velocity over the pass of around 15600 m/s. Based on the link budget communication will take place at a frequency of 433.92 MHz, giving a total doppler shift over the pass of 23 kHz.

Our comms bandwidth is 15kHz, which the predicted doppler shift is already greater than. Additionally for GMSK modulation the maximum acceptable frequency deviation is only 25% of the bit rate (not sure what this will be for our system but likely more strict than bandwidth). This means doppler shift correction will be necessary.

The simplest way to do this is calculate the doppler shift beforehand for any given point in the pass and correct the link frequency based on this. This means all correction can take place on the ground station and eliminates the need for the satellite to take it into account.

The best solution I have found for determining the doppler shift at any given point in a pass is a program called Predict, which takes TLE data and ground station coordinates and can give us relative velocity at different points in the pass. Conveniently this program has ports to various languages, including python (https://github.com/spel-uchile/Pypredict), which makes integrating it with the rest of the comms system easier. This program is rather heavy for this purpose though, as Predict is meant to be a full satellite tracking system rather than just a way to predict relative velocity, which makes it inefficient for this purpose. This is hopefully not a problem as it’s running on the ground station and compute time should not be an issue, but it might be worth looking into a better solution. Depending on the known information for any given satellite pass, we may be able to calculate the doppler shift directly using the below formula:

(ɸ = coverage angle, ϒ = elevation angle, θ = Angle of ground station relative to sub-satellite point)

$$ f_{d} = \frac{|v|cos(\theta)cos(\phi + \gamma)f_{c}}{c} $$

Depending on our maximum acceptable frequency deviation there are several methods we can use to reduce the maximum experienced doppler shift. One method is a continual linear frequency sweep along the whole length of the pass. This would cut the maximum variation in half, and only requires knowing the initial doppler shift and pass length. Diagram below:

Alternatively, doppler shift type curves can be approximated fairly accurately with an inverse cube root function. This leaves very little residual shift.

I’ve written an example program using PyPredict which can predict the doppler shift for a given pass from TLE data. This can be used to calculate any of the above frequency sweep methods or for identifying time ranges where communication can be done with a constant correction frequency change (shown here in red with 2.5 kHz zones).

Additionally for short communications cycles we could simply have all communications take place during the window when doppler shift is close to zero, which would eliminate the need for doppler shift altogether. This window will depend on the frequency shift tolerance and the individual pass characteristics, but will not be longer than ~30 seconds.

Additional information:

https://macsphere.mcmaster.ca/bitstream/11375/5713/1/fulltext.pdf

https://digitalcommons.usu.edu/cgi/viewcontent.cgi