资讯动态

基于MATLAB的空间调制系统仿真与极大似然检测实现

发布时间:2026/9/16 12:34:05 来源:尧图企业网站定制
简介空间索引调制Spatial Modulation, SM是MIMO中利用发射天线索引携带额外信息的高效传输方案。该MATLAB工程完整实现了这一机制面向无线通信、MIMO系统与信号处理方向的学习者。资源包约4KB共3个m文件分别对应传统空间调制、正交空间调制和广义空间调制便于对比不同索引映射策略。工程从随机二进制信源生成开始依次完成QPSK/QAM符号映射、空间天线选择、AWGN信道模拟、接收端检测及误码率评估流程完整代码结构清晰主函数与辅助函数分工明确读者可通过调整天线数量、调制阶数、SNR范围等参数直接观察系统性能变化。目前已有340人学习适合用作物理层仿真验证和课程设计基础也可进一步与预编码、OFDM等MIMO扩展技术相结合是深入学习空间调制原理的有力起点。1. 天线索引是被大多数人忽略的调制维度做 MIMO 仿真的人习惯把调制维度限定在星座图上QPSK、16-QAM、64-QAM相位和幅度来回折腾却忘了发射天线本身也是一个可以传递信息的自由度。空间索引调制Spatial ModulationSM把这个自由度显式用了起来每个符号时隙只激活一根发射天线激活的是“哪根天线”由比特决定。这个 MATLAB 工程 spatial-modulation-master 提供了 spatial_modulation.m、quadrature_spatial_modulation.m、generalized_spatial_modulation.m 三个可独立运行的脚本覆盖基础 SM、正交空间调制QSM和广义空间调制GSM的实现链路。对研究 MIMO 检测算法、天线选择策略、以及扩频效率评估的工程师来说这份资源可以省掉从论文公式到仿真代码的翻译过程。2. SM 映射与极大似然检测背后的复杂度逻辑2.1 从比特流到天线索引的映射规则SM 的发射端结构和传统 MIMO 有本质区别。V-BLAST 系统里每根天线都发射独立符号流接收端要做多用户检测级的信号分离而 SM 每个时隙只有一根天线工作其余天线保持静默。这样一来串并转换后的每个比特组被拆成两部分一部分决定星座符号另一部分决定激活哪根天线。以 4 发 4 收、QPSK 调制为例每个传输块有 log2(4) 2 比特用于选择天线另有 log2(4) 2 比特用于星座符号频谱效率是 4 bit/s/Hz与单天线 QPSK 相比翻倍但发射机只需要一条射频链路。这个增益不消耗额外功率也不增加天线数完全来自空间维度的编码。天线索引到物理天线的映射不是随意定的。工程实现里常见做法是类格雷映射让相邻天线序号之间尽量少翻转比特因为接收端最容易把激活天线误判为相邻天线。Nt 4 时常用映射如下天线索引比特激活天线编号00天线 101天线 211天线 310天线 4从 01 到 11、从 11 到 10 都只有 1 比特翻转单天线误检时比特错误数被限制在 1 而不是 2。这个细节直接影响高信噪比区间的误码平台值得在代码里专门关注。2.2 信道模型与单天线激活带来的接收信号特征接收端建模采用平坦瑞利衰落信道信道矩阵 H 的每个元素是均值为 0、方差为 1 的复高斯随机变量。发送向量 x 只有一个非零元素接收信号可以写成% 当第 k 根天线激活、发送符号为 s 时 % y H(:, k) * s n % H(:, k) 是信道矩阵的第 k 列这种单列激活的稀疏结构是 SM 检测算法简化的根源。接收端不再需要求解完整的 M×N 线性方程组而只需要回答两个问题激活的是哪一列发送的符号是什么。候选集合大小直接从 V-BLAST 的 M^Nt 降到 Nt * M。还是以 Nt 4、QPSK 为例V-BLAST 的 ML 检测枚举 4^4 256 种发送向量SM 只需要比较 4 × 4 16 种组合检测复杂度和存储开销都下降了一个数量级。提示信道矩阵的生成要归一化。代码里常见写法是 H sqrt(1/2) * (randn(Nr, Nt) 1j*randn(Nr, Nt))这样每列期望能量为 1后续 SNR 计算才准确。2.3 极大似然检测的实现与误检来源接收端的最优检测是联合估计天线索引和调制符号。最大似然准则下对每个候选天线 k 和候选符号 s计算接收向量与理想接收信号之间的欧氏距离取最小值对应的组合作为检测结果% ML 联合检测y 为接收列向量H 为信道矩阵constellation 为调制星座 d zeros(Nt, M); % 存距离行对应天线列对应符号 for k 1:Nt for s 1:M d(k, s) norm(y - H(:, k) * constellation(s))^2; end end [minD, idx] min(d(:)); % 拉成一维找全局最小值 [detK, detS] ind2sub([Nt, M], idx);min(d(:)) 的作用是把二维距离矩阵压成一维后取绝对最小值得到的 idx 再用 ind2sub 还原成天线编号和符号编号这两条看起来不起眼的命令实际上是整个检测器的核心。注意距离矩阵的行代表天线索引列代表符号索引ind2sub 的输出顺序要和 d 的定义方向一致否则检测结果整体错位。误码来源可以拆成两个层面。符号检测错误由星座点间距离决定高噪声下明显天线索引检测错误则受信道列之间的相关性影响当第 k 根天线的信道增益接近 0 时该天线被正确检测的概率急剧下降。如果把 SM 的误码分开统计往往会看到天线索引的误检率远高于符号误检率这是空间索引调制最典型的性能瓶颈。3. 用 MATLAB 复现 SM 发射到 BER 的完整链路3.1 发射端参数与帧结构设计spatial_modulation.m 的主流程不算复杂但参数设置直接影响仿真正确性。帧结构设计时要把比特流按传输块重新组织每个块包含 2 比特天线索引加 2 比特调制符号以 QPSK 为例于是每帧随机比特总数是 frameLen * bitsPerSym。% SM 发射机参数 Nt 4; % 发射天线数 Nr 4; % 接收天线数 M 4; % QPSK 调制阶数 K log2(Nt); % 天线索引的比特数 bitsPerSym K log2(M); % 每个传输块的总比特数 frameLen 1e4; % 每帧传输块数量比特分组时的顺序是自定义的项目里常见规则是前 K 比特映射天线、后 log2(M) 比特映射符号。映射顺序一旦确定接收端必须按同一规则拆分否则解出来的数据完全错乱。建议在代码注释里写明“前 K 比特为天线索引、后 log2(M) 比特为符号索引”避免回读代码时混淆。3.2 比特分组与天线选择的向量化实现随机比特流生成后通过 reshape 把一维比特流重排成两列矩阵前 K 列留给天线索引后 log2(M) 列留给符号索引。这里用 bi2de 把二进制向量转为十进制序号再映射到星座和天线上txBits randi([0 1], frameLen * bitsPerSym, 1); txBitsMat reshape(txBits, frameLen, bitsPerSym); % 前 K 比特决定天线索引 antIdx bi2de(txBitsMat(:, 1:K), left-msb) 1; % 后 log2(M) 比特决定符号索引QPSK 下为 0 ~ 3 symIdx bi2de(txBitsMat(:, K1:end), left-msb) 1; % 星座映射使用格雷编码 constellation pskmod(0:M-1, M, 0, gray); symbols constellation(symIdx).;bi2de 的 left-msb 参数指定二进制向量左边是最高位这和前面设计的比特顺序必须一致。加 1 是因为 MATLAB 索引从 1 开始而 bi2de 输出从 0 开始。pskmod 的第四个参数 gray 启用格雷映射每个星座点与相邻点只差 1 比特这是降低信道噪声导致符号误判时平均比特错误数的关键。如果改用 qammod要注意 QAM 星座序号的排列方式与 PSK 不同不能直接套用这个代码。3.3 AWGN 信道模拟与 SNR 换算的坑信道部分除了生成瑞利衰落矩阵 H还要添加高斯白噪声。这里最常翻车的不是信道本身而是 Eb/N0 与 SNR 的换算。awgn 函数以 SNR 为单位而性能曲线一般以 Eb/N0 为横轴中间差了一个每符号比特数和调制阶数的因子% Eb/N0 转 SNRSNR EbN0 10*log10(log2(M)) - 10*log10(bitsPerSym) EbN0dB 0:2:20; snr EbN0dB - 10*log10(bitsPerSym) 10*log10(log2(M)); y awgn(H(:, activeIdx) .* symbols, snr, measured);注意如果直接拿 Eb/N0 数值传给 awgnSNR 会偏高约 3 dB画出的 BER 曲线会虚假地优于理论结果容易得出“误码率低于理论极限”这样的错误结论。measured 参数让 awgn 函数先测量输入信号的实际功率再加噪声这比手动计算噪声方差可靠因为 SM 信号经过信道后幅度受衰落影响理论功率和实际功率会有偏差。3.4 接收端主循环与误码统计接收端外层是 SNR 扫描循环内层是帧循环。为得到稳定的误码率每帧误码数太少时曲线会抖动剧烈。工程里常用动态停止条件在同一 SNR 点累计 BER 超过阈值或帧数达到上限才退出maxErrors 100; % 每个 SNR 点最少累计误码数 maxFrames 2e4; % 帧数上限防止高 SNR 时跑不完 totalErr 0; totalBits 0; frame 0; while totalErr maxErrors frame maxFrames frame frame 1; [txBits, y, H, activeIdx] sm_tx_frame(frameLen, Nt, Nr, M, snr); [detBitIdx, ~] sm_ml_detect(y, H, constellation); totalErr totalErr sum(txBits ~ detBitIdx); totalBits totalBits length(txBits); end ber totalErr / totalBits;这个思路比固定帧数的做法更合理低 SNR 时每帧就能累积足够误码高 SNR 时不会为了凑帧数浪费时间。动态停止条件的代价是高 SNR 下帧数上限要设得足够大否则 BER 在 1e-6 量级时可能还没碰到任何误码就提前退出统计结果不可信。4. QSM 与 GSM两种扩展方案的目标与取舍4.1 QSM 把正交分量拆成第二个空间维度quadrature_spatial_modulation.m 实现的 QSM正交空间调制是在 SM 基础上的直接扩展。SM 每个时隙只激活一根天线发送完整符号QSM 则把调制符号拆成实部和虚部分别从两根天线发射结构变成实部天线索引 k_R 和虚部天线索引 k_I 两个独立信息源。% QSM 发送端核心符号拆分与双天线索引映射 realAnt bi2de(bits(:, 1:K), left-msb) 1; imagAnt bi2de(bits(:, K1:2*K), left-msb) 1; symReal real(symbols); symImag imag(symbols); % 两根天线同时发送正交分量 y H(:, realAnt) .* symReal 1i * H(:, imagAnt) .* symImag noise;频谱效率从 SM 的 log2(Nt) log2(M) 提升到 log2(Nt) log2(Nt) log2(M)4 发天线 QPSK 条件下由 4 bit/s/Hz 增加到 6 bit/s/Hz。代价是接收端需要联合检测实部天线和虚部天线两个索引候选组合从 Nt × M 变成 Nt^2 × M检测复杂度显著上升。如果两根天线的信道列相关性较高实部虚部的区分度会变差误码性能反而不如 SM这是 QSM 在强相关信道下最需要的注意点。4.2 GSM 用天线组合替代单天线约束generalized_spatial_modulation.m 实现的 GSM广义空间调制走的是另一条路同时激活 Na 根天线发射同一个符号信息载体从单一天线索引变成天线组合索引。例如 Nt 6、Na 2 时有 C(6, 2) 15 种组合可以携带约 3.9 比特信息且每根激活天线都发射相同符号天然形成了 Na 阶分集。GSM 项目中天线组合表不需要手工写直接用 nchoosek 生成即可% 生成所有可能的激活天线组合 combos nchoosek(1:Nt, Na); numCombos size(combos, 1); % 组合二进制索引映射 combIdx bi2de(bits(:, 1:floor(log2(numCombos))), left-msb) 1; activeAnts combos(combIdx, :); % 激活的每根天线发送相同符号 y sum(H(:, activeAnts), 2) * sym noise;GSM 的检测复杂度变为 C(Nt, Na) × M比 SM 的 Nt × M 增长更快但它的收益体现在分集增益和传输鲁棒性上适合信道条件较差、需要降低中断概率的场景。注意 nchoosek 列出的组合是字典序排列组合索引与 bit 之间的映射表回读时必须基于同一顺序。4.3 三个工程的性能取向总结指标SMQSMGSM激活天线数12实部/虚部各一Na频谱效率log2(Nt) log2(M)2log2(Nt) log2(M)log2(C(Nt, Na)) log2(M)检测复杂度Nt × MNt^2 × MC(Nt, Na) × M分集阶数11Na实现难度低中中高做选型时可以直接套这个表系统对频谱效率要求高且天线独立性强选 QSM对链路可靠性要求高选 GSM需要快速验证收发链路或做教学演示基础 SM 足够。spatial-modulation-master 的三个脚本正好对应这三档需求可以在同一信道模型下直接对比。5. 处理 SM 代码性能异常的四条验证路径拿到这份代码后第一步不是改参数跑仿真而是验证实现正确性。至少要做四件事按依赖顺序来。第一退化测试。把发射天线和接收天线都设为 1SM 自动退化为 SISO 系统天线索引比特消失等效于普通 QPSK 在 AWGN 信道下的传输。此时 BER 应该和理论值匹配理论误比特率约为 Q(sqrt(2*EbN0))。如果不匹配说明星座映射或比特拆分逻辑有问题和空间调制本身无关。这段验证能快速排除 90% 的实现错误。第二分段统计索引误检率和符号误检率。总 BER 只能说明结果不对定位不了原因。在接收端分别统计“天线索引判错的比例”和“符号判错的比例”高 SNR 下如果 BER 平台在 1e-4 左右几乎总是天线索引误检导致而不是星座解调问题。看代码时可以重点检查接收端解映射时是否把比特顺序颠倒了。第三检查 BER 曲线是否随 SNR 增加持续下降。SM 在高信噪比下误码斜率约等于 1即 SNR 每增加 10 dBBER 下降约 10 倍。如果曲线斜率明显小于 1通常说明信道相关性处理有误或信道矩阵归一化不正确。第四跑仿真用动态帧停止机制别用固定帧数。尤其是高 SNR 条件下要设置足够的帧数上限和最小误码数。% 在每个 SNR 点动态停止仿真直到累计最少 50 个误码 while errCnt 50 frameCnt maxFrame % 执行一帧发射、信道、检测、统计 end实践里 50 个误码是最低要求若要绘制 1e-5 级别的曲线最小误码数应至少到 100置信区间才可控。仿真耗时会明显增加配合 parfor 替代 for 进行多 SNR 点并行即可比较容易落地。这套验证流程跑完一遍这个空间索引调制项目的代码行为就基本摸透了。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价