🚄 高机动 OTFS/OFDM/IM 全链路对比仿真平台
时延-多普勒信道深度建模 · 三场景统一评测 · 工程级可复现实验框架覆盖 OTFS vs OFDM、OTFS vs OTFS-IM、OTFS-IM vs OFDM-IM
🔍 为什么这个项目值得用?
高机动场景(高速铁路、车联网、低空高速平台)下,传统 OFDM 会遭遇明显 ICI(子载波间干扰)与信道快速时变问题。多数公开代码常见以下痛点:公式和实现脱节、场景脚本重复、参数口径不统一、结果不可复现。
本项目提供的是一个 可复现、可扩展、可对比 的统一仿真底座。
| 常见痛点(碎片化脚本) | 本项目对应方案 |
|---|---|
| 🔴 同一功能散落在多个脚本,复用困难 | ✅ 分层架构:run_case/core/channel/im/modulation/utils |
| 🔴 OTFS 与 OFDM 口径不一致,比较不公平 | ✅ 统一 cfg 参数契约与 SNR/帧数/归一化 口径 |
| 🔴 IM 索引映射容易越界或不闭环 | ✅make_index_lut + build_im_grid + detect_im_bits 完整闭环 |
| 🔴 结果文件易覆盖,图像保存混乱 | ✅ 自动创建时间戳目录,统一保存 png/fig/mat |
| 🔴 只能跑单场景,难做横向评估 | ✅ 三场景并行:OTFS/OFDM 与 IM 组合一键跑通 |
🎯 核心价值
📘 学术研究价值
- 统一比较框架:同一工程下完成 3 类关键基线对比,不再跨工程拼接数据。
- 高机动信道建模完整:支持多种 TDL/EPA/EVA/ETU 参数,含时延与多普勒离散化。
- 可直接写论文实验章:BER 曲线、参数表、流程日志、总览图一次性输出。
- 算法扩展友好:可在
core/或im/直接插入新均衡器/新检测器。
🏭 工程实现价值
- 解耦清晰:场景编排与底层算法模块分离,降低维护成本。
- 结构体契约稳定:
cfg/runtime/idxInfo/results语义清晰,便于团队协作。 - 自动化结果管理:按时间戳归档每轮实验,支持回溯与复验。
- 质量基线完整:支持
checkcode静态检查与 quick/full 双档运行。
⚙️ 技术亮点
🧱 模块化架构(重构后)
matlab/
├── run_demo_quick.m # 快速演示(一键联动三场景)
├── run_demo_full.m # 完整评测(细SNR网格)
├── run_case_otfs_vs_ofdm.m # 场景1
├── run_case_otfs_vs_otfs_im.m # 场景2
├── run_case_otfs_im_vs_ofdm_im.m # 场景3
│
├── core/ # 调制解调与均衡核心
│ ├── otfs_modulate.m / otfs_demodulate.m
│ ├── ofdm_modulate.m / ofdm_demodulate.m
│ ├── equalize_otfs.m / equalize_ofdm.m
│
├── channel/ # 信道与等效矩阵
│ ├── get_channel_params.m
│ ├── prepare_channel_runtime.m
│ ├── build_channel_matrix_G.m
│ ├── apply_doppler_channel.m
│ └── apply_frequency_offset.m
│
├── im/ # 索引调制
│ ├── make_index_lut.m
│ ├── make_symbol_combos.m
│ ├── build_im_grid.m
│ └── detect_im_bits.m
│
├── modulation/ # 星座与比特映射
│ ├── build_constellation.m
│ ├── mod_bits_to_syms.m
│ └── demod_syms_to_bits.m
│
└── utils/ # 配置、绘图、保存、辅助
├── default_config.m
├── prepare_output_dir.m
├── save_figure_auto.m
├── plot_summary_dashboard.m
├── normalize_eq_type.m
└── bits_from_integers.m
📊 性能实测(Full 模式)
实验配置基线:
M=32, N=32Mod_type=QAM, Mod_OTFS=4, Mod_IM=4propModel=TDL-C, maxSpeed=350 km/h, fc=5 GHzeqType=LMMSESNR = 0:3:30 dB
场景 A:OTFS vs OFDM
| SNR(dB) | OTFS BER | OFDM BER |
|---|---|---|
| 0 | 2.600e-01 | 3.358e-01 |
| 6 | 1.393e-01 | 1.991e-01 |
| 12 | 3.083e-02 | 1.034e-01 |
| 18 | 7.813e-04 | 6.590e-02 |
| 24 | 0.000e+00 | 5.615e-02 |
| 30 | 0.000e+00 | 5.329e-02 |
场景 B:OTFS vs OTFS-IM
| SNR(dB) | OTFS BER | OTFS-IM BER |
|---|---|---|
| 0 | 2.645e-01 | 3.048e-01 |
| 6 | 1.385e-01 | 1.541e-01 |
| 12 | 3.286e-02 | 1.812e-02 |
| 18 | 7.487e-04 | 2.170e-05 |
| 24 | 0.000e+00 | 0.000e+00 |
| 30 | 0.000e+00 | 0.000e+00 |
场景 C:OTFS-IM vs OFDM-IM
| SNR(dB) | OTFS-IM BER | OFDM-IM BER |
|---|---|---|
| 0 | 3.054e-01 | 3.541e-01 |
| 6 | 1.484e-01 | 2.151e-01 |
| 12 | 1.808e-02 | 9.473e-02 |
| 18 | 2.387e-04 | 5.417e-02 |
| 24 | 0.000e+00 | 4.299e-02 |
| 30 | 0.000e+00 | 4.034e-02 |
结论要点:高 SNR 区域 OTFS/OTFS-IM 收敛明显快于 OFDM/OFDM-IM,且误码地板显著更低。
💻 核心代码展示
🔥 信道运行时统一构建(prepare_channel_runtime.m)
BW = cfg.M * cfg.df;
one_delay_tap = 1 / BW;
[delays, dopplers, pdp] = get_channel_params(cfg.maxSpeed_kmh, cfg.fc, cfg.propModel);
chanParams.pathDelays = round(delays ./ one_delay_tap);
padLen = max(chanParams.pathDelays);
T = (cfg.M + padLen) / BW;
one_doppler_tap = 1 / (cfg.N * T);
chanParams.pathDopplers = round(dopplers / one_doppler_tap);
chanParams.pathDopplerFreqs = chanParams.pathDopplers * one_doppler_tap;
G = build_channel_matrix_G(cfg.M, cfg.N, chanParams, padLen, cfg.padType);
GtG = G' * G;
🚀 IM 约束搜索检测(detect_im_bits.m)
for pIdx = 1:size(posComb, 1)
activePos = posComb(pIdx, :);
estSymIdx0 = zeros(1, k);
for ii = 1:k
r = rxGroup(activePos(ii));
[~, minIdx] = min(abs(r - const).^2);
estSymIdx0(ii) = minIdx - 1;
end
xCand = zeros(n, 1);
xCand(activePos) = const(estSymIdx0 + 1).';
metric = sum(abs(rxGroup - xCand).^2);
if metric < bestMetric
bestMetric = metric;
bestPosIdx = pIdx;
bestSymIdx0 = estSymIdx0;
end
end
🎬 一键运行
cd matlab
% 快速演示(小帧数,便于调试)
run_demo_quick
% 完整演示(细SNR网格,正式评测)
run_demo_full
🖼️ 结果预览(本地输出)

![02_otfs_vs_otfs_im.png](openwrite.cn/uploads/202…