matlab-generate-5g-waveform — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited matlab-generate-5g-waveform (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Generate standard-compliant 5G NR downlink and uplink waveforms for test and measurement, simulation, and verification using nrWaveformGenerator.
UL: PUSCH, PUCCH, SRS)
nrCDLChannel, nrTDLChannelnrPDSCHDecode, nrDLSCHDecoder| Need | API |
|---|---|
| Custom DL waveform | nrDLCarrierConfig + nrWaveformGenerator |
| Custom UL waveform | nrULCarrierConfig + nrWaveformGenerator |
| Standard test model (TM) or FRC | hNRReferenceWaveformGenerator |
Do not use primitive-level functions (nrCarrierConfig + nrPDSCH + nrOFDMModulate) for waveform generation, and do not mix primitive config objects (nrPDSCHConfig, nrPUSCHConfig, nrCarrierConfig) with nrWaveformGenerator — use the nrWavegen* objects. nrWaveformGenerator handles channel multiplexing, power scaling, and OFDM modulation correctly. Full function catalog, property names, and the incompatible-object table: references/api-reference.md.
which auto-sizes SCSCarriers, BandwidthParts, SSBurst/CORESET (DL), and a default PDSCH/PUSCH to the bandwidth:
cfg = nrDLCarrierConfig('FR1', 20, 30); % DL: FR1, 20 MHz, 30 kHz SCS
cfg = nrULCarrierConfig('FR1', 20, 15); % UL: FR1, 20 MHz, 15 kHz SCSFor DL, if the requested SCS differs from the default SSB numerology the constructor adds a dedicated SSB SCS carrier (e.g. nrDLCarrierConfig('FR1', 5, 30) adds a hidden 15 kHz carrier). Pre-R2026a, or to control the SCS-carrier count exactly, build manually with nrDLCarrierConfig (no args).
non-defaults such as cfg.PDSCH{1}.Modulation = '64QAM';. Never overwrite a constructor-placed value with a different one (e.g. forcing NStartBWP = 0 when the constructor centered it) — that breaks the validated layout.
validateConfig checks structural rules but does notcatch channel conflicts (overlapping PDSCH/CSI-RS, CSI-RS/SSBurst); always run the generator, which returns the waveform and the resource-grid info:
[waveform, info] = nrWaveformGenerator(cfg);What the simplified constructor builds is generation-ready as-is — an unedited nrDLCarrierConfig(fr, bw, scs) or nrULCarrierConfig(fr, bw, scs) generates for every FR1/FR2 bandwidth/SCS combination, so do not re-check what it set. This does not apply to the no-argument nrDLCarrierConfig / nrULCarrierConfig, whose defaults (15 kHz, Case A SSB, 52-RB PRBSet) must be resized by hand. One silent caveat: at 3 MHz / 15 kHz the SSB is wider than the 15-RB carrier, so the PBCH is punctured — this is expected; keep the SSB (details in Critical Rules). Check the Critical Rules for whatever you change or build by hand: a no-argument (manual) carrier, an edited NSizeGrid/BWP/CORESET/PRBSet, a BlockPattern override, an added SCS carrier or BWP (Point A centering), CSI-RS or PDCCH across BWPs, or 2 codewords (layers/DM-RS). Those edits cause the most generation failures.
Set every property the task requires — including parameters forced by a requested feature, even when the prompt never names them — and nothing else. For example, 2 codewords → NumLayers 5–8 → a DM-RS that supports more than 4 ports (see Critical Rules); a requested CSI-RS → CSIRS{1}.Enable = true (off by default). These are required, not over-config. SSBurst is already enabled by default, so a requested SS burst needs no Enable line.
Open the reference that matches the task; each has copy-ready, verified code:
power spectrum): references/patterns.md
The simplified constructor already handles these — skip this reference when you use it. Open it only for a no-argument build (pre-R2026a, or to avoid the auto-added SSB carrier), where the defaults fail and need NSizeGrid = 11, a disabled/rehomed SSB, a shrunk CORESET, AL1, and an explicit PRBSet: references/narrow-band-manual-config.md
references/multi-bwp-guidance.md
helper hNRReferenceWaveformGenerator(RC, BW, SCS) (e.g. 'DL-FRC-FR1-64QAM', 'NR-FR1-TM1.1'), then generateWaveform + displayResourceGrid. It is not on the path by default: first make it available with a portable setup (setupExample('5g/NRTestModelWaveformGenerationExample', ...) + copyfile + cd, or openExample) — never a hardcoded path, never a made-up namespaced name. Valid names, portable-setup block, and makeConfigWritable edits: references/test-models-and-frc.md
info, correct propertynames): references/api-reference.md
references/documentation-links.md
info.ResourceGrids(k).ResourceGridBWP (BWP-sized, one per BWP); use ResourceGridInCarrier only for a full-carrier view. The SS burst is a separate grid — when SSBurst.Enable is true and the SS burst is asked for, also plot info.ResourceGridSSBurst.ResourceGrid (it is not part of ResourceGridBWP).m script and open it in the MATLAB editor with edit('scriptName.m')nrDLCarrierConfig('FR1', bw, scs) when possibleDMRSPower (not PowerDMRS), PTRSPower (not PowerPTRS), NSizeGrid (not NRB), ChannelBandwidth (not Bandwidth)SCSCarriers, BandwidthParts, CORESET, PDSCH, PUSCH are cell arrays — use {}; SSBurst is a direct object — use . not {}tiledlayout/nexttile for multi-panel figures; always label axes with units and include figure titlesNSizeGrid, why SSBurst is disabled, why a specific AggregationLevel) so the code explains itselfCopyright 2026 The MathWorks, Inc.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.