I want to compute the Doppler frequency for LEO/MEO/GEO satellites. For the calculation I am using the following equations:

  1. $$V= \sqrt{(G \cdot \frac{M}{R+h})}$$ - satellite speed. Height dependent

  2. $$t=\frac{a\cdot (R+h)}{V}$$ - time varies depending on the angle of the satellite relative to the receiver.

  3. $$f_d=\frac{V\cdot R \cdot f_0 \cdot \cos(a)}{(R+h) \cdot c} $$- frequency. It depends on the change in height and angle.

My initial parameters for calculation were:


One of my results is:

t = 0, fd = 1.244840 MHz or 1244.840 kHz for h = 300 km.

I thought I would get the Doppler frequency in a range ~ 400 - 600 kHz

Have I assumed the Doppler frequency incorrectly or are my calculations wrong?

edit 1:

My new result enter image description here

Code I am using:

nu = 3.989e14;

h = [300e3 600e3 1200e3];

% a=0:0.001:3.1416;
t = zeros(length(a),length(h));

Fd = zeros(size(t));
for i = 1:length(h)


I believe Doppler shift for h = 300 and h = 600 should be almost the same, but according to the Matlab result they are different and difference is big.

Do I suppose wrong or is my code wrong?


1 Answer 1


You have a units problem.

First, in general, it is a bad idea to use G and M separately, because the accuracy to which they are individually known is much less than the accuracy to which their product, the gravitational parameter $\mu$, is known. With the two values you have, the product is accurate only to 5 digits out of the 12 to which we know Earth's $\mu$.

The values you have for G and M lead to $\mu$=3.986 × 1014, which means the units are meters cubed per second squared, so you should use R and h in meters, not kilometers. 6371 km is a good estimate of Earth's average radius (with the meters digits depending on what definition of "average" you use), but definitions of satellite altitude are often not clear whether they mean that or instead Earth's maximum (equatorial) radius, 6378137 m.

If you put in 6371000 for R and 300000 for h, rather than 6371 and 300, then you will find the speed of a satellite in a circular orbit at that altitude is 7730 m/s, giving a maximum possible fractional Doppler shift of 7730/c = 2.578 × 10-5, which at 1.6 GHz equals 41 kHz. The amount of that you actually see at each moment depends on how high the satellite gets in the sky on each pass. During a single pass, the Doppler shift is always most positive just as it comes into view, most negative just as it goes out of view, and zero when it reaches the highest elevation angle you see on each pass. The closer to directly overhead it is when it reaches that point, the greater its most positive and most negative shifts at rise and set on that same path were and will be.

I'm not going to work out the exact trigonometry for you, or how eccentricity gets involved, but a quick simulation with arbitrary values gives seven or eight observed passes per day at around 2000 to 7000 m/s maximum range-rate, for maximum per-pass Doppler shifts at 1.6 GHz of 11 to 37 kHz. Your mileage will vary with orbit inclination, observer latitude, and several other things.

  • $\begingroup$ Thank you for your comment and suggestions. I have rewrite my code and plotted a new fig. Could you please have a look at it? It looks like Something is wrong. Thank you in advance. $\endgroup$
    – Aid22
    Jan 13, 2023 at 7:55
  • $\begingroup$ @Aid22 you still have the same problem. you have R in kilometers and h in meters, so adding them doesn't make sense. Just put R in meters also, as 6371000, and it should work out. $\endgroup$
    – Ryan C
    Jan 19, 2023 at 21:36
  • $\begingroup$ What is acceptable doppler shift, which we can neglect? when it measured in khz? $\endgroup$ Jan 26, 2023 at 13:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.