Generated banner for Matlab Generate 5g Waveform
Generated logo for Matlab Generate 5g Waveform

Matlab Generate 5g Waveform

MathWorksOfficialCreated by MathWorks

  • Skill
  • Tool integration
  • Software development
  • BSD-2-Clause
  • No issues found

From the author

Generate 3GPP-compliant 5G NR downlink and uplink baseband waveforms. Use to create NR signals, test model (TM) waveforms, fixed reference channels (FRC), test and measurement (T&M) signals, or test vectors for conformance testing. Covers configuring data, control, and broadcast channels and signals: PDSCH, PUSCH, PDCCH, PUCCH, SRS, SSBurst, CSI-RS, DM-RS, PT-RS, CORESET, and BWP parameters including bandwidth, subcarrier spacing (SCS), modulation (QPSK, QAM), numerology, FR1, FR2, TDD, FDD, and multi-bandwidth-part setups. Use for signal generation, RF instrument playback, or IQ baseband synthesis. Requires 5G Toolbox.
— the description by MathWorks

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured approach to generating standard-compliant 5G New Radio (NR) baseband waveforms using the nrWaveformGenerator function. It covers the configuration of both downlink and uplink channels, including PDSCH, PUSCH, PDCCH, and various reference signals. The workflow emphasizes using simplified constructors for standard configurations while providing guidance for manual adjustments in complex scenarios like multi-bandwidth-part or multi-numerology layouts. It is designed for engineers performing conformance testing, RF instrument playback, or IQ baseband synthesis.

What it does

  • Generates 3GPP-compliant 5G NR downlink and uplink waveforms.
  • Configures data, control, and broadcast channels including PDSCH, PUSCH, PDCCH, and PUCCH.
  • Supports complex setups like multi-bandwidth-part and multi-numerology configurations.
  • Provides methods for creating standard test models (TM) and fixed reference channels (FRC).
  • Handles channel multiplexing, power scaling, and OFDM modulation automatically.
  • Enables visualization of resource grids for verification.

When to use it

  • When you need to generate 5G NR signals for test and measurement or simulation.
  • When creating test vectors for conformance testing.
  • When you need to configure specific bandwidth, subcarrier spacing, or modulation parameters.
  • When you need to generate standard-compliant test model (TM) or fixed reference channel (FRC) waveforms.

Advantages

  • Ensures 3GPP compliance through standardized configuration objects.
  • Simplifies complex waveform generation with automated constructor defaults.
  • Provides a consistent API for both simple and advanced multi-carrier layouts.
  • Reduces configuration errors by separating primitive signal processing from waveform construction.

Usage examples

“Generate a default 5G NR downlink waveform for a 20 MHz channel with 30 kHz subcarrier spacing.”
The agent creates a configuration object using nrDLCarrierConfig('FR1', 20, 30), generates the waveform with nrWaveformGenerator, and displays the resource grid.
“Create a 5G NR test model TM1.1 waveform.”
The agent uses the hNRReferenceWaveformGenerator helper to set up the TM1.1 configuration, generates the waveform, and provides the resource grid information.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/matlab/matlab-generate-5g-waveform/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip matlab-generate-5g-waveform.zip -d .agents/skills

Documentation by MathWorks

Generate 5G NR Waveforms

Generate standard-compliant 5G NR downlink and uplink waveforms for test and measurement, simulation, and verification using nrWaveformGenerator.

When to Use

  • Generate a 5G, NR, or New Radio waveform (DL: PDSCH, PDCCH, SSBurst, CSI-RS; UL: PUSCH, PUCCH, SRS)

  • Generate NR test model (TM) or fixed reference channel (FRC) waveforms

  • Configure bandwidth, SCS, modulation, power, or multi-bandwidth-part layouts

When Not to Use

  • Channel modeling or propagation — use nrCDLChannel, nrTDLChannel

  • Receiver processing or decoding — use nrPDSCHDecode, nrDLSCHDecoder

  • Link-level simulation end-to-end

API Choice

NeedAPI
Custom DL waveformnrDLCarrierConfig + nrWaveformGenerator
Custom UL waveformnrULCarrierConfig + nrWaveformGenerator
Standard test model (TM) or FRChNRReferenceWaveformGenerator

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.

Core Workflow (custom DL/UL)

  1. Create the carrier config with the simplified constructor (R2026a+), 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 SCS

For 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).

  1. Customize only what the task requires (see the rule below). Set 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.

  2. Generate — validateConfig checks structural rules but does not catch 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 Only What the Task Requires

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.

Recipes and References

Open the reference that matches the task; each has copy-ready, verified code:

  • Common single-carrier waveforms (Basic DL with dual-grid plot, Basic UL, power spectrum): references/patterns.md

  • Narrow-band 11-RB carriers, manual build only (5 MHz/30 kHz, 10 MHz/60 kHz). 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

  • Multi-BWP / multi-numerology layouts: references/multi-bwp-guidance.md

  • Test models (TM) and fixed reference channels (FRC) — use the example 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

  • Full API catalog + output structure (fields of info, correct property names): references/api-reference.md

  • Online documentation links: references/documentation-links.md

Conventions

  • After generating a waveform, unless the user asks for something specific:

    1. Tell the user the waveform variable name and that it is in the workspace

    2. Plot the resource grid from 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)

    3. Save the generation code as a .m script and open it in the MATLAB editor with edit('scriptName.m')

  • Start with the simplified constructor nrDLCarrierConfig('FR1', bw, scs) when possible

  • Correct property names: DMRSPower (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 {}

  • Use tiledlayout/nexttile for multi-panel figures; always label axes with units and include figure titles

  • Comment non-obvious, interdependent choices (why a given NSizeGrid, why SSBurst is disabled, why a specific AggregationLevel) so the code explains itself

Copyright 2026 The MathWorks, Inc.

Files

references/test-models-and-frc.md

Test Models and Fixed Reference Channels

Use hNRReferenceWaveformGenerator to generate standard-defined NR test model (TM) and fixed reference channel (FRC) waveforms. This is an example helper shipped with 5G Toolbox (see the 5G NR TM Waveform Generation example).

First: Make the Helper Available (Portable Setup)

hNRReferenceWaveformGenerator is an example helper, not a core toolbox function, so it is not on the path by default. Bring it in with a portable, reproducible mechanism — never a hardcoded absolute path (no user home or release folder), and do not invent a namespaced name like wirelessWaveformApp.internal.hNRReferenceWaveformGenerator:

[exDir, ~] = setupExample('5g/NRTestModelWaveformGenerationExample', fullfile(tempdir, 'tmfrc'));
workDir = fullfile(tempdir, 'myTMWaveform');
mkdir(workDir);
copyfile(fullfile(exDir, '*'), workDir);
cd(workDir);

openExample('5g/NRTestModelWaveformGenerationExample') also works, as does an addpath whose target is derived at runtime from matlabroot/tempdir/the setupExample/openExample return value. Only after this is the helper callable by its plain name.

Basic Usage

wavegen = hNRReferenceWaveformGenerator(RC, BW, SCS, DM, NCELLID);
[waveform, waveinfo] = generateWaveform(wavegen);
ArgumentDescriptionDefault
RCReference channel identifier (see tables below)Required
BWChannel bandwidth: '10MHz', 10, or "10MHz"10 MHz (FR1), 100 MHz (FR2)
SCSSubcarrier spacing: '15kHz', 15, or "15kHz"15 kHz (FR1), 120 kHz (FR2)
DMDuplex mode: 'FDD' or 'TDD'FDD (FR1), TDD (FR2)
NCELLIDPhysical cell ID1 (DL), 0 (UL)

The BW and SCS combination must be valid per the bandwidth table.

RC, BW, and SCS are the arguments you normally supply. DM and NCELLID are optional — pass them only when the task specifies a particular duplex mode or cell ID. Restating their defaults ('FDD', 1) adds nothing:

% Requested: model, bandwidth, SCS only
wavegen = hNRReferenceWaveformGenerator('NR-FR1-TM1.1', '10MHz', '15kHz');

Valid FR1 Test Models

IdentifierDescription
'NR-FR1-TM1.1'Full-band QPSK, single PDSCH
'NR-FR1-TM1.2'Full-band QPSK with boosted/deboosted PRBs
'NR-FR1-TM2'Full-band 64QAM
'NR-FR1-TM2a'Full-band 256QAM
'NR-FR1-TM2b'Full-band 1024QAM
'NR-FR1-TM3.1'Partial-band 16QAM
'NR-FR1-TM3.1a'Partial-band 16QAM, variant
'NR-FR1-TM3.1b'Partial-band 16QAM, variant
'NR-FR1-TM3.2'Partial-band 16QAM/QPSK
'NR-FR1-TM3.3'Partial-band QPSK

Valid FR2 Test Models

IdentifierDescription
'NR-FR2-TM1.1'Full-band QPSK
'NR-FR2-TM2'Full-band 64QAM
'NR-FR2-TM2a'Full-band 256QAM
'NR-FR2-TM3.1'Partial-band 16QAM
'NR-FR2-TM3.1a'Partial-band 16QAM, variant

Valid DL Fixed Reference Channels

FR1: 'DL-FRC-FR1-QPSK', 'DL-FRC-FR1-64QAM', 'DL-FRC-FR1-256QAM', 'DL-FRC-FR1-1024QAM'

FR2: 'DL-FRC-FR2-QPSK', 'DL-FRC-FR2-16QAM', 'DL-FRC-FR2-64QAM', 'DL-FRC-FR2-256QAM'

Valid UL Fixed Reference Channels

FR1: 'G-FR1-Ax-y' format, where x = 1-5 and y varies. Examples: 'G-FR1-A1-1' through 'G-FR1-A5-14'. Full list available via:

hNRReferenceWaveformGenerator.FR1UplinkFRC

FR2: 'G-FR2-Ax-y' format. Full list:

hNRReferenceWaveformGenerator.FR2UplinkFRC

Visualizing the Resource Grid

displayResourceGrid(wavegen);

Modifying Test Model Parameters

The Config property is read-only by default. To customize:

wavegen = makeConfigWritable(wavegen);

% Example: enable transport coding on all PDSCHs
pdschArray = [wavegen.Config.PDSCH{:}];
[pdschArray.Coding] = deal(true);
wavegen.Config.PDSCH = num2cell(pdschArray);

[waveform, waveinfo] = generateWaveform(wavegen);

The Config property is an nrDLCarrierConfig or nrULCarrierConfig object, so all the same customization patterns apply.

Output Structure

[waveform, waveinfo] = generateWaveform(wavegen);
FieldContents
waveinfo.ResourceGridBWPResource grid (subcarriers x symbols)
waveinfo.Info.SampleRateWaveform sample rate
waveinfo.Info.NfftFFT size

Common Mistakes

  • Wrong model name format: Use 'NR-FR1-TM1.1' not 'FR1-TM1.1' or 'TM1.1'. The NR- prefix is required.

  • Function does not exist: If hNRReferenceWaveformGenerator is not found, open the example first: 5G NR TM Waveform Generation. This adds the helper to the MATLAB path.

  • Hallucinated alternatives: nrTMWaveformGenerator, h5gNRTMConfig, nrTestModel, nrRMCDL do not exist. Only hNRReferenceWaveformGenerator is available.

Copyright 2026 The MathWorks, Inc.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
MathWorks
Publisher
MathWorks (Official)
Source
matlab/matlab-agentic-toolkit · skills-catalog/wireless-communications/matlab-generate-5g-waveform · commit 2a7f215
Licence
BSD 2-Clause License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE.md)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by MathWorks.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download matlab-generate-5g-waveform.zip