I am trying to model Doppler shift of LEO satellite, From my research so far I have come across the following formula:

\begin{equation} \frac{f_r}{f_s}=\frac{1-\frac{u}{c}cos\theta}{\sqrt{1-\frac{u^2}{c^2}}} \end{equation}

that in my understanding would model the doppler shift.However the doppler curve (https://georgeri.smugmug.com/My-First-Gallery/i-m8tmT5V/A) can not be extrapolated by it,since they follow a sinwave shape (as seen in the picture) not a cosine that the formula would plot.

Am I heading in the right direction?Can someone please provide some references on how to replicate the doppler curve? Shall I dig in more to special relativity or is a simpler way to model doppler shift?

  • 2
    $\begingroup$ Can you specify your variables and your coordinate system? $\endgroup$
    – Juancho
    Jun 16, 2017 at 14:49
  • $\begingroup$ Just some very simple to start with,not elevation angle or "extra" variables.Simple Cartesian system.I have found this:amateurgeophysics.wordpress.com/… to alleviate my doubts slightly.However,any further details that would enhance my research would be greatly appreciated.Shall I dig into concepts like relative speed as recommended in earlier relevant posts?Should I study spacial relativity to have a concise model implemented? $\endgroup$
    – Rizias
    Jun 16, 2017 at 16:01
  • 1
    $\begingroup$ Special relativity is certainly not necessary for the precision you'll need unless you are trying to replicate GPS. $\endgroup$ Jun 16, 2017 at 19:27
  • 2
    $\begingroup$ Could you perhaps elaborate on your intended use? For example, do you want to put in Keplerian elements for a satellite and calculate the Doppler shift during a specific pass or are you trying to something simpler? I have several formulas in my library but I don't want to get started down the wrong path. $\endgroup$
    – Glenn W9IQ
    Jun 16, 2017 at 21:09
  • 1
    $\begingroup$ @uhoh That is excellent,but having access to the math,would be paramount since I may need to modify or partially use the models along with my pieces.If studying resources could be provided that would be excellent,thanks again for your interest,appreciate that. $\endgroup$
    – Rizias
    Jun 18, 2017 at 14:47

2 Answers 2


The general equation for the change in frequency due to Doppler shift is:

enter image description here

where c is the speed of light, fO is the frequency of operation, and Δv is the relative velocity.

When applying this formula to the ground observation of a satellite, Δv is better described as range velocity (rate of change of distance from the satellite to observer). Because many LEO satellites are in an elliptical orbit, the math to obtain Δv as a function of time or position is not solved through simple angular calculations and therefore becomes very tedious to execute even when applying matrix math for some of the calculations.

I would like to suggest, however, that there is little value in recreating all of the calculations except for academic interest. Instead, I prefer to use a well engineered software library called PyEphem that does nearly every type of ephemeral calculation one could need (I even use this library in my home automation system to calculate the on/off times of my exterior lights to obtain automatic seasonal adjustment). This is a completely free Python library that is easily run on nearly any operating system and platform including the ubiquitous Raspberry Pi.

Applying the library for amateur radio satellites is quite simple. First, acquire the TLE (two line elements) for the desired satellite. These are available from the TLE Info site. A typical set of TLE data contains all the necessary ephemeral variables and looks like this:

1  7530U 74089B   17170.24378275 -.00000031 +00000-0 +84707-4 0  9992
2  7530 101.6303 138.8875 0011838 320.4872 153.4129 12.53627377948883

This information is used with the PyEmphem library in the following fashion. First establish the observer location on earth (I will use Chicago, IL, USA as an example):

my_loc = ephem.Observer()
my_loc.lon = '87.6298'
my_loc.lat = '41.8781'
my_loc.elevation = 181

Then apply the TLE data to create a my_sat body object:

my_sat = ephem.readtle(name, line1, line2);

The library can now calculate a variety of data related to the next pass of my_sat at my_loc:


So for example, we can print the rise and set times, maximum altitude, and the time of the maximum altitude for the next pass:

print("AOS: %s LOS: %s Maximum Altitude: %s Maximum Altitude Time: %s" % (info[0], info[4], info[3], info[2]))

Note that the maximum Doppler shift will occur at AOS and LOS and that the maximum altitude time is when the Doppler shift will be at zero because the range velocity (Δv) will drop to zero.

We can also inquire as to the range velocity at any time during the pass. For example, at the start of the pass:

print("Range velocity: %s " % (my_sat.range_velocity))

By applying this technique to obtain the range velocity throughout the pass, we can easily calculate the Δf of a specific pass as viewed from a specific location on earth. And all of that for only a few dozen lines of code!

You can learn more about the expansive PyEphem library here.

If you wish to explore more of the raw math behind LEO satellite calculations, the following links may be helpful:

Orbit Calculation and Doppler Correction

Adaptive Doppler Correction

Satellite Orbit Basics

  • $\begingroup$ Thanks a lot for that,really useful tool that most likely Ill utilize.However,I am interested in the tedious maths behind the tool, since I would like to model the doppler effect.The tool will provide an excellent reference to cross compare my data should I have a model. $\endgroup$
    – Rizias
    Jun 20, 2017 at 10:14
  • 1
    $\begingroup$ I have edited my answer to give you some links for background information on the raw calculations. $\endgroup$
    – Glenn W9IQ
    Jun 20, 2017 at 17:18
  • $\begingroup$ Thanks for that,am aware about the second reference and is indeed very helpful.I would also add :itu.int/dms_pubrec/itu-r/rec/m/… and "Doppler Applications in LEO Satellite Communication Systems". Hopefully Ill come back with a post having results out of this research.Thanks again for your help! $\endgroup$
    – Rizias
    Jun 21, 2017 at 12:46
  • 1
    $\begingroup$ I am glad that helps. The math is simply too long and complex to include as an answer in this forum. If you get a working math model, post back here so we know you were successful. If you manage to condense the math, perhaps you could post it as an answer for future reference. $\endgroup$
    – Glenn W9IQ
    Jun 21, 2017 at 12:49

The Doppler curve IS the Doppler shift. That graph you have is exactly what you will see at your receiver station. Especially for LEO satellites, you don't need to extrapolate further because the satellite is obscured by the Earth.

You mention you are concerned about the cosine function in the equation... remember that cosine is the same thing as sine but shifted 90 degrees. You don't need to worry about that.

This formula is easier to think about if you take the curvature of the Earth out of the equation. If you imagine for a moment that you are on a flat surface and you have an object coming towards you (but slightly offset from you), the frequency you receive is higher than the source it is transmitting. As it gets closer, there will be less and less velocity in your line of sight. Then, when it reaches the closest point of approach to you, your received frequency will be exactly equal to the transmitted frequency because the velocity in your line of sight to the object is exactly zero. As it continues away, your received frequency will decrease until it is far enough away that the velocity component in your line of sight is essentially equal to the object's total velocity.

Therefore, the picture in the link is showing you a lot of information. If you know the transmitted frequency, then when you measure the difference between max or min frequency and that reference, you are able to determine how fast the object is traveling. If you don't know the base frequency, then you can take the average of the max and min to calculate it. Finally, you know that when the satellite crossed zero in that graph it was at it's closest point of approach to you.

To summize, you are on the right track. You just have to remember that u in that equation is a relative speed in receiver's line of sight, not the speed of the satellite.

This is the exact same principle used in sonar tracking and signal processing as well. If you can't find more on satellites, you can look there too.

  • $\begingroup$ Thanks a lot for your interesting comments,I appreciate your effort.However all those you described above are the fundamentals which It happens me to be aware of.Doubts like how that doppler curve would change for different orbits,or how the elevation angle would change things are in my mind and need to clear out along with any other "side effect" that for time being am not aware of... $\endgroup$
    – Rizias
    Jun 18, 2017 at 17:44
  • $\begingroup$ Here's the summary: It all boils down to u. As the orbit changes, it changes the speed in the line of sight. u will be a function of that. Those principles are the same for LEO, MEO, GEO, or even HEO orbits. If you want to find your u function, look into two line element sets from celestrak.com/norad/elements. You can also use software like Systems ToolKit to model the orbit. Find the function of u and you have your equation. $\endgroup$
    – SandPiper
    Jun 18, 2017 at 17:53
  • $\begingroup$ Is the relative frequency I need to investigate on then? $\endgroup$
    – Rizias
    Jun 18, 2017 at 18:18
  • $\begingroup$ Yes. The relative frequency is u. $\endgroup$
    – SandPiper
    Jun 18, 2017 at 18:29
  • $\begingroup$ $u$ in the equation is the velocity of the satellite, and $c$ is the velocity of light. $\endgroup$
    – tomnexus
    Jun 18, 2017 at 19:32

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .