Skip to content

Methodology

Downloading
Loading stations

Technical documentation

Methodology

The architecture of OrbitLink, the models behind every number it shows, and the assumptions they rest on.

Project objectives

OrbitLink is a software-only platform for a communication engineering graduation project. It uses publicly available orbital data and mathematical models, with no hardware. It sets out to:

  1. Track satellites around the Earth with live orbital data.
  2. Show satellite positions and orbital trajectories on a 3D globe and a map.
  3. Predict satellite passes over chosen ground station locations.
  4. Simulate ground stations with their altitude and elevation mask.
  5. Calculate satellite-to-ground link budgets.
  6. Analyse the Doppler frequency shift over real passes.
  7. Simulate digital modulation over a noisy channel.
  8. Generate engineering reports.

System architecture

User interface

Pages in the browser

  • Mission Control (3D globe, map)
  • Satellite catalog and detail
  • Ground stations
  • Pass prediction
  • Link budget
  • Doppler lab
  • Signal lab
  • Reports
  • Validation
function calls

Calculation engines

TypeScript, run in the browser

  • SGP4 propagation (satellite.js)
  • TEME, ECEF, WGS-84, topocentric frames
  • Pass finder
  • Sun and eclipse
  • Link budget
  • Doppler
  • Modulation and AWGN
  • BER theory and Monte Carlo
  • PDF reports (jsPDF)
JSON over HTTPS (element sets, stations, saved analyses)

Server routes

Next.js API routes

  • /api/catalog/status, /refresh
  • /api/satellites (search)
  • /api/satellites/elements
  • /api/satellites/[norad]
  • /api/stations
  • /api/calculations
SQL

Database

SQLite

  • satellites
  • catalog_syncs
  • ground_stations
  • calculations

CelesTrak GP data

Active group, OMM keywords as CSV, at most once per 6 hours

  • NORAD and COSPAR identity
  • Mean elements at epoch
  • B* drag term
The server only downloads, stores and serves data. Every orbit, pass, link, Doppler and modulation calculation runs in the browser, so results update instantly when a parameter changes.

A single web application holds the interface, the calculation engines and a small server layer. The server downloads the CelesTrak catalog, stores it in SQLite, and serves element sets, ground stations and saved analyses as JSON. The engines run in the browser on those element sets.

Orbital data

CelesTrak publishes general perturbations (GP) data, mean orbital elements fitted for the SGP4 model, in the CCSDS Orbit Mean-Elements Message (OMM) format. The legacy two-line element format cannot carry catalog numbers above five digits, which ran out on 11 July 2026, so OrbitLink reads OMM keywords exclusively and supports six-digit and longer numbers.

CelesTrak updates its data every two hours and allows one download per update for each server address. OrbitLink therefore downloads only the active group (about 17,000 satellites), refreshes at most every six hours, never contacts CelesTrak twice within two hours, and never retries a refused request. Groups such as Starlink, GNSS or weather are worked out from names and orbits, because downloading overlapping groups is discouraged.

Each record keeps the epoch, mean motion, eccentricity, inclination, right ascension of the ascending node, argument of perigee, mean anomaly, the B* drag term and the derived period, semi-major axis, apogee and perigee.

Propagation and coordinate frames

Positions and velocities come from SGP4 (near-Earth) and SDP4 (deep space, periods over 225 minutes), as implemented by satellite.js, which follows the reference code of Vallado et al. (2006) also used by Skyfield. SGP4 returns the state in the True Equator Mean Equinox (TEME) frame. It is rotated to the Earth-fixed frame with Greenwich Mean Sidereal Time, converted to WGS-84 geodetic coordinates, and projected into the station's topocentric frame for look angles.

Inertial (TEME) to Earth-fixed
r⃗ECEF=R3(θGMST) r⃗TEME,R3(θ)=(cos⁡θsin⁡θ0−sin⁡θcos⁡θ0001)\vec r_{ECEF} = R_3(\theta_{GMST})\,\vec r_{TEME},\quad R_3(\theta) = \begin{pmatrix}\cos\theta & \sin\theta & 0\\ -\sin\theta & \cos\theta & 0\\ 0&0&1\end{pmatrix}
Earth-fixed velocity
v⃗ECEF=R3(θGMST) v⃗TEME−ω⃗⊕×r⃗ECEF\vec v_{ECEF} = R_3(\theta_{GMST})\,\vec v_{TEME} - \vec\omega_\oplus \times \vec r_{ECEF}

With the Earth rotation rate 7.2921150e-5 rad/s.

Topocentric south-east-zenith frame
(SEZ)=(sin⁡φcos⁡λsin⁡φsin⁡λ−cos⁡φ−sin⁡λcos⁡λ0cos⁡φcos⁡λcos⁡φsin⁡λsin⁡φ)ρ⃗,ρ⃗=r⃗sat−r⃗station\begin{pmatrix}S\\E\\Z\end{pmatrix} = \begin{pmatrix}\sin\varphi\cos\lambda & \sin\varphi\sin\lambda & -\cos\varphi\\ -\sin\lambda & \cos\lambda & 0\\ \cos\varphi\cos\lambda & \cos\varphi\sin\lambda & \sin\varphi\end{pmatrix}\vec\rho,\quad \vec\rho = \vec r_{sat} - \vec r_{station}
Look angles
Az=atan2⁡(E,−S),El=arcsin⁡ ⁣(Z∣ρ⃗∣)Az = \operatorname{atan2}(E, -S),\qquad El = \arcsin\!\left(\dfrac{Z}{|\vec\rho|}\right)
Derived orbit
a=(μn2)1/3,ha=a(1+e)−Re,hp=a(1−e)−Rea = \left(\dfrac{\mu}{n^2}\right)^{1/3},\quad h_a = a(1+e) - R_e,\quad h_p = a(1-e) - R_e

With mu = 398600.4418 km^3/s^2 and Re = 6378.137 km (WGS-84).

SGP4 position errors are about one kilometre at the element epoch and grow by roughly one to three kilometres per day for low orbits, which is why the element age is shown with every satellite.

Pass prediction

The pass finder scans the time window at about 1/180 of an orbit (20 s to 5 min). Where the elevation crosses the mask it bisects to 0.1 s to find AOS and LOS, then a golden-section search finds the time of closest approach (TCA) and the maximum elevation. Satellites that never drop below the mask, as geostationary satellites in view, are reported as always visible.

Visibility condition
El(t)≥εminEl(t) \ge \varepsilon_{min}
Coverage half-angle of the footprint
λ0=arccos⁡ ⁣(ReRe+hcos⁡ε)−ε\lambda_0 = \arccos\!\left(\dfrac{R_e}{R_e + h}\cos\varepsilon\right) - \varepsilon
Naked-eye visibility
satellite sunlit ∧ El⊙(station)<−6∘\text{satellite sunlit} \ \wedge\ El_\odot(\text{station}) < -6^\circ

Civil twilight or darker at the station while sunlight still reaches the satellite.

Doppler effect

The range rate comes from the relative position and the Earth-fixed velocity of the satellite. The first-order shift is used throughout; the relativistic correction is about f (v/c)^2 / 2, roughly 0.1 Hz at UHF, and is shown for comparison in the Doppler lab.

Range rate
ρ˙=ρ⃗⋅v⃗ECEF∣ρ⃗∣\dot\rho = \dfrac{\vec\rho\cdot\vec v_{ECEF}}{|\vec\rho|}
Doppler shift (first order)
Δf=−ρ˙c ft\Delta f = -\dfrac{\dot\rho}{c}\,f_t
Uplink pre-compensation
ftx=f0−Δf(f0)f_{tx} = f_0 - \Delta f(f_0)

Digital modulation and bit error rate

The signal lab uses normalised time (one bit lasts Tb = 1) and unit average bit energy. Waveforms are sampled, noise is added sample by sample, and correlator receivers make coherent decisions. For the bit error rate curves the same detection is simulated in signal space, which is exactly what a matched filter outputs, so millions of bits run in seconds. A seeded random generator makes every run repeatable.

Signals over one bit (Eb = 1, Tb = 1)
BPSK: ±2cos⁡(2πfct),ASK: {0,2cos⁡(2πfct)},FSK: 2cos⁡(2πf0,1t)\text{BPSK: } \pm\sqrt2\cos(2\pi f_c t),\quad \text{ASK: } \{0, 2\cos(2\pi f_c t)\},\quad \text{FSK: } \sqrt2\cos(2\pi f_{0,1} t)
QPSK symbol (two bits, Gray coded)
s(t)=Icos⁡(2πfct)−Qsin⁡(2πfct),I,Q∈{±1}s(t) = I\cos(2\pi f_c t) - Q\sin(2\pi f_c t),\quad I, Q \in \{\pm 1\}
Sampled AWGN
nk∼N ⁣(0,N02 Δt)n_k \sim \mathcal N\!\left(0, \dfrac{N_0}{2\,\Delta t}\right)
Theoretical bit error rates
Pb,BPSK=Pb,QPSK=Q ⁣(2Eb/N0),Pb,FSK=Pb,ASK=Q ⁣(Eb/N0)P_{b,BPSK} = P_{b,QPSK} = Q\!\left(\sqrt{2E_b/N_0}\right),\qquad P_{b,FSK} = P_{b,ASK} = Q\!\left(\sqrt{E_b/N_0}\right)

The Gaussian tail is Q(x)=12 erfc(x/2)Q(x) = \tfrac12\,\mathrm{erfc}(x/\sqrt2), with erfc evaluated by a Chebyshev fit accurate to 1.2e-7. Every engine is checked against references on the Validation page.

Assumptions and limits

  • Accuracy is limited by SGP4 and the age of the element set, not by the numerics; elements older than a week are flagged.
  • Atmospheric refraction is not modelled, so rise and set times near 0° elevation can differ from optical observations by tens of seconds.
  • The Earth's shadow uses the solar ephemeris of satellite.js with a spherical Earth; penumbra is reported but not used for brightness.
  • The link budget assumes free-space propagation plus the losses entered; rain and atmospheric losses do not change with elevation automatically.
  • Modulation results assume an ideal coherent receiver with perfect carrier and timing recovery and no channel coding.
  • Satellite groups are derived from names and orbits and can misplace a few objects.

Technology

Technology stack
InterfaceNext.js (Pages Router), React 19, TypeScript
Styling and componentsTailwind CSS 4, shadcn/ui on Base UI
3D visualisationthree.js with React Three Fiber and drei
MapsLeaflet with react-leaflet, OpenStreetMap data rendered by CARTO
Earth geometryNatural Earth through world-atlas and topojson-client
Orbit propagationsatellite.js 7 (SGP4/SDP4, OMM input)
Charts and equationsRecharts, KaTeX
ReportsjsPDF, generated in the browser
DatabaseSQLite through the platform database
Data sourceCelesTrak GP data, active group, OMM format

References

  1. D. A. Vallado, P. Crawford, R. Hujsak and T. S. Kelso, "Revisiting Spacetrack Report #3", AIAA/AAS Astrodynamics Specialist Conference, AIAA 2006-6753, 2006.
  2. F. R. Hoots and R. L. Roehrich, "Spacetrack Report No. 3: Models for Propagation of NORAD Element Sets", 1980.
  3. T. S. Kelso, "A New Way to Obtain GP Data", CelesTrak documentation (GP data formats and usage policy).
  4. CCSDS 502.0-B-3, Orbit Data Messages (Orbit Mean-Elements Message, OMM).
  5. National Imagery and Mapping Agency, "World Geodetic System 1984", TR8350.2.
  6. ITU-R Recommendation P.525, Calculation of free-space attenuation.
  7. G. Maral, M. Bousquet and Z. Sun, Satellite Communications Systems, 6th ed., Wiley.
  8. J. G. Proakis and M. Salehi, Digital Communications, 5th ed., McGraw-Hill.
  9. B. Sklar, Digital Communications: Fundamentals and Applications, 2nd ed., Prentice Hall.