ITPub博客

首页 > 数据库 > Oracle > 【MATLAB源码】OFDM/OTFS-IM:高机动全链路对比仿真平台

【MATLAB源码】OFDM/OTFS-IM:高机动全链路对比仿真平台

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

🚄 高机动 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=32
  • Mod_type=QAM, Mod_OTFS=4, Mod_IM=4
  • propModel=TDL-C, maxSpeed=350 km/h, fc=5 GHz
  • eqType=LMMSE
  • SNR = 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

🖼️ 结果预览(本地输出)

00<em>summary</em>dashboard.png 01<em>otfs</em>vs<em>ofdm.png 02</em>otfs<em>vs</em>otfs<em>im.png 03</em>otfs<em>im</em>vs<em>ofdm</em>im.png

🖥️ 运行环境

  • MATLAB:R2024a 或更高
  • 主要依赖:通信调制与噪声相关函数( qammod/qamdemod/pskmod/pskdemod/awgn)
  • 推荐:开启并行计算前先完成单机确定性复现

🛒 获取方式

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

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

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

注册时间:2026-01-08

  • 博文量
    55
  • 访问量
    48633