Calculate Latency and Doppler in a Satellite Scenario
This example shows how to model a GPS satellite constellation from a SEM almanac, analyze access between the satellites and a ground station, and calculate the latency and the Doppler shift between the satellites and the ground station.
Create a Satellite Scenario
Create a satellite scenario with a start time of 11-January-2020 2:50:00 PM UTC and a stop time 3 days later. Set the simulation sample time to 60 seconds.
startTime = datetime(2020,1,11,14,50,0); stopTime = startTime + days(3); sampleTime = 60; % In seconds sc = satelliteScenario( ... startTime,stopTime,sampleTime);
Add a Satellite to the Scenario
Add a satellite to the scenario from the
gpsAlmanac.txt SEM almanac file. To obtain the latest SEM almanac file, visit the Navigation Center website at www.navcen.uscg.gov and search for 'SEM Almanac'.
sat = satellite(sc,"gpsAlmanac.txt");
The default orbit propagator when creating satellites using SEM almanac is
gps. This can be verified by observing the
OrbitPropagator property. Additionally, the output of the
orbitalElements function contains GPS satellite-specific information.
orbitProp = sat(1).OrbitPropagator
orbitProp = "gps"
elements = orbitalElements(sat(1))
elements = struct with fields: PRN: 1 GPSWeekNumber: 2087 GPSTimeOfApplicability: 589824 SatelliteHealth: 0 SemiMajorAxis: 2.6560e+07 Eccentricity: 0.0093 Inclination: 56.0665 GeographicLongitudeOfOrbitalPlane: -40.4778 RateOfRightAscension: -4.6166e-07 ArgumentOfPerigee: 43.3831 MeanAnomaly: 172.6437 Period: 4.3077e+04
Add a Ground Station
Add the Madrid Deep Space Communications Complex as the ground station of interest, and specify its latitude and longitude.
name = "Madrid Deep Space Communications Complex"; lat = 40.43139; % In degrees lon = -4.24806; % In degrees gs = groundStation(sc, ... Name=name,Latitude=lat,Longitude=lon);
Add an Access Analysis and Visualize Scenario
Add access analysis between the GPS satellites and Madrid ground station, which determines when the ground station is visible to the satellites. This helps in visualizing which satellites are visible to the ground station with time.
ac = access(sat,gs);
Visualize the scenario by launching a satellite scenario viewer. Set
ShowDetails of the viewer to false to ensure the visualization is not cluttered. Set the camera position to bring all satellites that have access to the ground station into view.
v = satelliteScenarioViewer(sc,ShowDetails=false); campos(v, ... 29, ... % Latitude in degrees -19, ... % Longitude in degrees 7.3e7); % Altitude in meters
Calculate Latency and Rate of Change of Latency
Calculate the propagation delay from the GPS satellites to the Madrid ground station using the
latency function. Also, compute the rate of change of propagation delay.
% Calculate propagation delay from each satellite to the ground station. % The latency function internally performs access analysis and returns NaN % whenever there is no access. [delay,time] = latency(sat,gs);
Plot the propagation delay corresponding to the first satellite. You may choose to plot the propagation delay corresponding to all satellites. However, this example plots it only for the first satellite to serve as a demonstration and to reduce plot clutter.
plot(time,delay(1,:)*1000) % Plot in milliseconds xlim([time(1) time(end)]) title("First Satellite's Latency vs. Time") xlabel("Simulation Time") ylabel("Latency (ms)") grid on
Plot the rate of change of propagation delay corresponding to the first satellite.
latencyRate = diff(delay,1,2)/sampleTime; plot(time(1:end-1),latencyRate(1,:)*1e6) % Plot in microseconds/second xlim([time(1) time(end-1)]) title("First Satellite's Latency Rate vs. Time") xlabel("Simulation Time") ylabel("Latency Rate (\mus/s)") grid on
Calculate Doppler Shift and Rate of Change of Doppler Shift
This example considers a C band frequency of 5 GHz. Calculate the Doppler shift and the variation of Doppler shift using the
% Emitted carrier frequency in Hz fc = 5e9; % Calculate Doppler shift and get additional information about Doppler. The % Doppler information output contains relative velocity and Doppler rate. % The dopplershift function internally performs access analysis and returns % NaN whenever there is no access. [fShift,time,dopplerInfo] = dopplershift(sat,gs,Frequency=fc);
Plot the Doppler shift corresponding to the first satellite.
plot(time,fShift(1,:)/1e3) % Plot in kHz xlim([time(1) time(end)]) title("First Satellite's Doppler Shift vs. Time") xlabel("Simulation Time") ylabel("Doppler Shift (kHz)") grid on
Plot the Doppler rate corresponding to the first satellite.
plot(time(1:end-1),dopplerInfo.DopplerRate(1,:)) % Plot in Hz/s xlim([time(1) time(end-1)]) title("First Satellite's Doppler Rate vs. Time") xlabel("Simulation Time") ylabel("Doppler Rate (Hz/s)") grid on
Show the name and orbit of the first satellite and plot its future ground track, or lead time, over 12 hours. Dashed yellow shows the future ground track, and solid yellow shows the past ground track.
sat(1).ShowLabel = true; show(sat(1).Orbit); groundTrack(sat(1), ... LeadTime=12*3600); % In seconds campos(v,84,-176,7.3e7);
Play the scenario with the satellites and ground station.