ITPub博客

首页 > 数据库 > Oracle > 【MATLAB源码】Massive MIMO:检测统一对比仿真平台

【MATLAB源码】Massive MIMO:检测统一对比仿真平台

原创 Oracle 作者:3GPP仿真实验室 时间:2026-03-05 21:20:31 0 删除 编辑

📡 Massive MIMO 检测教科书级仿真平台

统一主引擎驱动 · 多算法并行对比 · 工程级可扩展架构* 支持 17 类检测器 · Rayleigh/LoS/BEACHES 信道链路 · BER/EVM 自动评估与出图*

MATLAB MIMO Algorithms Output

📌 为什么选择本项目?

做 Massive MIMO 检测仿真时,最常见的问题不是“没有算法”,而是:算法很多、口径不统一、代码难扩展、结果难复现。

本项目提供了一个 统一评估框架:同一套数据流、同一套误码口径、同一套结果输出,把线性检测、树搜索、迭代优化、SDP 松弛和格约减方法放到同一平台可比。

痛点(常见研究代码) 本项目解决方案
🔴 算法实现分散,难做公平对比 ✅ 统一主引擎 main_sim.m+ 统一评估函数 compute_errors.m
🔴 只给 BER,不给工程指标 ✅ 同时输出 VER/SER/BER/MSE/EVM,自动归一化
🔴 新增算法要改很多地方 ✅ 检测器插件化:新增函数 + run_detector 增加 case 即可
🔴 结果可视化与保存流程混乱 ✅ plot_results.m 自动出 BER/EVM 图,MAT 数据自动落盘
🔴 随机化算法影响可复现性 ✅ runId 固定随机种子,随机化检测器执行前后恢复 RNG 状态

🎯 核心价值

🔬 学术研究价值

  • 算法谱系完整:线性、树搜索、迭代、SDP、格约减五大类检测器同台评测。
  • 口径统一:统一 SNR 定义、统一硬判决映射、统一 BER/EVM 统计,结果可横向复核。
  • 实验复现友好:默认参数集中在 default_params.m,示例脚本直接可跑。
  • 理论与工程连接:对应文档 docs/算法文档.md 给出完整推导,便于论文与实现对照。

💼 工程应用价值

  • 模块解耦: config/modulation/channel/detectors/utils 分层明确。
  • 扩展成本低:新增检测器不需要改统计模块和绘图模块。
  • 输出标准化:MAT 数据 + PNG 曲线双产物,便于自动化报告流程。
  • 场景覆盖广:支持 Rayleigh、LoS、Quadriga+BEACHES 等多种信道入口。

⚡ 技术亮点

🏗️ 完整模块架构

massiveMIMO_detection/
 ├── main_sim.m                      # 主仿真引擎(trial/snr/detector 三重循环)
 ├── demo_quick_compare.m            # 小规模快速对比
 ├── demo_standard_ber.m             # 标准 BER 评估
 ├── demo_modulation_compare.m       # 调制方式对比
 ├── config/
 │   └── default_params.m            # 参数总控与检测器超参数
 ├── modulation/
 │   └── gen_constellation.m         # 星座与 Gray 比特映射
 ├── channel/
 │   ├── gen_rayleigh.m              # iid Rayleigh 信道
 │   ├── gen_los.m                   # LoS 平面波模型
 │   └── est_beaches.m               # BEACHES 波束空间信道估计
 ├── detectors/
 │   ├── linear/                     # SIMO/MRC/ZF/MMSE
 │   ├── tree_search/                # ML(K-best)
 │   ├── iterative/                  # OCD/BOX/ADMIN/LAMA
 │   ├── sdp_relaxation/             # SDR/TASER/RBR
 │   └── lattice/                    # LR-LLL-DFE
 ├── utils/
 │   ├── compute_errors.m            # VER/SER/BER/MSE/EVM 累加
 │   └── plot_results.m              # 自动绘图与保存
 └── results/                        # 输出图像目录

🧠 检测器全景(17 个)

  • 线性基线: SIMO, MRC, ZF, MMSE
  • 树搜索: ML, KBEST
  • 迭代优化: OCD_MMSE, OCD_BOX, BOX, ADMIN, LAMA
  • SDP 家族: SDR_RAND, SDR_R1, TASER, TASER_R, RBR
  • 格约减: LR_LLL_DFE_rZF

📊 性能实测(项目内现有 MAT 结果)

场景 A: demo_quick_8x4_QPSK_1000Trials_0.mat

| 检测器           | BER@0dB   | BER@10dB  | BER@20dB  |

| ------------------ | ----------- | ----------- | ----------- |

| SIMO(理论下界) | 8.887e-02 | 0.000e+00 | 0.000e+00 |

| MRC              | 1.490e-01 | 6.813e-02 | 5.862e-02 |

| ZF               | 1.437e-01 | 2.125e-03 | 0.000e+00 |

| MMSE             | 1.187e-01 | 1.500e-03 | 0.000e+00 |

结论:在小规模场景中,MMSE 在中高 SNR 明显优于 MRC,并在 20 dB 收敛到零误码。

场景 B: demo_standard_32x16_QPSK_5000Trials_0.mat

| 检测器   | BER@0dB   | BER@6dB   | BER@12dB  |

| ---------- | ----------- | ----------- | ----------- |

| MMSE     | 1.173e-01 | 1.620e-02 | 5.625e-05 |

| ZF       | 1.541e-01 | 2.359e-02 | 1.312e-04 |

| LAMA     | 1.087e-01 | 4.356e-03 | 0.000e+00 |

| TASER    | 1.093e-01 | 5.200e-03 | 0.000e+00 |

| OCD\_BOX | 1.094e-01 | 8.806e-03 | 0.000e+00 |

| ADMIN    | 1.117e-01 | 9.362e-03 | 0.000e+00 |

| KBEST    | 1.215e-01 | 4.156e-03 | 0.000e+00 |

结论:在 32x16 QPSK 场景,LAMA/TASER/KBEST 在 6 dB 区间表现突出,高 SNR 下可达到零误码。

💻 核心代码展示

🔥 主引擎三重循环( main_sim.m)

for t = 1:par.trials
     idx = bi2de(bits(:, :, t), 'left-msb') + 1;
     s = par.symbols(idx).';
     H = gen_rayleigh(par.MR, par.MT);
     x = H * s;
 
     for k = 1:num_snr
         N0 = par.Es * norm(H, 'fro')^2 * 10^(-par.SNRdB_list(k)/10) / par.MR;
         y = x + sqrt(N0) * n;
         Hest = H;  % 可切换 PERF/ML/BEACHES
 
         for d = 1:num_det
             shat = run_detector(par, par.detector{d}, Hest, y, s, N0);
             res = compute_errors(res, par, d, k, s, idx, shat, bits(:, :, t));
         end
     end
 end

🚀 插件式检测器分发( run_detector)

switch detector_name
     case 'MMSE'
         shat = detect_mmse(par, H, y, N0);
     case 'LAMA'
         shat = detect_lama(par, H, y, N0);
     case 'TASER'
         shat = detect_taser(par, H, y);
     case 'OCD_BOX'
         shat = detect_ocd_box(par, H, y);
     ...
     otherwise
         error('未定义的检测器: %s', detector_name);
 end

📈 统一误码统计( compute_errors.m)

dist_matrix = abs(shat * ones(1, length(par.symbols)) - ...
                   ones(par.MT, 1) * par.symbols).^2;
 [~, idxhat] = min(dist_matrix, [], 2);
 bithat = par.bits(idxhat, :);
 err = (idx ~= idxhat);
 
 res.VER(d, k) = res.VER(d, k) + any(err);
 res.SER(d, k) = res.SER(d, k) + sum(err) / par.MT;
 res.BER(d, k) = res.BER(d, k) + sum(sum(bits_tx ~= bithat)) / (par.MT * par.Q);
 res.MSE(d, k) = res.MSE(d, k) + norm(shat - s)^2;
 res.VM(d, k)  = res.VM(d, k)  + norm(s)^2;

🎬 一键运行

% 进入项目目录后:
 
 % 1) 小规模快速对比(线性检测器)
 >> demo_quick_compare
 
 % 2) 标准规模 BER 评估(多类检测器)
 >> demo_standard_ber
 
 % 3) 调制方式对比(BPSK/QPSK/16QAM)
 >> demo_modulation_compare
 
 % 4) 默认主引擎(按 default_params)
 >> main_sim

输出预览

demo<em>modulation</em>compare<em>BER.png` demo</em>modulation<em>compare</em>EVM.png ERR<em>32x16</em>QPSK<em>10000Trials</em>BER.png ERR<em>32x16</em>QPSK<em>10000Trials</em>EVM.png

🖥️ 运行环境

  • MATLAB 版本:R2020a 或更高版本(建议 R2022a+)
  • 必需依赖:基础 MATLAB 数值与绘图能力
  • 可选依赖:
  • CVX(用于 SDR_RAND、 SDR_R1)
  • Statistics Toolbox( mvnrnd 用于随机化 SDR)
  • Quadriga 信道数据(当 par.quadriga = 1 时)

🛒 获取方式

本文代码仅为核心片段,完整版工程已整理好。 关注公众号 【 3GPP 仿真实验室】进行获取。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049237/viewspace-3111640/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2026-01-08

  • 博文量
    55
  • 访问量
    48633