mcpField
M
matlab-generate-wlan-waveform

matlab-generate-wlan-waveform

github.com/matlab其他1.2k63 次安装1 天前更新
代码仓库

关于 matlab-generate-wlan-waveform

此 MATLAB 技能指导生成符合 IEEE 802.11 标准的 WLAN 时域 IQ 波形,面向设备测试、链路级仿真和信号分析。内容涵盖 PHY 格式配置、载荷长度规划、波形生成与绘图验证,并包括 OFDMA 和 MU-MIMO 场景。

主要功能

  1. 01覆盖多代 IEEE 802.11 PHY 格式
  2. 02配置带宽、MCS 和空间流
  3. 03按目标时长规划载荷
  4. 04生成 MAC 帧或随机比特
  5. 05生成并绘制 IQ 波形

适用场景

  1. 01生成设备测试用 Wi-Fi 波形
  2. 02构建链路级仿真的发送端
  3. 03配置 OFDMA 资源单元分配
  4. 04制作指定时长的数据包

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-generate-wlan-waveform

安装后在 Claude Code 中输入/matlab-generate-wlan-waveform确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

manifest.yaml
references/
documentation-links.md
eht-allocation-indices.md
he-allocation-indices.md
mac-frame-properties.md
multi-packet-waveforms.md
trigger-based-uplink.md
uhr-waveform-generation.md

详细介绍

生成 WLAN 波形

生成符合标准的 IEEE 802.11 波形,用于设备测试、链路级 仿真或信号分析。本技能涵盖发射链路:配置 PHY 格式、设置负载大小、生成时域 IQ 波形并绘图。

适用场景

  • 为任意 802.11 标准生成 WLAN/Wi-Fi 测试波形
  • 创建链路级仿真的发射端
  • 构建具有特定 MAC 帧类型(Data、Block Ack、Beacon 等)的数据包
  • 配置 OFDMA 资源单元分配(HE-MU、EHT-MU 或 UHR-MU)
  • 配置 MU-MIMO 传输(VHT、HE、EHT、UHR)
  • UHR 功能:UEQM(按流设置 MCS)、DRU、LDPC2x、ELR(增强型长距离)
  • 针对特定数据包时长或发射时间

不适用场景

  • 信道建模、接收机处理、EVM/频谱掩模——不在涵盖范围内
  • 非 WLAN 波形(5G NR、LTE、Bluetooth)

UHR(802.11bn)需要 R2026a 或更高版本。 如果用户请求生成 UHR 波形, 而其版本较旧,请告知他们 UHR 支持从 R2026a 开始提供,并建议升级。

工作流

每次波形生成都遵循以下流程:

  1. 选择格式 → 创建配置对象(参见“格式选择”)
  2. 配置 PHY → 设置带宽、MCS、空间流和天线
  3. 设置负载大小 → 直接设置 PSDU/APEP 长度,或根据目标时长设置
  4. 创建负载比特 → 随机比特,或通过 wlanMACFrame 创建 MAC 帧
  5. 生成波形 → wlanWaveformGenerator(bits, cfg)
  6. 绘图并验证 → 时域幅度;对于 HE/EHT/UHR 配置,使用 showAllocation

格式选择

标准市场名称配置对象用户类型
802.11bWi-Fi 1wlanNonHTConfig(DSSS)仅 SU
802.11a/gWi-Fi 1/3wlanNonHTConfig仅 SU
802.11nWi-Fi 4wlanHTConfig仅 SU
802.11acWi-Fi 5wlanVHTConfigSU 或 MU-MIMO
802.11axWi-Fi 6wlanHESUConfig仅 SU
802.11axWi-Fi 6wlanHESUConfig(ExtendedRange)SU — 扩展覆盖范围
802.11axWi-Fi 6wlanHEMUConfig(allocIdx)OFDMA 和/或 MU-MIMO
802.11axWi-Fi 6wlanHETBConfigSU 上行链路(基于触发)
802.11beWi-Fi 7wlanEHTMUConfig(allocIdx)OFDMA 和/或 MU-MIMO / MRU
802.11beWi-Fi 7wlanEHTMUConfig("CBW...")非 OFDMA MU-MIMO(全带宽 RU)
802.11beWi-Fi 7wlanEHTMUConfig("CBW...", EHTDUPMode=true)SU — DUP 模式(仅 MCS 14)
802.11beWi-Fi 7wlanEHTTBConfigSU 上行链路(基于触发)
802.11bnWi-Fi 8uhrMUConfig(allocIdx)OFDMA / MU-MIMO / UEQM(示例辅助函数)
802.11bnWi-Fi 8uhrMUConfig("CBW...")非 OFDMA MU-MIMO(示例辅助函数)
802.11bnWi-Fi 8uhrTBConfigSU 上行链路 / DRU(示例辅助函数)
802.11bnWi-Fi 8uhrELRConfigSU 增强型长距离(示例辅助函数)

对于 OFDMA 格式(HE-MU、EHT-MU),构造函数接受的是分配索引, 而不是 RU 大小。请参阅 references/he-allocation-indices.md 和 references/eht-allocation-indices.md。

UHR(802.11bn / Wi-Fi 8)使用示例辅助文件,而非工具箱内置对象。 使用 setupExample("wlan/UHRParameterizationExample", scriptFolder) 将辅助文件复制到脚本的工作文件夹。 UHR 支持 UEQM(按流设置 MCS)、DRU、LDPC2x、ELR(增强型长距离)以及新的 MCS 值(15-23)。分配索引与 EHT 相同。请参阅 references/uhr-waveform-generation.md。

有关格式特定的约束(分配索引方案、 HT MCS 编码、DSSS 属性),请参阅关键规则。

EHT DUP 模式会在各子信道上复制信号,以实现稳健覆盖。 在构造时设置:wlanEHTMUConfig("CBW80", EHTDUPMode=true)。约束条件: 仅支持 MCS 14(BPSK-DCM)、单用户、1 个空间流、不允许打孔, 以及 80/160/320 MHz。构造后 EHTDUPMode 为只读属性。

按时长设定

根据目标时长计算载荷大小。所有数值均为整数微秒。

配置函数示例
wlanNonHTConfigwlanPSDULength(cfg, 'TxTime', us)cfg.PSDULength = wlanPSDULength(cfg, 'TxTime', 500);
wlanHTConfigwlanPSDULength(cfg, 'TxTime', us)cfg.PSDULength = wlanPSDULength(cfg, 'TxTime', 1000);
wlanVHTConfig(仅 SU)wlanAPEPLength(cfg, 'TxTime', us)cfg.APEPLength = wlanAPEPLength(cfg, 'TxTime', 2000);
wlanHESUConfigwlanAPEPLength(cfg, 'TxTime', us)cfg.APEPLength = wlanAPEPLength(cfg, 'TxTime', 3000);
wlanEHTMUConfig(SU 非 OFDMA)wlanAPEPLength(cfg, 'TxTime', us)cfg.User{1}.APEPLength = wlanAPEPLength(cfg, 'TxTime', 1000);
任意 MU/OFDMA 配置迭代 transmitTime 循环见下文 — wlanAPEPLength 在 MU/OFDMA 配置下会报错

**时长参数的单位是整数微秒,而非秒。**传入 2000,而不是 2e-3。

MU 时长设定(迭代)

对于任意 MU 配置(用户同质,即使用相同的 MCS、RU 大小和空间流):

targetDuration = 1e-3; apepLen = 2000; % initial guess
for iter = 1:10
    for u = 1:numUsers, cfg.User{u}.APEPLength = apepLen; end
    txTime = transmitTime(cfg);
    if abs(txTime - targetDuration)/targetDuration < 0.01, break; end
    apepLen = round(apepLen * targetDuration / txTime);
end

**异质用户(MCS/RU/STS 不同):**容量最低的用户决定时长。 根据流量需求为每个用户设置 APEPLength;使用 transmitTime(cfg)。

获取 PSDU 长度

获取 PSDU 长度的方式因格式而异。使用错误的方式会导致报错。

配置获取 PSDU 长度的方式备注
wlanNonHTConfigcfg.PSDULength可设置的属性
wlanHTConfigcfg.PSDULength可设置的属性
wlanVHTConfigcfg.PSDULength只读属性(根据 APEPLength 推导)。MU 时为向量。
wlanHESUConfiggetPSDULength(cfg)方法调用。不是属性。
wlanHEMUConfiggetPSDULength(cfg)方法调用。返回向量(每个用户一个值)。
wlanHETBConfiggetPSDULength(cfg)方法调用。与 HE-SU/HE-MU 相同。
wlanEHTMUConfigpsduLength(cfg)方法名与 HE 不同。返回向量。
wlanEHTTBConfigpsduLength(cfg)方法名与 EHT-MU 相同。

**getPSDULength 和 psduLength 不能互换。**HE 使用 getPSDULength。EHT 使用 psduLength。

主要函数

函数用途
wlanWaveformGenerator(bits, cfg)生成时域 IQ 波形
wlanSampleRate(cfg)获取配置的采样率 — 始终使用此函数
wlanHETBConfig配置基于 HE 触发的上行链路(单个 STA)
wlanEHTTBConfig配置基于 EHT 触发的上行链路(单个 STA)
wlanMACFrame(payload, cfgMAC)生成 MAC 帧比特(见 references/mac-frame-properties.md)
wlanAPEPLength(cfg, 'TxTime', us)目标时长对应的 APEP 长度(VHT-SU、HE-SU、EHT-MU 单用户)
wlanPSDULength(cfg, 'TxTime', us)目标时长对应的 PSDU 长度(NonHT/HT)
transmitTime(cfg) 或 transmitTime(cfg, 'microseconds')获取传输时长 — 使用单位参数,而不是 * 1e6
showAllocation(cfg) 或 showAllocation(cfg, ax)绘制 RU 分配 — 传入坐标区句柄,以嵌入 tiledlayout
ruInfo(cfg)查询 RU 大小、索引和用户数

如果需要验证属性名称、查看配置对象的有效值,或查找此技能未涵盖的参数,请参阅 references/documentation-links.md 中的在线文档链接。

模式

具有目标时长的单用户波形
cfg = wlanVHTConfig;
cfg.ChannelBandwidth = 'CBW80';
cfg.MCS = 9;
cfg.NumTransmitAntennas = 4;
cfg.NumSpaceTimeStreams = 4;
cfg.SpatialMapping = 'Fourier';

% Size payload for 2 ms transmit time
cfg.APEPLength = wlanAPEPLength(cfg, 'TxTime', 2000);

% Generate waveform: 3 packets, 20 us idle
psduBits = randi([0 1], cfg.PSDULength * 8, 1);
waveform = wlanWaveformGenerator(psduBits, cfg, ...
    'NumPackets', 3, 'IdleTime', 20e-6);

fs = wlanSampleRate(cfg);
DSSS(802.11b)波形
cfg = wlanNonHTConfig;
cfg.Modulation = 'DSSS';
cfg.DataRate = '11Mbps';   % '1Mbps', '2Mbps', '5.5Mbps', or '11Mbps'
cfg.PSDULength = 1000;

psduBits = randi([0 1], cfg.PSDULength * 8, 1);
waveform = wlanWaveformGenerator(psduBits, cfg);
fs = wlanSampleRate(cfg);  % 11 MHz (chip rate)
HE-MU OFDMA 波形

对于 OFDMA,构造函数接受每个 20 MHz 子信道的分配索引。 完整的索引到 RU 映射请参阅 references/he-allocation-indices.md。

% 80 MHz, four 242-tone RUs (index 192 = one 242-tone RU per subchannel)
cfg = wlanHEMUConfig([192 192 192 192]);
cfg.NumTransmitAntennas = 4;

% Configure per-user parameters
for u = 1:4
    cfg.User{u}.MCS = u + 6;               % MCS 7, 8, 9, 10
    cfg.User{u}.NumSpaceTimeStreams = 1;
    cfg.User{u}.APEPLength = 4000;
    cfg.User{u}.ChannelCoding = 'LDPC';
end

% Use Fourier spatial mapping when NumSTS < NumTransmitAntennas per RU
for r = 1:numel(cfg.RU)
    cfg.RU{r}.SpatialMapping = 'Fourier';
end

% Generate PSDU bits per user
psduLen = getPSDULength(cfg);
txData = cell(1, numel(psduLen));
for u = 1:numel(psduLen)
    txData{u} = randi([0 1], psduLen(u) * 8, 1);
end

waveform = wlanWaveformGenerator(txData, cfg);
showAllocation(cfg);

常见 HE 分配索引(每个 20 MHz 子信道):

索引RU 布局用户数
0九个 26-tone9
96两个 106-tone2
112四个 52-tone4
192一个 242-tone1
193一个 242-tone2(MU-MIMO)
200一个 484-tone(40 MHz 对)1
208一个 996-tone(80 MHz 四元组)1

对于 40 MHz,提供 2 个索引。对于 80 MHz,提供 4 个。对于 160 MHz,提供 8 个。

EHT-MU OFDMA 波形(含 MRU)

EHT 分配索引支持多资源单元(MRU)——分配给单个用户的非连续音调块。完整映射请参阅 references/eht-allocation-indices.md。

% 80 MHz: 484+242 MRU on subchannels 1-3, 106+26+106 on subchannel 4
% Index 120 = 484+242 MRU (1 MU-MIMO user), 29/28 = continuation, 25 = 106+26+106
cfg = wlanEHTMUConfig([120 29 28 25]);
cfg.NumTransmitAntennas = 2;

% Set APEPLength appropriate to RU size (26-tone RUs have low throughput)
apepPerUser = [2000, 500, 100, 500]; % MRU, 106-tone, 26-tone, 106-tone
mcsPerUser  = [7, 4, 2, 4];
for u = 1:numel(cfg.User)
    cfg.User{u}.APEPLength = apepPerUser(u);
    cfg.User{u}.MCS = mcsPerUser(u);
    cfg.User{u}.NumSpaceTimeStreams = 1;
    cfg.User{u}.ChannelCoding = 'LDPC';
end

for r = 1:numel(cfg.RU)
    cfg.RU{r}.SpatialMapping = 'Fourier';
end

% EHT uses psduLength(), NOT getPSDULength()
psduLens = psduLength(cfg);
txData = cell(1, numel(psduLens));
for u = 1:numel(psduLens)
    txData{u} = randi([0 1], psduLens(u) * 8, 1);
end

waveform = wlanWaveformGenerator(txData, cfg);
showAllocation(cfg);

**EHT 延续索引:**当 RU 跨越多个 20 MHz 子信道时,为额外的子信道使用延续索引:

  • 28 — 子信道属于更大的 242-tone 分配
  • 29 — 子信道属于 484-tone 分配
  • 30 — 子信道属于 996-tone 分配
VHT MU-MIMO 波形
cfg = wlanVHTConfig;
cfg.ChannelBandwidth = 'CBW80';
cfg.NumUsers = 2;
cfg.NumTransmitAntennas = 4;
cfg.NumSpaceTimeStreams = [2 2];
cfg.MCS = [8 8];
cfg.APEPLength = [1024 1024];
cfg.GroupID = 2;                    % MU-MIMO: must be 1-62
cfg.SpatialMapping = 'Fourier';    % Required when total STS < NumTxAntennas

psduLen = cfg.PSDULength;           % Read-only vector for MU
txData = cell(1, cfg.NumUsers);
for u = 1:cfg.NumUsers
    txData{u} = randi([0 1], psduLen(u) * 8, 1);
end

waveform = wlanWaveformGenerator(txData, cfg);
非 OFDMA MU-MIMO 波形(EHT 和 HE)

当用户请求不使用 OFDMA 的 MU-MIMO(所有用户共享单个全带宽 RU)时,使用以下模式。如果用户提到“MU-MIMO”,但未提及 OFDMA 或多个 RU,则默认使用非 OFDMA。

EHT — 使用字符串构造函数(无需分配索引):

% 80 MHz, 2 MU-MIMO users on a single 996-tone RU (non-OFDMA)
cfg = wlanEHTMUConfig("CBW80", NumUsers=2);
cfg.NumTransmitAntennas = 4;
cfg.User{1}.NumSpaceTimeStreams = 2;
cfg.User{1}.MCS = 9;
cfg.User{1}.APEPLength = 4000;
cfg.User{1}.ChannelCoding = 'LDPC';
cfg.User{2}.NumSpaceTimeStreams = 2;
cfg.User{2}.MCS = 7;
cfg.User{2}.APEPLength = 4000;
cfg.User{2}.ChannelCoding = 'LDPC';
cfg.RU{1}.SpatialMapping = 'Fourier';

psduLens = psduLength(cfg);
txData = cell(1, numel(psduLens));
for u = 1:numel(psduLens)
    txData{u} = randi([0 1], psduLens(u) * 8, 1);
end
waveform = wlanWaveformGenerator(txData, cfg);

有效带宽:"CBW20"、"CBW40"、"CBW80"、"CBW160"、"CBW320"。 最多支持 8 个用户。支持通过 PuncturedChannelFieldValue 进行打孔。

HE — 没有字符串构造函数;使用全带宽分配索引:

带宽N 个用户的索引零用户索引
20 MHz192 + N - 1不适用
40 MHz[200 + N - 1, 114]114
80 MHz[208 + N - 1, 115, 115, 115]115
160 MHz[216 + N - 1, 115, 115, 115, 115, 115, 115, 115]115

遵循与上述 EHT 相同的逐用户/逐 RU 模式,并使用 getPSDULength(cfg) 代替 psduLength(cfg)。示例:对于 80 MHz、2 个用户,使用 cfg = wlanHEMUConfig([209 115 115 115])。

MAC 帧载荷

有关以下内容,请参阅 references/mac-frame-properties.md:

  • 参数顺序、载荷格式(十六进制八位组)和 PHY 配置要求
  • 帧类型、属性和聚合(A-MSDU、A-MPDU)
  • 常见错误和调用约定
多数据包波形

有关以下内容,请参阅 references/multi-packet-waveforms.md:

  • 使用 wlanMSDULengths(uint8 MSDU 元胞数组)进行 A-MPDU 聚合
  • 多数据包波形 — 相同格式(NumPackets、IdleTime)或混合格式的拼接,并采用 SIFS/DIFS/PIFS 间隔

速查 — 帧间间隔:SIFS=16 μs,DIFS=34 μs,PIFS=25 μs。

基于触发的(TB)上行链路

有关以下内容,请参阅 references/trigger-based-uplink.md:

  • HE TB(wlanHETBConfig)、EHT TB(wlanEHTTBConfig)、UHR TB(uhrTBConfig)
  • ruInfo(cfgMU) 返回的 RUSize/RUIndex、LTF 符号、OversamplingFactor
  • UHR DRU — 分布式资源单元及 DBW/RU 大小规则

约定

  • 生成波形后,除非用户提出了具体要求:
    1. 告知用户波形变量名、大小和采样率
    2. 绘制时域波形幅度图,并以毫秒为时间轴单位
    3. 对于 HE、EHT 或 UHR 配置,调用 showAllocation(cfg)
    4. 按照 matlab-create-live-script 技能格式(%[text] 标记、%% 分节、必需的附录),将生成代码保存为纯文本 Live Code .m 文件。使用 edit('scriptName.m') 在编辑器中打开。
  • UHR 脚本使用工作文件夹——使用 setupExample 将辅助文件复制到与脚本相同的文件夹中。请参阅 references/uhr-waveform-generation.md。
  • 单用户有效载荷是普通列向量——只有多用户时才使用元胞数组。使用 wlanWaveformGenerator(bits, cfg),而不是 wlanWaveformGenerator({bits}, cfg)。
  • 始终使用 wlanSampleRate(cfg)——切勿硬编码。对于 UHR 配置,使用 wlanSampleRate(cfg.ChannelBandwidth)(目前尚不支持 UHR 对象)。
  • OFDMA 带宽为只读——根据分配索引向量的长度推断(1→20、2→40、4→80、8→160 MHz)。
  • 单位:IdleTime 的单位为秒(20e-6)。时长函数使用整数微秒(2000)。OversamplingFactor 乘以 wlanSampleRate。transmitTime(cfg, 'microseconds')——显示时使用单位参数,而不是 * 1e6。有效单位:'seconds'、'milliseconds'、'microseconds'、'nanoseconds'。
  • 使用 ruInfo(cfg) 验证多用户配置——构造任何 OFDMA 或 MU-MIMO 配置后,调用 ruInfo 并检查 NumUsers、NumUsersPerRU 和 RUSizes 是否与请求一致。错误的分配索引会静默地产生错误的用户数量。
  • **ruInfo:**HE 返回数值数组。EHT 返回元胞数组(支持 MRU)。
  • **绘图:**使用 tiledlayout/nexttile(而不是 subplot)。showAllocation(cfg, ax) 可嵌入现有布局。

关键规则

这些限制最容易导致错误。调用 wlanWaveformGenerator 前请先检查。

不同格式的 PSDU 长度获取方法不同

使用错误的访问器会抛出“Undefined function”错误,或静默地产生错误结果。

格式获取 PSDU 长度的方法错误做法
Non-HT、HTcfg.PSDULength(属性)getPSDULength(cfg) — 会报错
VHTcfg.PSDULength(只读)设置该属性 — 会报错
HE-SU、HE-MU、HE-TBgetPSDULength(cfg)psduLength(cfg) — 会报错
EHT-MU、EHT-TBpsduLength(cfg)getPSDULength(cfg) — 会报错
分配索引不是 RU 大小

wlanHEMUConfig(242) 无效。242 音调 RU 应使用 wlanHEMUConfig(192)。wlanEHTMUConfig(242) 同样无效——应使用 wlanEHTMUConfig(64)。请务必查阅分配索引参考表。

**HE 和 EHT 使用完全不同的索引方案。**242 音调 RU 在 HE 中的索引为 192,在 EHT 中则为 64。切勿混用。

HE-MU 多子信道 RU 索引用于指示每个内容信道中的用户数量——请参阅 references/he-allocation-indices.md。

前导码打孔与 STAID=2046
目标HEEHT(OFDMA)EHT(非 OFDMA)
完全打孔子信道分配索引 113分配索引 26构造时设置 PuncturedChannelFieldValue
仅禁用用户数据STAID=2046STAID=2046—

STAID=2046 不会打孔——它只会禁用一个用户的数据。

非 OFDMA 打孔使用 PuncturedChannelFieldValue(80 MHz 时取值为 1–4,对应子信道 1–4)。必须在构造时设置: wlanEHTMUConfig("CBW80", NumUsers=2, PuncturedChannelFieldValue=3)

空间映射规则
NumSpaceTimeStreams < NumTransmitAntennas per RU  →  SpatialMapping = 'Fourier'
NumSpaceTimeStreams == NumTransmitAntennas         →  SpatialMapping = 'Direct'

当 STS < 天线数时,使用 'Direct' 会导致维度不匹配错误。

MU-MIMO 默认采用非 OFDMA 模式

用户只提到“MU-MIMO”,未提及 OFDMA 或多个 RU 时, 默认采用非 OFDMA 模式(所有用户共享一个全带宽 RU):

  • EHT: wlanEHTMUConfig("CBW80", NumUsers=N)
  • HE: 全带宽分配索引(请参阅“模式”部分)
基于 ruInfo 的触发式 RUIndex

TB 配置中的 RUIndex 值是来自 ruInfo(cfgMU).RUIndices 的基于子载波的位置,不是顺序 RU 编号。使用错误的 索引会导致子载波重叠错误。

仅可在构造时设置的属性

wlanEHTMUConfig 的 EHTDUPMode、PuncturedChannelFieldValue 和 NumUsers 属性在构造后为只读——请在构造函数中将它们作为名称-值对传入。完整列表和示例请参阅 references/eht-allocation-indices.md。

特定格式的约束
约束详情
HT MCS 编码空间流数MCS 0-7 = 1 SS,8-15 = 2 SS,16-23 = 3 SS,24-31 = 4 SS。设置 NumSpaceTimeStreams = floor(MCS/8) + 1。
DSSS 没有 OFDM 属性使用 DataRate('1Mbps'...'11Mbps')。没有 ChannelBandwidth、MCS、NumTransmitAntennas 或 NumSpaceTimeStreams。
HE ER + Upper106ToneRU将 MCS 限制为 0。242 音调 ER 变体允许 MCS 0-2。
VHT GroupID0/63 = SU。1-62 = MU-MIMO。错误值会被静默接受。
wlanAPEPLength 仅适用于 SU适用于 VHT-SU、HE-SU 和单用户 EHT-MU(非 OFDMA)。任何 MU/OFDMA 配置都会报错——请使用迭代式 transmitTime 循环。
不要捏造 IEEE 版本请引导用户查阅 WLAN Toolbox 发行说明。

版权所有 2026 The MathWorks, Inc.

评论

支持 Markdown