matlab-generate-gnss-waveform
Generate GNSS baseband waveforms (GPS, Galileo, NavIC) with physically realistic or user-specified channel impairments using the Satellite Communications Toolbox
Install / Use
npx skills add matlab/matlab-agentic-toolkit --skill matlab-generate-gnss-waveformInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
Development & EngineeringSupported Platforms
Tags
Our assessment of matlab-generate-gnss-waveform
matlab-generate-gnss-waveform scores 93/100 on our quality scale, 818th of 4,646 Development & Engineering skills we index (top 18%).
Its SKILL.md is 20 KB long, well organised into 20 sections with 18 code examples: a thorough specification that gives an agent plenty to work with.
With 1,098 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated 18 days ago, so matlab-generate-gnss-waveform is actively maintained.
- No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
- Its trust signals score 88/100, with 1 caution from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
matlab-generate-gnss-waveform compared with similar skills
All 4 of these similar skills score higher than matlab-generate-gnss-waveform; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| matlab-generate-gnss-waveform (this skill)by matlab | 93 | 1.1k | 18d ago | SKILL.md |
| ai-job-searchby MadsLorentzen | 100 | 44.9k | today | CLAUDE.md |
| claude-howtoby luongnv89 | 100 | 41.7k | 3d ago | CLAUDE.md |
| algorithmic-artby anthropics | 100 | 177.9k | 11d ago | SKILL.md |
| pptxby anthropics | 100 | 177.9k | 11d ago | SKILL.md |
Frequently asked questions
- How do I install matlab-generate-gnss-waveform?
- Run
npx skills add matlab/matlab-agentic-toolkit --skill matlab-generate-gnss-waveform. The install tabs above show the steps for each supported agent. - Which AI agents does matlab-generate-gnss-waveform work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is matlab-generate-gnss-waveform safe to use?
- It declares no license and scores 88/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is matlab-generate-gnss-waveform still maintained?
- The repository was last updated 18 days ago, so matlab-generate-gnss-waveform is actively maintained.
Skill content
View source on GitHubname: matlab-generate-gnss-waveform description: > Generate GNSS baseband waveforms (GPS, Galileo, NavIC) with physically realistic or user-specified channel impairments using the Satellite Communications Toolbox. Use when generating GPS L1 C/A, L1C, L2C, L5, Galileo E1, E1C, E5a, E5b, E5, or NavIC L5, S, L1 signals. Covers gpsWaveformGenerator, galileoWaveformGenerator, satelliteScenario, Doppler/delay from orbital dynamics or custom values, navigation data encoding with ephemeris, and RINEX integration. Triggers on: GPS waveform, Galileo waveform, NavIC waveform, GNSS signal, satellite scenario, GNSS simulation, receiver test signal, baseband GNSS, L-band satellite signal, navigation signal generation. license: https://www.mathworks.com/content/dam/mathworks/license/pmrl/license.md compatibility: ">=R2026a" metadata: author: MathWorks version: "1.0"
Generate GNSS Waveform
Generate multi-satellite GNSS baseband waveforms with properly encoded navigation data. Channel impairments (Doppler, delay, noise) can come from a realistic satellite scenario OR from user-specified custom values. Supports GPS, Galileo, and NavIC constellations. The waveform carries real ephemeris so a receiver can decode it for position estimation.
When to Use
- Generating GNSS baseband signals (GPS, Galileo, or NavIC) for receiver testing
- Simulating multi-satellite channels with Doppler and delay from orbital dynamics
- Testing with specific Doppler/delay/SNR values (custom channel mode)
- Building end-to-end GNSS receiver simulations that need decodable nav data
When NOT to Use
- Signal acquisition, tracking loops, nav decoding, or position estimation
- BeiDou/GLONASS (not supported) or SDR hardware transmission
Prerequisites: Helper Files
Copy helper files from MathWorks examples into your project folder.
See references/helper-files.md for the full list of source examples
and files to copy per constellation (GPS, Galileo, NavIC).
Workflow
The pipeline has 6 steps (0-5). Step 0 determines signal type, channel mode, and data source. The channel mode decides whether Steps 2-3 are needed.
Step 0: Determine signal type + channel mode + data source + nav data intent
Step 1: Configure waveform generator
├── Scenario mode → Step 2 (satellite scenario) + Step 3 (compute channel from physics)
└── Custom mode → Step 3c (user provides Doppler/delay/SNR directly)
Step 4: Encode navigation data (both modes)
Step 5: Generate waveform with channel (both modes)
Step 0: Determine signal type, channel mode, and data source
If the user's prompt does not clearly specify the signal type, ask:
What GNSS waveform would you like to generate?
GPS: L1 C/A, L1C, L2C, L5 Galileo: E1, E1C (pilot only), E5a, E5b, E5 (wideband) NavIC: L5, S, L1
Also, how should channel impairments (Doppler shift, propagation delay, noise) be applied?
(a) Scenario-driven — I compute realistic values from a satellite scenario. You provide a receiver location (lat/lon) and I handle the orbital dynamics.
(b) Custom values — You provide Doppler (Hz), delay (s), and/or SNR (dB) per satellite. Useful for controlled testing or when you already have your own channel model.
Detection heuristics: Location/city/lat-lon → Scenario. Specific Doppler/delay/SNR numbers → Custom. "Stress test" or "extreme" → Custom. No cues → Ask. If signal type is clear but mode ambiguous, ask only about mode.
Data source selection
Available: gpsAlmanac.txt (always on path), RINEX .rnx files
(Nav Toolbox). Require setup: galileoAlmanac.xml (copy from
example), fresh almanac (download from USCG NAVCEN).
Decision rules:
- User provides RINEX → use for both scenario AND nav data.
- No RINEX → use bundled almanac (
gpsAlmanac.txtorgalileoAlmanac.xml). - Current-epoch needed → offer fresh almanac download (requires internet).
- RINEX requested but no Nav Toolbox → fall back to almanac or parse
manually (see
references/rinex-integration.md).
All bundled files are from a fixed past epoch. This is fine for receiver algorithm testing (orbital geometry is still valid) but does not represent today's actual sky. The agent MUST communicate which file and epoch is being used.
Navigation data intent
Navigation data can be:
- Real ephemeris (from almanac/RINEX) — required for end-to-end receiver testing where position estimation must work
- Random/dummy bits — valid for signal-level testing (acquisition, tracking, modulation quality) where nav decode is not the goal
If user's intent is unclear, ask:
Do you need the waveform to carry real navigation data (for position estimation), or are dummy bits fine (for signal-level testing)?
STOP — Present choices before generating
Before writing or executing ANY code, print a standalone configuration summary stating: signal type, center frequency, sample rate, duration, data source + epoch, start time, and nav data type. This MUST appear as visible text BEFORE any code block — not buried in comments or post-run summaries. In interactive mode, wait for user confirmation.
Step 1: Configure waveform generator (constellation-specific)
GPS:
sampleRate = 5e6;
wavegenobj = gpsWaveformGenerator(SampleRate=sampleRate);
wavegenobj.SignalType = "legacy"; % L1 C/A
navDataType = "LNAV";
centerFrequency = 1575.42e6;
stepTime = wavegenobj.BitDuration;
Verify: stepTime should be 0.02 (20 ms) for L1 C/A, 0.01 for L1C/L5.
Galileo:
sampleRate = 25e6; % Use 60e6 for E5 wideband
wavegenobj = galileoWaveformGenerator(SampleRate=sampleRate);
wavegenobj.SignalType = "E1"; % or "E1C","E5a","E5b","E5"
centerFrequency = 1575.42e6; % E5 uses 1191.795e6
stepTime = wavegenobj.BitDuration;
Verify: stepTime should be 0.004 (4 ms) for E1/E1C/E5b, 0.02 for E5a/E5.
E5 has critical pitfalls — nav data must be a {fnavbits, inavbits}
cell array (not a matrix), and I/NAV needs 5× more rows than F/NAV.
See references/galileo-pipeline.md E5 section.
NavIC (R2026a -- no system object yet):
sampleRate = 24e6;
centerFrequency = 1176.45e6; % L5 (or 2492.028e6 for S, 1575.42e6 for L1)
stepTime = 0.02; % 20 ms for L5/S, 10 ms for L1
NavIC L1 is completely different from L5/S (SBOC, IZ4 codes, support file download). See references/navic-pipeline.md §NavIC L1 SPS.
See references/gps-pipeline.md, references/galileo-pipeline.md, or references/navic-pipeline.md for full signal type tables.
Step 2: Set up satellite scenario (SCENARIO MODE ONLY)
Skip this step entirely in custom mode.
Create the scenario, ground station, and timing (shared). Then add satellites using the constellation-specific method.
sc = satelliteScenario;
rx = groundStation(sc, lat, lon, Altitude=alt);
rx.MinElevationAngle = 10;
waveDuration = 10; % seconds
sc.StartTime = startTime;
sc.StopTime = sc.StartTime + seconds(waveDuration - stepTime);
sc.SampleTime = stepTime;
Add satellites (constellation-specific). Default to almanac unless the
user explicitly has a RINEX file or asks for RINEX. The almanac path avoids
a Navigation Toolbox dependency (rinexread). The same source must feed
Step 4 (nav data encoding).
GPS (almanac path — preferred):
sat = satellite(sc, "gpsAlmanac.txt", OrbitPropagator="gps");
GPS (RINEX path): Check ~isempty(ver('nav')) first. If Navigation
Toolbox is unavailable, use almanac or parse RINEX manually
(see references/rinex-integration.md).
rinexdata = rinexread(rinexFileName);
sat = satellite(sc, rinexdata, OrbitPropagator="gps");
Galileo (almanac path — preferred) -- satellite() does NOT accept
Galileo XML almanac files. Use the helper:
sat = HelperAddGalileoSatellitesToScenario(sc, "galileoAlmanac.xml");
Galileo (RINEX path): Same toolbox check; fall back to almanac if unavailable.
rinexdata = rinexread(rinexFileName);
sat = satellite(sc, rinexdata);
NavIC -- RINEX only (requires Navigation Toolbox).
Use HelperAddSatellite(sc, selectedRows) — see references/navic-pipeline.md.
Critical: Use the same startTime and data source (almanac OR RINEX)
for both orbit propagation (this step) and nav data encoding (Step 4).
Verify: After adding satellites, check sat is non-empty. For GPS
almanac, expect ~30 satellites total in the scenario.
Step 3: Compute channel parameters from physics (SCENARIO MODE ONLY)
Skip this step entirely in custom mode — go to Step 3c instead.
dopShifts = dopplershift(sat, rx, Frequency=centerFrequency).';
ltncy = latency(sat, rx).';
Compute SNR from free-space path loss:
DtLin = db2pow(12); % Transmit antenna directivity
DrLin = db2pow(4); % Receive antenna directivity
k = physconst("boltzmann");
T = 300; % Temperature (K)
Pr = Pt*DtLin*DrLin ./ ((4*pi*(centerFrequency + dopShifts).*ltncy).^2);
snrs = 10*log10(Pr/(k*T*sampleRate)) + 3;
| Constellation | Pt (Transmit Power) |
|--------------|----------------------|
| GPS | 44.8 W |
| Galileo | 160 W |
| NavIC | 50 W |
Find visible satellites (non-NaN latency at first time step):
satIndices = find(~isnan(ltncy(1,:)));
Verify: numel(satIndices) should be >= 4 (minimum for positioning).
If zero, the start time does not match the data source epoch (Gotcha #12).
Step 3c: Set up custom channel parameters (CUSTOM MODE ONLY)
Skip this step entirely in scenario mode.
The user provides Doppler, delay, and/or SNR values directly.
numSats = 4;
dopShifts = [2000, -1500, 800, 3200]; % Hz per satellite
ltncy = [0.072, 0.074, 0.069, 0.078]; % seconds per satellite
snrs = [-10, -12, -11, -9]; % dB per satellite
% For time-varying custom values, use matrices (numsteps x numSats)
% dopShifts = [...]; % each row is one time step
waveDuration = 10; % seconds
numsteps = round(waveDuration / stepTime);
satIndices = 1:numSats;
Required from user: number of satellites, Doppler (Hz), delay (s), PRN/SVID list. Optional (defaults): SNR (-10 dB), duration (10 s), time-varying (no, static).
Expand static values for the generation loop:
if isvector(dopShifts) && size(dopShifts,1) == 1
dopShifts = repmat(dopShifts, numsteps, 1);
ltncy = repmat(ltncy, numsteps, 1);
snrs = repmat(snrs, numsteps, 1);
end
No physical constraint validation in custom mode. The user may intentionally provide extreme values. Do NOT assert against physical ranges.
Step 4: Encode navigation data (BOTH MODES, constellation-specific)
Navigation data carries ephemeris the receiver needs for position estimation.
If user needs real ephemeris (position estimation):
- Use the same data source as the scenario (Step 2)
- If RINEX was used for the scenario, use RINEX for nav data too (preferred)
- Almanac supplements non-ephemeris fields only (health bits, almanac pages)
- Start time for nav data encoding MUST match scenario start time — mismatched times produce nav bits that don't correspond to satellite positions, causing silent position estimation errors
If user only needs signal-level testing (acquisition/tracking):
- Random bits are acceptable:
navdata = randi([0 1], numsteps, numSats); - No almanac or RINEX files needed at all
- Waveform will have correct modulation and channel but nav decode will fail
Critical: When RINEX was used for orbit propagation in Step 2, you MUST
use HelperGPSRINEX2Config (not HelperGPSAlmanac2Config) for nav data
encoding. The same RINEX struct feeds both orbit and ephemeris. Falling back
to almanac for nav data while using RINEX for the scenario violates the
single-source principle and may produce inconsistent ephemeris.
**Scenario mode with real ephemeris
Truncated for display — read the full file on GitHub.
Related Skills
ai-job-search
44.9kThe job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.
claude-howto
41.7kA visual, example-driven guide to Claude Code — from basic concepts to advanced agents, with copy-paste templates that bring immediate value.
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
pptx
177.9kUse this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an em…
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
