时延-多普勒信道深度建模 · 三场景统一评测 · 工程级可复现实验框架 覆盖 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 组合一键跑通 |
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
实验配置基线:
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| 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 |
| 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 |
| 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;
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

qammod/qamdemod/pskmod/pskdemod/awgn)本文代码仅为核心片段,完整版工程已整理好。 关注公众号 【 3GPP 仿真实验室】进行获取。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049237/viewspace-3111750/ ,如需转载,请注明出处,否则将追究法律责任。