ARTICLE DETAIL

资讯详情

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

4用户OTFS物理层仿真实战:从OFDM到LMMSE信道估计的完整设计

4用户OTFS物理层仿真实战:从OFDM到LMMSE信道估计的完整设计 做无线通信物理层仿真的人应该都有这种体会当用户移动速度从30km/h爬到300km/hOFDM系统的误码率曲线就像坐了过山车——子载波正交性被多普勒频移破坏信道估计出来的CSI还没来得及用就已经过期了。我最近在MATLAB里把一套4用户OTFS系统仿真从零搭了起来采用QPSK调制配合LMMSE信道估计做CSI获取跑通了完整链路的误码率分析。这篇就把这套仿真的设计逻辑、关键模块和踩坑过程完整捋一遍给正在折腾OTFS物理层仿真的朋友做个参考。1. 为什么我选择在MATLAB里仿真4用户OTFS——从OFDM的“天花板”说起1.1 高移动性场景下OFDM的痛点先聊点背景。OFDM在LTE和5G NR里的地位不用多说了频率选择性信道处理得好好的均衡也简单。但OFDM有个天生的毛病它对时间选择性信道非常敏感。用户在高速移动的时候多普勒频移会让子载波之间的正交性被破坏产生子载波间干扰ICI。你去看经典OFDM文献里的最大多普勒频移限制通常是子载波间隔的1%到5%左右。到了500km/h这种场景4GHz载频下多普勒频移能到1800Hz以上15kHz子载波间隔的子载波正交性基本就崩了就算用线性插值估出CSI信道在一个OFDM符号周期内也变化得足够快均衡出来的星座图照样是一团糊。更麻烦的是时变信道对导频的影响。OFDM里的导频散落在时频网格上接收端拿到的是离散的CSI点中间全靠插值。信道随时间变化越快插值误差越大。我在仿真里试过让OFDM系统直接跑500km/h场景实测BER曲线在高信噪比下会出现明显的“地板效应”——SNR再高误码率也掉不下去这就是ICI和CSI过时共同造成的天花板。1.2 OTFS把“变”变成“稳”的数学思路OTFS的做法和OFDM完全不一样。它把待发送的符号直接放在时延-多普勒delay-Doppler域而不是时频域。时延-多普勒域的信道有个非常漂亮的特性每一条物理路径在这个域里都是一个点扩展函数——时延上落在某个格子上多普勒频移上落在另一个格子上而且只要信道在一个OTFS帧周期内近似不变这些点在时延-多普勒域就是稀疏且近似静止的。换句话说OFDM里让人头疼的时间选择性衰落在OTFS里变成了多普勒维度的“固定偏移”频率选择性衰落变成了时延维度的“固定偏移”。原来搞不定的快速时变信道换个坐标系之后就变成了线性时不变信道。收发两端各做一次辛傅里叶变换SFFT/ISFFT就把数学上很麻烦的问题变成了简单的循环卷积结构。这也是OTFS为什么在学术界被叫了这么多年“6G候选波形”的根本原因——它不是修修补补而是把问题重新描述了一遍。1.3 为什么是4用户——多址接入的真实需求单链路OTFS仿真网上有一堆但通信系统终究是多用户场景。我在设计这套仿真时直接把用户数定成4个原因很简单4用户是上行多址接入里比较典型的小规模配置既能体现出多用户干扰、导频区分、资源分配等问题又不至于让MATLAB跑一次蒙特卡洛模拟等到天亮。架构上4个用户各自生成独立的QPSK符号矩阵分别映射到时延-多普勒资源网格上再各自经过独立的信道到达基站。基站收到的是四路信号的叠加需要利用每个用户独有的导频位置分别估计CSI再分别均衡、解调。这个流程和真实上行链路的结构是一致的基站不做联合发射只做联合接收导频在时延-多普勒网格上的位置就是区分用户的“身份证”。2. 发射链路搭建从QPSK符号到OTFS帧的完整映射2.1 QPSK调制与符号网格的对应关系这套系统里每个OTFS帧是一个M×N的二维网格M对应时延维度也对应子载波数N对应多普勒维度也对应一个帧包含的OFDM符号数。我采用的参数是M128、N32这样一个帧总共承载128×324096个QPSK符号每个QPSK符号携带2比特未考虑导频开销时的原始数据量是8192比特。QPSK映射没什么新鲜的四个星座点取标准单位能量形式1j、-1j、-1-j、1-j除以√2做归一化保证平均符号功率为1。每个用户的比特流先按每2比特一组映射成复数符号再按行优先顺序填入自己的时延-多普勒网格。这里有一个容易被忽略的点QPSK星座的旋转方向会影响符号判决的容错性。我习惯用Gray映射相邻星座点只差1比特这样即使发生一次符号错误也只产生1比特错误BER统计更平滑。如果随机映射星座点相邻比特可能差2位同样的符号错误率会带来更高的比特错误率。2.2 ISFFT与海森堡变换两个变换各自的角色OTFS发射机里有两级变换很多初学者容易混在一起。第一级是ISFFT逆辛傅里叶变换把符号从时延-多普勒域搬到时频域第二级是海森堡变换把时频域的每个点通过OFDM调制的方式搬到时域发送波形。ISFFT在MATLAB里的实现我给出参考代码function X_tf isfft_transform(X_dd, M, N) % X_dd: M x N 时延-多普勒域符号矩阵 % 多普勒维做IFFT X_tf ifft(X_dd, N, 2); % 时延维做FFT X_tf fft(X_tf, M, 1); end这里多说一句不同论文里ISFFT的公式约定有差异有的用纯DFT有的用IFFTFFT组合。关键在于收发两端必须严格互逆接收端SFFT反过来处理即可。我自己遇到过收发端变换不匹配导致星座图整体转置的问题查了半天才发现是多普勒维和时延维的变换顺序反了。你如果自己写这套变换建议先把收发端的变换组合用一个单位冲激输入做验证确认输出是冲激再往下走。海森堡变换在工程上直接复用OFDM调制器把时频域矩阵的每一列看成一个OFDM符号对每列做M点IFFT串行输出后加循环前缀。OTFS的CP长度需要覆盖最大时延扩展我取的CP长度是子载波间隔对应符号周期的1/4左右具体数值下面参数表里会列。2.3 4用户资源块划分与帧结构设计4个用户共用一个M×N帧结构关键是怎么分工。常见的做法是多普勒维度均分每个用户分到N/4个多普勒符号所有用户在时延维上共占整个带宽。这样每个用户的数据区域是一个M×(N/4)的矩形块。但我在实际仿真中发现如果4个用户的数据区域紧挨着导频一旦放置不当用户间干扰就会直接影响信道估计。我的方案是给每个用户在时延-多普勒网格里配置独立的导频区域和保护间隔每个用户的导频放在自己数据块内部偏中心的位置导频周围留出一圈零符号作为保护间隔。这个保护间隔的宽度要参考信道最大时延和多普勒扩展来确定太窄了导频能量会扩散到数据区造成污染太宽了又浪费宝贵的时延-多普勒资源。当然如果你是做多用户叠加接收仿真更贴近真实链路的做法是每个用户独立完成自己的ISFFT和海森堡变换在时域叠加后再过信道。我在最终版本里就是这样处理的每个用户单独生成自己的时域波形经过各自的多径信道后叠加再在基站端加噪声。这样每个用户的信道响应不同导频位置不同能完整体现多用户干扰下的CSI估计难度。3. 接收端LMMSE信道估计CSI从导频到全网格的插值3.1 导频嵌入方式与保护间隔设计接收端第一个核心任务就是CSI估计。OTFS里导频嵌入的方式和OFDM不太一样导频直接放在时延-多普勒域的网格上而不是时频域。我给每个用户设计的导频图案是“单点导频环形保护”。具体来说在每个用户数据块的中心位置放一个能量较高的QPSK符号作为导频叫做Pilot Symbol围绕它的一个矩形区域内全部置零这个零区域叫做Guard Symbols。这样做的物理意义是信道在时延-多普勒域会引起能量扩散导频经过信道后会在四周“糊开”一个区域保护间隔的作用就是确保糊开的这部分能量不干扰数据符号的判决。保护间隔的大小由信道参数决定。假设最大多普勒频移对应的格子数叫K_max最大时延扩展对应的格子数叫L_max那么导频周围至少要在多普勒维留2×K_max1的零区、在时延维留2×L_max1的零区。我的仿真里K_max取3、L_max取4所以保护区是一个7×9的零矩形。这个区域的开销是实打实的导频密度越高开销越大后面第5节会聊怎么平衡开销和估计性能。3.2 LMMSE估计器的推导与MATLAB实现导频位置的初步估计通常直接用最小二乘LS法用接收导频除以发送导频得到导频位置的信道响应。LS估计简单但对噪声极其敏感导频处的估计误差会直接污染后续所有插值。所以标题里明确用了LMMSE它是在LS基础上利用信道统计特性做了一次“修正”。LMMSE的核心公式如下[ \mathbf{h}{mmse} \mathbf{R}{hh}(\mathbf{R}{hh} \sigma_n^2 \mathbf{I})^{-1} \mathbf{h}{ls} ]其中(\mathbf{R}_{hh})是导频位置对应的信道自相关矩阵(\sigma_n^2)是噪声功率。直观理解就是如果信道相关性很强说明相邻导频上的信道值应该接近那么LMMSE会把LS估计里的高频噪声“按相关性比例平滑掉”如果信道相关性很弱估计器就倾向于相信当前点的LS值。它本质上是给LS估计加了一个基于统计先验的线性滤波。MATLAB实现时有个常见的坑相关矩阵的构造。我最初图省事直接用单位矩阵替代(\mathbf{R}_{hh})结果LMMSE退化成了LS性能完全没有提升。后来老老实实按照多径时延功率谱和多普勒功率谱生成相关矩阵。一个简化做法是用指数衰减模型function R gen_channel_corr(delay_taps, doppler_taps, num_pilot) % 时延维相关 R_delay toeplitz(exp(-delay_taps * linspace(0, 2, num_pilot))); % 多普勒维相关 R_doppler toeplitz(sinc(doppler_taps * linspace(0, 1, num_pilot))); % 二维Kronecker积近似 R kron(R_doppler, R_delay); end这只是近似模型精度够用。实际信道如果测到真实的相干函数直接替换进来就能提升LMMSE的精度。估计流程是先在所有导频位置做LS估计把估计结果排列成向量乘上LMMSE滤波矩阵再把滤波后的值通过二维插值映射回完整的M×N网格。注意LMMSE输出的只是导频位置的修正值全网格插值还需要一步我用的方法是线性插值配合边界填充。后来我试过用三次样条插值高信噪比下误码率有一点点改善但复杂度上去了性价比较低。3.3 4用户场景下的导频碰撞与干扰抑制4用户场景下LMMSE最大的敌人是导频碰撞。如果两个用户的保护间隔不够大或者导频在时延-多普勒网格上靠得太近A用户的导频经过信道扩散后可能“漂”到B用户的导频区域里B用户做LS估计时拿到的接收信号就包含了A用户的干扰成分。这个干扰一旦进入LMMSE的统计模型LMMSE的噪声项只建模了AWGN没有建模用户间干扰估计性能会显著恶化。我在仿真里验证过一次把4个用户的导频同时放在相邻的网格区域结果4个用户的BER曲线在20dB SNR处就开始分化有的用户甚至出现了错误地板。后来把各用户导频中心距拉大到保护间隔的最小要求以上并把保护间隔从单链表式的零区升级为叠加的双重保护区问题才消失。另一个实践中有效的做法是给每个用户的导频分配不同的功率偏置。比如用户1的导频功率是数据符号的3倍用户2是4倍以此类推。这样即使存在轻微干扰LMMSE也能通过导频能量差异来区分目标用户和干扰用户。导频功率比的具体值要在“估计精度”和“峰均比”之间权衡我的仿真里取数据符号功率的2~4倍比较稳定。4. 仿真代码实现要点与踩坑实录4.1 系统参数表与仿真主循环先把参数表列出来方便对照参数名取值说明时延格子数 M128子载波数/时延维分辨率多普勒格子数 N32OTFS符号数/多普勒维分辨率调制方式QPSK2比特/符号Gray映射用户数4上行多用户叠加CP长度16覆盖最大时延扩展信道径数/用户4~6每径服从瑞利衰落最大多普勒频移1850 Hz对应4GHz载频、500km/h导频功率偏置数据符号的3倍提升CSI估计精度蒙特卡洛帧数200~500按SNR动态调整主循环结构大致是三层外层遍历SNR点中层遍历蒙特卡洛帧内层按用户循环发射和接收。每个SNR点至少跑200帧低SNR时BER较高200帧已经能累计几千个错误比特高SNR时为了把BER曲线画到1e-3以下我提到500帧、甚至动态增加帧数来保证每个SNR点至少统计到100个错误比特。4.2 踩坑一ISFFT/SFFT维度顺序导致的星座图转置这个坑前面提过但值得展开讲讲。我第一次跑通整条链路时解调出来的星座图是完全乱的怎么看都像一堆噪声。最开始怀疑信道模型错了后来怀疑均衡器写错了折腾了整整两天。最后是拿掉信道和噪声直接做收发端直连测试才发现问题是ISFFT和SFFT的维度顺序不一致。我当时的ISFFT写成先对多普勒维做IFFT、再对时延维做FFTSFFT写成先对时延维做FFT、再对多普勒维做IFFT。表面上看起来是对称的但收发两端的变换没有严格共轭对齐等效于在时延-多普勒域做了一个置换。信号经过两跳之后数据阵的位置全部错位了星座点当然救不回来。后来养成了一个习惯把收发端当成一个整体做验证输入一个只在某个特定格子上有值的符号矩阵如果接收端能原样恢复允许整体延迟和相位旋转才算变换链路正确。4.3 踩坑二多普勒分辨率与用户速度换算错误OTFS的网格上的多普勒格子是有物理分辨率的。在这个仿真里一个OTFS帧的时长为N×T_symbolT_symbol包含CP多普勒分辨率是1除以这个时长。我算过当N32、子载波间隔15kHz时一个OFDM符号周期约71.4μs帧长约2.29ms多普勒分辨率约437Hz。4GHz载频、500km/h速度对应的多普勒频移约1853Hz除以437Hz大约等于4.2个多普勒格子。这意味着信道产生的多普勒偏移应该近似落在第4个格子上。我最初把速度对应的多普勒偏移直接当成了整数个采样点忽略了剩余的小数部分导致分数多普勒的问题。分数多普勒会造成ICI在时延-多普勒域扩散如果不处理高SNR情况下会出现BER地板。我的解决方法是信道生成时保留落地的小数偏移让循环卷积本身去吸收能量扩散带来的影响。这样虽然更贴近真实物理信道但对LMMSE的保护间隔要求也更高了。4.4 踩坑三导频功率设置严重偏离导致估计偏差导频功率偏置一开始我没细想直接取了数据符号功率的10倍。结果高SNR时BER不降反升一度让我怀疑LMMSE算法写错了。后来分析发现导频功率过大接收端导频区域的信号幅度远超数据区域而LMMSE的噪声估计还是按整个帧的SNR统一算的导频位置的信噪比远高于数据位置但估计器误以为是信道相关性很强导致过度平滑反而把导频处的细节信息抹掉了。最后我把导频功率偏置调到3倍并同步修正了LMMSE里的噪声归一化因子性能立刻恢复正常。这也提醒我LMMSE里的(\sigma_n^2)不是随便填的它要和导频符号的能量相对标。不同导频功率下等效噪声功率要做对应缩放否则公式里的信噪比就是错的。5. 误码率曲线解读与参数调优经验5.1 不同SNR下BER曲线的三段规律仿真跑完4用户OTFS系统在不同SNR下的BER曲线有一些明显的规律特征。我这里总结成三段式第一段是低SNR区0~8dB噪声主导BER从0.2左右逐渐下降到0.01量级。这一段LMMSE的统计优势还不明显因为噪声功率太大信道相关先验也压不住误差曲线形态接近理论QPSK AWGN曲线但整体差2~3dB这个差距就是多径和用户间干扰带来的代价。第二段是中高SNR区10~18dB曲线进入快速下降区。此时LMMSE的估计精度逐步逼近理想信道估计的效果BER斜率变陡。4用户系统的曲线比单用户OTFS下降得慢一点干扰是主因。第三段是极高SNR区20dB以上如果信道模型里导频密度不足或者分数多普勒没处理曲线就会进入误差地板BER卡在某个值上不再下降。我前面提到导频保护间隔不够宽、以及多普勒分辨率不足的场景就是这个地板的两个来源。如果能看到这条曲线的地板区说明系统的限制因素已经从噪声变成了估计误差或残余ICI需要回头调保护间隔和信道参数。5.2 导频密度与数据开销的权衡导频密度是OTFS仿真里最容易顾此失彼的调参项。导频放得多CSI估计准但每个帧里能传的数据符号就少了有效频谱效率直接下降。我统计过一次当保护间隔按K_max3、L_max4配置时单个用户的导频加保护区域大约占掉数据网格的5%~7%4个用户全算上整个帧的导频开销接近25%。在高速场景下这个开销是可以接受的因为如果不做导频增强BER地板会让你觉得整个链路都是废的。但如果你做的是低移动场景仿真K_max和L_max都会变小保护间隔可以压缩到很小导频密度降下来效率就上去了。我建议你仿真时把导频开销和净数据速率两项指标都打出来对比不要只看BER。5.3 从曲线反推系统瓶颈的排查思路如果你仿真出来的BER曲线长时间躺平就是“地板”先说一个我自己的排查顺序。第一步把信道直接去掉只保留AWGN跑一次看曲线是否接近理论QPSK曲线这一步是为了排除收发链路本身的BUG第二步保留信道但改成理想CSI估计直接把真实信道响应用在均衡器里如果性能大幅提升说明瓶颈在CSI估计第三步把理想CSI换成LS估计对比LMMSE性能如果LS和LMMSE差别不大说明当前导频密度下统计先验发挥不了作用要么是信道相关性很低要么是导频密度已经足够高。这三步走下来基本能定位问题出在哪一层。我在4用户仿真里跑调参时就靠着这套排查方法快速找到了导频功率比例这个病根。6. 这套OTFS仿真还能往哪些方向扩展6.1 MIMO-OTFS与多天线联合估计现在这套仿真还停留在单天线收发。下一步比较自然的扩展是MIMO-OTFS。在时延-多普勒域做MIMO信道矩阵维度会变大不少但核心思路不变每个收发天线对之间都有一个二维信道响应LMMSE估计时需要把多天线相关的信道矩阵做联合估计复杂度会从二维上升到四维。MATLAB里跑小规模2×2 MIMO-OTFS还是可行的内存和仿真时间也还能接受。6.2 深度学习辅助CSI插值LMMSE的统计建模依赖信道相关矩阵真实场景里这个矩阵往往是未知或者时变的。现在业界一个热门方向是用深度神经网络做CSI插值导频位置的信道值送给网络输出完整网格的信道估计。这个方向很适合在这套代码上扩展——数据生成非常方便直接用现有仿真链路打标签深网模型训练好后对比LMMSE的BER差距会很有意思。6.3 接入真实信道测量数据做回落验证最后说一个很实际的方向把仿真里的统计信道模型替换成实测信道冲激响应数据。现在不少无线信道测量公开数据集都提供了时延和多普勒谱的实测剖面把这些数据导入MATLAB生成信道响应跑出来的BER曲线会更有工程参考价值。毕竟我们做物理层仿真最终目标还是为了让算法在真实信道里也能站得住脚。这整套4用户OTFS仿真的代码量其实不大核心模块就发射、信道、接收、估计、均衡这几块但真正跑通并拿到可信的BER曲线还是需要把每一个细节都扣干净。希望我这些实操记录能帮你少走点弯路特别是那些维度顺序、导频配置、相关矩阵构造之类的坑提前避开能省下大量调试时间。
返回列表