I am working on a project to develop a ground station that communicates with a LEO Satellite in X Band via the DVB-S2 communication standard using off-the-shelf components.

It appears that the TBS-6903 coupled with a Low Noise Block Downconverter (LNB) is quite used to receive GEO satellite video streams.

I would like to know if there are resources out there describing experience using this setup to receive DVB-S2 signal from a LEO Satellite using the TBS-6903, or if anyone here has direct experience with it.

Also, there is no documentation that shows if there is a doppler compensation done by the system.

Any help would be appreciated.


1 Answer 1


Probably a similar, related question can also be asked in Ham SE I'll give a partial answer here.

I'm pretty sure that a board designed to use for signals coming from satellites in geostationary orbit would not have any built-in Doppler compensation because the relative velocities will be tiny, perhaps a millimeter per second for the most wobbly orbits.

That kind of frequency shift will be well tolerated and compensated by the demodulation procedure itself.

The effect is way, way bigger for satellites in LEO, as they approach the horizon the relative velocity will be about 7200 kilometers per second!

Most amateur satellite listeners will either use a program that uses TLEs to generate a trajectory then pre-calculates the Doppler shift and shifts the tuning of their radio, or these days they just use a software-defined radio to capture and record a wide enough range in frequencies at the same time and a separate program to track the trajectory of the signal in frequency space for demodulation. Some examples can be found in

Here's the doppler shift as a function of time, roughly +/- 20 parts per million over a few minutes. At say 5 GHz that's ± 100 kHz.

It is possible that the demodulation system of that board can easily accommodate a 200 kHz bandpass but that's only the beginning of the problems you'll need to address to know if you can get a non television signal out of what seems to be a satellite television receiver.

400 im circular LEO overhead pass doppler shift is circa ± 20 ppm

import numpy as np
import matplotlib.pyplot as plt

R_earth = 6378 * 1000 # (m) Earth equatorial radius
altitude = 400 * 1000 # (m) 
a = (R_earth + altitude) # (m) semimajor axis of a "400 x 400 km" circular orbit

GM = 3.986004418E+14 # (m^3/s^2) https://en.wikipedia.org/wiki/Standard_gravitational_parameter

c_light = 2.9979E+08 # (m/s) speed of light in vacuum

v_orbital = np.sqrt(GM / a)

T = 2 * np.pi * a / v_orbital # (s) orbital period 

dt = 1.0 # (s) time step
time = np.arange(-300, 300, dt) # +/- 5 minutes from a pass overhead

minutes = time / 60.
dt_minutes = dt / 60.

x, y = [a * f(2 * np.pi * time / T) for f in (np.sin, np.cos)]

x0, y0 = np.array([0, R_earth]) # location of ground station

r = np.sqrt((x - x0)**2 + (y - y0)**2)

elevation = 90 - np.abs(np.degrees(np.arctan2(y - y0, x - x0)) - 90)

dr_dt = (r[1:] - r[:-1]) / dt

shift = dr_dt / c_light # Δf/f first-order doppler shift in frequency

fig, (ax1, ax2, ax3) = plt.subplots(3, 1)

ax1.plot(minutes, r/1000.)
ax1.set_ylabel('distance (km)')

ax2.plot(minutes, elevation)
ax2.set_ylabel('elevation (°)')
ax2.set_ylim(0, 90)

ax3.plot(minutes[:-1] + 0.5*dt_minutes, shift*1E+06)
ax3.set_ylabel('Δf/f Doppler ppm')
ax3.set_xlabel('time (minutes)')

plt.suptitle('400 km circular LEO overhead pass')

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.