ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

高速移动场景下OTFS调制原理与仿真实现:从延迟-多普勒域到误码率曲线

高速移动场景下OTFS调制原理与仿真实现:从延迟-多普勒域到误码率曲线 简介正交时频空间调制是一种面向高速移动通信的多载波技术这份代码资源给出了其完整的Matlab实现适合无线通信方向的研究生、工程师以及对物理层算法感兴趣的开发者。压缩包内仅含一个OTFS_Modulation.m脚本大小仅273字节但覆盖了从时延-多普勒域输入到时域输出的整个过程包括符号映射、离散对数映射、预编码、逆辛格尔变换以及与信道冲激响应卷积等关键环节。目前已有1417人学习下载。通过运行和阅读这段代码可以对照经典原理逐步理解多径传播与多普勒效应如何被联合处理也可将其作为后续研究接收端解调、信道估计或系统级仿真的基础模块。对于希望快速建立正交时频空间调制直观认识、减少重复造轮子的学习者来说这是一个轻量而实用的切入点。1. 高速移动场景下 OTFS 调制为什么成了物理层研究的热点高铁跑到 350km/h、低轨卫星终端以数公里每秒的速度过顶、无人机群在空域里高速机动——这些场景里OFDM 的子载波正交性被多普勒频移一冲就散误码率曲线直线抬升工程上常用的信道估计和均衡手段开始力不从心。正交时频空间调制OTFSOrthogonal Time Frequency Space Modulation就是在这一背景下被重新推到台前的它把信息符号放在延迟-多普勒域里调制而不是传统的时频域让信道矩阵在高速运动下依然保持稀疏和准静态。这套思路对做物理层算法验证、链路级仿真、以及准备 6G 空口技术评估的人来说是绕不开的一块硬骨头。这篇笔记就围绕 OTFS 调制这条主线从原理讲到仿真复现把参数怎么设、代码怎么跑、坑在哪一次性说清楚。2. OTFS 与 OFDM 的本质差异把信道从时变变成时不变2.1 延迟-多普勒域到底是什么一套全新的信道表示坐标传统 OFDM 把符号铺在时频平面上每个资源格对应一个特定时间和频率。无线信道里的每条反射径在时频域里表现为一个随时间变化的相位旋转和幅度起伏。终端一移动这个相位旋转跟着变接收机就得不断去跟踪信道状态。多普勒频移大的时候子载波间隔如果不够宽相邻子载波之间就会互相干扰这就是 ICIInter-Carrier Interference。OTFS 换了个坐标系。它把信道描述成延迟轴和多普勒轴上的若干冲激线一条径对应一个延迟 tap 和一个多普勒频移。在这个域里信道不再是随时变的滤波器而是一张稀疏的二维冲激响应图。简单说你在时频域里看到的是一个飞快旋转的矢量在延迟-多普勒域里看到的却是一条静止的线。物理信道本身没有变变的是观察坐标系。这个坐标变换怎么落地核心就是辛有限傅里叶变换SFFT和它的逆变换ISFFT。SFFT 不是简单地在两个维度上做 FFT它是沿着时频网格的符号周期和子载波间隔做归一化后在有限维网格上的辛变换。数学上可以证明时频域里的信道作用等效为延迟-多普勒域里的二维循环卷积。因此只要接收端把观测信号变换回延迟-多普勒域并做二维均衡就能抵消高速运动带来的时变性。2.2 OTFS 收发机的四个核心模块ISFFT、海森堡变换、Wigner 变换、SFFTOTFS 发射端做的事情分两步。第一步把 QAM/PSK 调制后的符号矩阵映射到延迟-多普勒域网格上网格大小是 M×NM 对应多普勒维度N 对应延迟维度。对这个矩阵做 ISFFT就从延迟-多普勒域变换到了时频域得到 X_tf。第二步对 X_tf 做海森堡变换Heisenberg Transform本质上是把频域符号映射到时域波形通常会配合一个发送脉冲成形滤波器。接收端反过来先用 Wigner 变换把时域接收信号变换回时频域再做 SFFT 回到延迟-多普勒域最后在 DD 域做信道估计和信号检测。如果你做过 OFDM 仿真可以把 ISFFT 理解成一个广义的二维 OFDM 调制延迟维度对应频域的扩展多普勒维度对应时域的扩展。但实现细节上有个区别OFDM 的 IFFT 是一维的OTFS 的 ISFFT 是二维的而且方向上有讲究——SFFT 是沿多普勒维度做 FFT、沿延迟维度做 IFFTISFFT 反过来。搞反了方向整个收发链路就对不上解调出来的星座图都是乱的。实际工程里海森堡变换用 IFFT 加加窗实现Wigner 变换用 FFT 加匹配滤波实现。这两个变换在理想脉冲成形条件下正好互逆这也是 OTFS 链路可以闭环验证的基础。2.3 为什么说 OTFS 把双选信道变成了稀疏信道所谓双选信道就是同时存在频率选择性衰落和时间选择性衰落。频率选择性来自多径延迟扩展时间选择性来自多普勒扩展。OFDM 解决频率选择性靠循环前缀加单抽头均衡但对时间选择性几乎没有招架之力。OTFS 的思路是把时变信道在 DD 域里变成一个准静态的稀疏矩阵。假设信道里有 P 条路径每条路径有独立的延迟 τ_i 和多普勒频移 ν_i。在时频域里这条路径对每个资源格的影响是 e^{j2πν_i t} 这样一个随 t 变化的相位。但在 DD 域里它表现为一个冲激位置由 τ_i 和 ν_i 决定。P 条路径对应 P 个冲激信道矩阵中绝大多数元素为零。稀疏性意味着两件事一是信道估计可以做得更准因为需要估计的未知量从 M×N 个降到大约 3P 个幅度、延迟、多普勒二是接收端的消息传递检测MP算法可以利用稀疏结构把复杂度压到接近线性。我见过有同行拿 OTFS 和 OFDM 做同参数下的 BER 对比在 500km/h、载波 4GHz、子载波间隔 15kHz 的条件下OFDM 的 BER 平台在 10^-2 量级就下不去了而 OTFS 可以继续降到 10^-4 以下。这不是玄学是信道表示方式带来的结构性优势。3. 跑通 OTFS 调制仿真压缩包里的发射端与接收端拆解3.1 压缩包里的文件结构与仿真主流程拿到这个 OTFS_Modulation 压缩包常见做法是先用 MATLAB 或 Python 把发射和接收链路搭起来。先说清楚这类仿真脚本通常是一个完整的链路从发射端生成比特、调制、映射到 DD 域到信道模型的实现再到接收端检测和 BER 统计。核心脚本一般分四块参数配置、发射端、信道、接收端。我做这类仿真时习惯把所有可调参数集中在一个结构体里后续调参不需要改动函数内部的逻辑。从压缩包名里的“调制”两个字来看重点应在发射端的调制映射上但接收端没有的话链路就没法闭环所以兄弟文件里大概率会有配套的检测和解调脚本。如果你打开包发现只有发射端、没有接收端那就需要自己补接收链路我下面给的代码可以直接用。主流程可以归纳为生成随机比特 → QAM 符号映射 → 符号铺到 DD 域网格 → ISFFT 得到 TF 域符号 → 海森堡变换得到时域发射信号 → 过信道加时延、多普勒、噪声 → Wigner 变换回 TF 域 → SFFT 回 DD 域 → 信道均衡/检测 → QAM 解映射 → 统计 BER。每个环节都有对应的矩阵维度检查点维度对不上问题通常出在某个 FFT 的方向或者归一化系数上。3.2 发射端代码从 QAM 符号到延迟-多普勒网格以常见的 MATLAB 实现为例发射端核心代码如下%% OTFS 发射端QAM 符号映射到 DD 域经 ISFFT 和海森堡变换得到时域信号 N 128; % 延迟维度对应子载波数或时域采样点数 M 16; % 多普勒维度对应符号数 M_mod 4; % QAM 调制阶数4 QPSK cp_len 32; % 循环前缀长度适配信道最大时延扩展 % 1. 随机比特生成并映射为 QAM 符号 bits randi([0 1], N*M*log2(M_mod), 1); qam_symbols qammod(bits, M_mod, gray, InputTypebit); x_dd reshape(qam_symbols, N, M); % 每个位置对应一个 DD 域资源格 % 2. ISFFT沿多普勒维做 FFT沿延迟维做 IFFT x_tf fft(x_dd, M, 2) / sqrt(M); % 对时域维度做 FFT归一化 x_tf ifft(x_tf, N, 1) * sqrt(N); % 对频域维度做 IFFT归一化 % 3. 海森堡变换沿频率维做 IFFT 得到时域符号再加循环前缀 s_time ifft(x_tf, N, 1) * sqrt(N); % N×M 矩阵每列是一个 OFDM 符号 s_cp [s_time(end-cp_len1:end, :); s_time]; % 给每个符号加循环前缀 s_tx s_cp(:); % 串行化输出这段代码里最容易看错的地方在第 2 步ISFFT 的两个变换方向不能写反。DD 域矩阵 x_dd 的行是延迟维、列是多普勒维。延迟维对应频率所以用 IFFT多普勒维对应时间所以用 FFT。归一化的时候 FFT 除 sqrt(M)、IFFT 乘 sqrt(N)这样能量才能在两个域之间保持一致星座点的幅度不会漂移。如果你在自己的代码里看到 BER 性能在高信噪比区域出现平台先检查这一步的归一化系数。第 3 步的海森堡变换本质上就是 OFDM 调制只是把 TF 域的符号矩阵逐列变成时域基带波形。加循环前缀后保证每个符号的线性卷积变成循环卷积这样才能和 DD 域信道的循环结构对上。3.3 接收端代码Wigner 变换到 MP 检测接收端要逆着发射端一步步退回 DD 域%% OTFS 接收端时域信号经 Wigner 变换、SFFT再做 MP 检测 % 1. 去掉循环前缀恢复出 N×M 的时频域接收矩阵 r_time reshape(rx_signal, N cp_len, M); r_time r_time(cp_len1:end, :); % 去 CP得到 N×M 时域矩阵 % 2. Wigner 变换对时域做 FFT回到 TF 域 y_tf fft(r_time, N, 1) / sqrt(N); % 注意这里与发射端海森堡变换互逆 % 3. SFFT沿多普勒维做 IFFT沿延迟维做 FFT y_dd ifft(y_tf, M, 2) * sqrt(M); % 多普勒维 IFFT y_dd fft(y_dd, N, 1) / sqrt(N); % 延迟维 FFT % 4. 用 MP 检测或匹配滤波恢复发射符号 % 这里使用简化版已知理想信道矩阵 H_dd 时直接做最小二乘 x_est H_dd \ y_dd(:); % 等价于 ZF 均衡 x_dd_est reshape(x_est, N, M); % 5. QAM 解映射统计 BER bits_est qamdemod(x_dd_est(:), M_mod, gray, OutputTypebit); [~, ber] biterr(bits, bits_est);这段代码里的核心是第 3 步的 SFFT方向和发射端的 ISFFT 正好相反。接收端的 MP 检测在复杂信道下比 ZF 好得多因为它利用了 DD 域信道矩阵的稀疏性。但直接把 H_dd 这么大一个矩阵存下来做求逆内存开销和计算量都很大M 和 N 稍微大一点就吃不消。后续章节我会展开讲 MP 检测的参数调节。3.4 一个能直接跑的最小仿真脚本为了让链路先通起来我用最简单的做法把信道设成单径加多普勒不加衰落验证 OTFS 链路是否能正确收发。这个脚本的价值在于排除信道模型的干扰先确认调制解调方向没错。%% 最小闭环验证理想信道下的 OTFS 链路 N 64; M 8; M_mod 4; % 小网格跑得快 bits randi([0 1], N*M*log2(M_mod), 1); qam_symbols qammod(bits, M_mod, gray, InputTypebit); x_dd reshape(qam_symbols, N, M); % ISFFT x_tf fft(x_dd, M, 2) / sqrt(M); x_tf ifft(x_tf, N, 1) * sqrt(N); % 海森堡变换不加 CP理想同步 s_time ifft(x_tf, N, 1) * sqrt(N); % 理想信道仅加 AWGN无衰落 r_time s_time 10^(-snr_db/20) * (randn(size(s_time)) 1j*randn(size(s_time))) / sqrt(2); % Wigner 变换 y_tf fft(r_time, N, 1) / sqrt(N); % SFFT y_dd ifft(y_tf, M, 2) * sqrt(M); y_dd fft(y_dd, N, 1) / sqrt(N); % 硬判决解调 x_est qamdemod(y_dd(:), M_mod, gray, OutputTypebit); [~, ber] biterr(bits, x_est); fprintf(SNR%.1fdB, BER%.2e\n, snr_db, ber);这个最小脚本跑通了就说明你的 ISFFT/SFFT 方向、归一化系数、QAM 映射关系都是对的。接着再往里面加多径信道、加多普勒逐级增加复杂度出了问题也好定位。不要一上来就上完整信道模型那样 BER 曲线跑出来是歪的你根本不知道是哪一环的锅。4. 调出靠谱误码率曲线的关键参数与场景适配4.1 子载波数、符号数、载波间隔怎么搭配OTFS 的网格维度 N 和 M 决定了 DD 域的覆盖范围。N 对应延迟维决定了能支持的最大时延扩展N 越大能区分的多径分量越多。M 对应多普勒维决定了能支持的最大多普勒频移。子载波间隔 Δf 与 N 的乘积得到总的系统带宽符号持续时间 T 与 M 的乘积决定了 OTFS 帧的长度。具体选值时先看目标信道参数最大时延扩展 τ_max 决定了 Δf 应该小于 1/τ_max这样延迟分辨率才够最大多普勒频移 ν_max 决定了 T 应该小于 1/ν_max否则多普勒模糊。工程实战里有个经验式N 取 64 到 256M 取 8 到 32。N 太小延迟分辨率不够信道估计会糊M 太大帧长过长信道在帧内可能已经不再准静态反而把性能做差。载波间隔选 15kHz 时M16 对应的帧长是 1.0667ms 左右这本身体检出来就是接近 5G NR 的一个时隙长度做参数对接比较方便。如果你仿真的是毫米波场景Δf 可以拉到 120kHz 或 480kHz这时 M 可以相应减小保持帧长在多普勒时变的容忍范围内。4.2 调制阶数与导频开销的取舍调制阶数从 QPSK 升到 16QAM、64QAM频谱效率上去了但 OTFS 对信道估计误差的敏感度也在上升。工程经验是DD 域信道估计在低信噪比下误差较大64QAM 要求信道估计的归一化 MSE 低于 10^-2不然 BER 曲线会出现错误平层。所以验证链路时先跑 QPSK确认曲线斜率正常再逐步提阶数。导频开销方面OTFS 常用嵌入式导频设计在 DD 域网格中留出一个保护带把导频符号放在中心周围置零避免数据符号对导频的干扰。保护带大小由最大时延扩展和多普勒频移决定时延维保护带至少覆盖 2 倍最大延迟 tap多普勒维保护带至少覆盖 2 倍最大多普勒频移。开销比例通常在 5% 到 15% 之间具体取决于信道剧烈程度。压缩包里如果带了导频图案设计脚本可以重点看一下保护带的取值逻辑。4.3 不同移动速度下的多普勒频移仿真设置多普勒频移的物理公式是 f_d v·cos(θ)/λ其中 λ 是载波波长。仿真里设置参数时以 4GHz 载频、350km/h 移动速度为例λ 0.075mv 97.2m/s最大多普勒约 1296Hz。子载波间隔 15kHz 时多普勒频移占子载波间隔约 8.6%这个比例已经让 OFDM 相当难受但 OTFS 的 M16 对应的多普勒分辨率是 1/帧长 ≈ 937.5Hz能分辨 1296Hz 的多普勒所以性能还能撑住。如果速度升到 500km/h多普勒约 1852Hz建议把 M 提到 32 或把载波间隔下调节省带宽以换取多普勒范围。仿真里的多普勒频移可以用两类模型。第一类是理想模型固定频偏每条径的 f_d 是个确定值第二类是 Jakes 模型多普勒谱服从 U 形分布。压缩包里的信道脚本大概率用的是理想模型跑 BER 曲线时用确定值能更快看到规律要贴近真实场景再换 Jakes 模型。过程中注意多普勒相位在时间维的累积要写成累加式 ν·t而不是每时每刻乘以瞬时值这个细节错了的话多普勒频移的统计特性和理论对不上。5. OTFS 仿真的 5 个常见坑从曲线翻车到信道建模失效5.1 误码率曲线在高 SNR 处掉不下去现象BER 曲线在 SNR 到 20dB 左右时开始走平怎么加噪声功率都不往下降。原因最常见的是导频和数据符号在 DD 域互相污染。嵌入式导频周围的保护带留得不够数据符号的旁瓣泄露到导频位置导致信道估计始终带一个固定误差形成错误平层。另一个大概率原因是循环前缀没加够多径延迟超过了 CP 长度产生符号间干扰。解决先把保护带按最大时延扩展和多普勒频移的 2 倍以上设置然后查信道脚本里的时延 tap确认 τ_max 是否小于 CP 长度。我一般会在发射端打印 CP 长度和最大时延的对比如果两个值接近或前者更小那 BER 平台几乎必然是 ISI 造成的。这种情况把 CP 加长即可代价是频谱效率略降。5.2 信道矩阵稀疏度不对导致检测器收敛慢现象MP 检测跑完设定迭代次数后误码率还是高于理论值而且迭代次数增加性能提升不明显。原因MP 检测利用了信道的稀疏性如果信道矩阵构造时没有考虑分数倍多普勒整数倍多普勒扩展没有四舍五入而是舍掉矩阵内部出现额外非零项破坏了稀疏结构消息传递里的近似就失效了。解决在信道矩阵生成函数里把多普勒频移按子载波间隔的倍数量化到整数格上让每条径只影响一个多普勒 bin。量化误差在延迟-多普勒分辨率允许的范围内可以接受但矩阵的每列非零元素个数会从几十降到两三个MP 的收敛速度和准确度都会显著改善。5.3 SNR 定义混乱导致曲线和理论值对不上现象仿真得到的 BER 曲线和理论 QAM 曲线整体往右偏几 dB形状却一致。原因噪声功率的归一化在两处出了问题。一是信号能量用了发射端调制后的平均能量没有计算加 CP、成形滤波之后的总功率二是 QAM 符号没有做平均功率归一化星座点数字一大SNR 公式里的信号项就不对。OTFS 信号做完 ISFFT 后时域功率和频域功率有归一化系数关系很多脚本沿用 OFDM 的能量归一化方式直接套在 OTFS 上就会差出一个 N 或 M 的倍数。解决做 SNR 设置时先算清 E_s符号能量和 E_b比特能量再用 N0 E_s/(10^(SNR/10)) 生成复噪声。同时检查 qammod 之后符号的平均功率是否为 1不是的话就除以平均模值。固定这两点曲线基本能贴合理论线。5.4 分数倍多普勒频移被忽略误码率被低估现象仿真性能看起来比论文里的结果还好好得不对劲。原因信道脚本里如果直接按整数倍多普勒生成信道相当于每径的多普勒都是子载波间隔的整数倍这种信道对 OTFS 来说是“理想友好型”。真实信道中多普勒频移几乎必然是带小数的例如 1296Hz / 15000Hz 0.0864 个子载波间隔。忽略这个小数部分会让信道估计的残差变大检测器在实际部署时的性能会比仿真差。解决至少在信道脚本里加入小数倍频偏的选项参数用 f_doppler_frac mod(f_d, df)然后在相位累积项加上这个残余量。跑出来的 BER 会比整数倍模型高一些这才是更接近实际的结果。5.5 MP 检测的迭代次数和阻尼因子没有联动调节现象MP 检测器迭代 20 次后不收敛输出 LLR 的绝对值很小检测性能不如匹配滤波。原因MP 的消息传播中有个控制参数即阻尼因子 β。β 太大接近 1消息更新过快容易振荡β 太小收敛太慢迭代次数不够时相当于没跑完。不同信道条件下最优 β 不同拿一组参数跑所有场景必然会在极端信道下翻车。解决先固定迭代次数在 15 到 20 次从 β0.5 开始扫观察每轮迭代后误码率是否单调下降。如果震荡就降低 β 到 0.3 到 0.4如果下降太慢就适当提高。这个参数在压缩包里如果没有暴露出来通常藏在检测器结构体里值得改出来试一下。6. 从仿真到落地把 OTFS 代码往工程方向推的下一步6.1 用 OMP 做延迟-多普勒域信道估计理想信道模型假设接收端完全知道 H_dd这在仿真里只用于原理验证。工程上需要导频辅助的信道估计。OTFS 导频在 DD 域里是一个冲激经过信道后在接收端变成一组延迟-多普勒对估计问题本质上是稀疏恢复问题。用 OMP 算法导频开销可以很小因为只有少数几个非零路径需要估计。实现时注意 OMP 的停止条件设为残差能量低于噪声阈值阈值用 N0 乘以矩阵维度做标定。相比 LMS 类自适应滤波OMP 在稀疏信道下的均方误差要低一个数量级。6.2 从理想信道换到 5G 参数集与实测信道把仿真往标准参数集上靠常见做法是套用 5G NR 的帧结构和子载波间隔族。N128、Δf15kHz 对应带宽 1.92MHz实在太小仿真时把带宽拉高到 20MHzΔf30kHzN512M16帧长 0.533ms这个参数组合在高移动性场景里比较有代表性。信道模型也要从单径 AWGN 换成 TDL 模型TDL-E 模型在 LTF 里有标准的时延功率谱定义可以直接查到延迟 tap 和每条径的相对功率用来替换仿真脚本里的简单多径数组。6.3 用导频符号验证调制链路的正确性要验证调制链路没问题我有个习惯在 DD 域网格的四个角放四个已知 QAM 符号其他位置置零。跑完整个链路后检查接收端对应位置的符号幅度和相位误差。如果幅度误差小于 1%、相位误差小于 2 度说明调制解调链路基本干净大于这个量级优先怀疑 FFT 方向或归一化。这种方法比直接跑 BER 更快因为 BER 是好几百个符号的统计平均出了问题要很久才能定位。6.4 我的习惯与建议做 OTFS 仿真这两年最大的教训是先跑通理想信道再碰衰落信道不然查错查到怀疑人生。代码里每个 FFT 都写好方向注释每个矩阵都标注维度压缩包里的脚本往往没有这些标记接手后第一件事就是把注释补全。参数调整时一次只动一个变量BER 曲线记录在案。希望这些经验能帮你在 OTFS 的仿真路上走得更顺。本文还有配套的精品资源点击获取
返回列表