统一主引擎驱动 · 多算法并行对比 · 工程级可扩展架构* 支持 17 类检测器 · Rayleigh/LoS/BEACHES 信道链路 · BER/EVM 自动评估与出图*
做 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 状态 |
default_params.m,示例脚本直接可跑。docs/算法文档.md 给出完整推导,便于论文与实现对照。config/modulation/channel/detectors/utils 分层明确。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/ # 输出图像目录
SIMO, MRC, ZF, MMSEML, KBESTOCD_MMSE, OCD_BOX, BOX, ADMIN, LAMASDR_RAND, SDR_R1, TASER, TASER_R, RBRLR_LLL_DFE_rZFdemo_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 收敛到零误码。
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
`

CVX(用于
SDR_RAND、
SDR_R1)mvnrnd 用于随机化 SDR)par.quadriga = 1 时)本文代码仅为核心片段,完整版工程已整理好。 关注公众号 【 3GPP 仿真实验室】进行获取。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049237/viewspace-3111640/ ,如需转载,请注明出处,否则将追究法律责任。