简介:本资源是一套面向通信工程专业高年级本科生及研究生的MATLAB仿真实践项目,聚焦多径衰落宽带信道下OFDM与OTFS两种主流调制技术的性能对比分析,解决无线系统中频率选择性衰落导致误码率升高、鲁棒性下降的核心问题。压缩包共9个.m文件,总大小仅12KB,涵盖主控脚本(main.m)、数据生成(dataGen.m)、OFDM调制/解调(modOFDM.m/demodOFDM.m)、OTFS核心变换(SFFT.m/ISFFT.m)、多径信道建模(multipathChannel.m)及均衡器实现(equaliser.m),所有模块均采用模块化设计,便于理解信号流与算法逻辑。已有2643人学习下载,适合开展课程设计、毕设仿真或深入掌握时频域联合调制原理。读者可直接运行复现BER曲线对比图(plotGraphs.m),获取完整信道估计、循环前缀处理、DFT域映射等关键环节的可调试代码,为后续5G/6G新型波形研究奠定实践基础。 OFDM和OTFS这两套方案,我在MATLAB里前前后后折腾了将近两个月。起因很简单——通信原理课设要求做“多径衰落信道下的宽带无线通信系统仿真”,一开始图省事想用OFDM交差,结果把移动台速度从30km/h调到120km/h再往上拉的时候,完整复现了OFDM在时变信道下的经典崩溃场景:误码率曲线掉不下去,出现明显的错误平层。后来把OTFS加进来做对比,才真正理解了为什么这两年OTFS在高速移动场景被反复提起。这篇文章就从这套MATLAB仿真平台出发,把OFDM和OTFS的底层逻辑、整体架构设计、关键模块实现、结果对比和调试经验一次性讲清楚。适合正在做课程设计、毕业设计,或者刚接触宽带无线通信物理层仿真的同学参考。
1. OFDM和OTFS到底在争什么:从时频域到时延-多普勒域
1.1 多径衰落让宽带信号吃了哪些苦头
宽带无线通信系统里,多径衰落是绕不开的坎。发射信号经过建筑物、地面、车辆等反射体,到达接收端时已经不是一路,而是几十路不同时延、不同幅度、不同相位的叠加。当信号带宽增大到一定程度,符号周期变得很短,多径时延扩展就超过了符号周期,前一符号的尾部和后一符号的头部撞在一起,形成码间干扰。
在频域上看,多径信道的频率响应不再是平坦的,某些频率分量被深衰落,某些频率分量被增强,出现频率选择性衰落。衡量这个现象有两个关键参数:相干带宽和时延扩展。相干带宽近似等于时延扩展的倒数,当信号带宽大于相干带宽,信道在频域上剧烈起伏,宽带信号就被严重畸变。
这个问题的本质是:符号周期越短,时间分辨率越高,越能分辨出多径的“层”,但越容易让不同路径之间互相踩踏。所以宽带系统的设计必须有一个“分割”策略——OFDM和OTFS给出了两种完全不同的分割思路。
1.2 OFDM的思路与天花板
OFDM的做法很直观:把宽带信道在频域上切成很多窄带子信道,每个子载波带宽小于相干带宽,于是每个子载波上只经历平坦衰落,用一阶均衡器就能恢复。配合循环前缀吸收多径时延扩展,把线性卷积变成循环卷积,接收端用FFT一次解调所有子载波。
这套逻辑在准静态信道下非常漂亮。但在移动环境里,信道冲激响应随时间变化,多普勒频移破坏子载波间的正交性。子载波间干扰(ICI)产生后,每个子载波的检测不再是独立的,误码率出现地板效应——SNR再高也压不下去。多普勒频移fd与移动速度v、载频fc的关系是fd = v·fc/c。以4GHz载频、350km/h移动速度为例,最大多普勒频移约1296Hz,虽然相对15kHz子载波间隔只有8.6%,但已经足以在长符号周期下造成明显ICI,尤其是在高阶QAM调制时。
另一个隐患是OFDM峰均比(PAPR)较高,需要发射机射频功放有较大的回退裕量,这在实际系统中是效率和成本的痛点。
1.3 OTFS:换一个域来战斗
OTFS的核心思路不是抵抗多径和多普勒,而是把信息从时频域换到时延-多普勒域传输。它利用了信道在时延-多普勒域的稀疏性:给定信道只有少数几条路径,每条路径对应一个时延抽头和一个多普勒抽头,那么信道在这个二维平面上只有L个非零抽头,稀疏性极强。更重要的是,时延-多普勒域的信道响应随时间变化非常缓慢,可以认为在一帧时间内基本不变。
OTFS的调制流程可以这样理解:把要发送的QAM符号直接放置在时延-多普勒域的M×N网格上,通过逆辛有限傅里叶变换(ISFFT)将符号映射到时频域,再通过海森堡变换将时频域符号转化为时域信号发送。接收端做相反的维格纳变换和辛有限傅里叶变换(SFFT),把接收信号还原到时延-多普勒域进行处理。
由于每个符号在传输过程中经历了整个时延-多普勒平面上的所有变化,在接收端看来,每个符号都经历了几乎相同的信道增益,不存在OFDM中某些子载波深衰落、某些子载波完好这种“同病不同命”的问题。代价是接收机复杂度更高,尤其在做二维均衡的时候。
2. 这套MATLAB仿真平台的整体设计与参数权衡
2.1 框架划分为五个模块:配置、发射、信道、接收、评估
我搭建这套仿真平台时没有一上来就堆代码,而是先画了模块边界。整个工程分成五个独立模块:参数配置模块、发射模块、信道模块、接收模块、性能评估模块。模块之间用结构体传参,每个模块独立调试,这种设计在排错时特别重要——你至少能定位错误是在发送端还是在信道,还是在接收端。
参数配置模块集中管理所有系统参数,包括调制阶数、FFT点数、CP长度、子载波间隔、载频、多径时延功率谱、移动速度、仿真SNR区间、蒙特卡洛次数等。这样要复现某个实验只需要改配置文件,不用翻代码。
发射模块根据参数生成OFDM或者OTFS信号,接收模块反向解调,两个模块之间通过信道模块衔接。性能评估模块统计BER、星座图、PAPR、频谱效率等指标。这种分层设计还方便后续扩展,比如把单发单收升级成MIMO-OTFS,只需要在发射和接收模块内部增加空间维度。
2.2 关键参数设计及背后理由
好的仿真参数不是拍脑袋定的。我参考了LTE和5G NR的一些典型配置,结合实验室算力做了取舍。核心参数如下表:
| 参数 | 取值 | 设计理由 |
|---|---|---|
| 载频 | 4 GHz | 典型中频段,与5G Sub-6GHz场景接近 |
| 子载波间隔 | 15 kHz | 沿用LTE/NR的基准间隔 |
| FFT点数 | 256 | 实际有效子载波设为128,两侧留保护带 |
| 调制方式 | 16QAM/64QAM | 兼顾速率与星座图可观察性 |
| 循环前缀长度 | 64 | 对应约17.3us,覆盖城区信道时延扩展 |
| OTFS网格 | M=128, N=14 | 每个OTFS帧与14个OFDM符号时长对齐 |
| 移动速度 | 0~350 km/h | 覆盖从静止到高速铁路场景 |
| 多径数 | 6径 | 参考ITU城区信道模型简化而来 |
需要特别说明的是OFDM和OTFS的帧对齐问题。如果OTFS网格大小定为M×N,其中M对应频域子载波数,N对应时间符号数,那么一个OTFS帧占用N个OFDM符号的时长。我把N设为14,这样两个系统在相同带宽、相同调制方式下,一个OTFS帧与14个OFDM符号具有相同的时间和频谱资源,性能比较才公平。
2.3 帧结构和导频设计:公平对比的前提
OFDM的帧结构比较常规:每帧开头放两个训练符号用于同步和信道估计,数据符号之间在频域间隔插入梳状导频,导频间隔要小于相干带宽。
OTFS的导频设计则要同时处理时延维和多普勒维的估计问题。我在时延-多普勒域中预留了一个专门的导频区域:在网格的特定位置放置一个功率加强的导频符号,周围留一圈保护零符号,防止数据符号对导频的干扰。导频功率通常比数据符号高8-10dB,这样才能在接收端从噪声中分辨出信道冲激响应。时延维的保护间隔要大于多径时延扩展对应的抽头数,多普勒维的保护间隔要大于最大多普勒频移对应的抽头数,前者由CP决定,后者由移动速度决定。
如果为了对比公平,两种系统的信道估计都使用LS准则,那么性能差距基本来自调制方案本身,而不是导频设计、估计准则这些外部因素。
3. 从OFDM到OTFS的收发链路MATLAB实现
3.1 多径衰落信道建模:抽头延迟线加Jakes谱
信道模块我选了抽头延迟线模型。每个抽头对应一条路径,需要指定三个参数:抽头的相对时延、平均功率、多普勒频谱类型。多普勒频谱用Jakes谱,反映移动环境中散射体均匀分布在水平面上的经典假设。
在MATLAB中,我使用comm.RayleighChannel这个通信工具箱对象来生成时变多径信道。关键设置如下:
rayleighChan = comm.RayleighChannel( ... 'SampleRate', fs, ... 'PathDelays', [0 0.1 0.3 0.5 1.0 2.5]*1e-6, ... 'AveragePathGains', [0 -2 -5 -8 -12 -18], ... 'MaximumDopplerShift', fd, ... 'DopplerSpectrum', doppler('Jakes'));这里的PathDelays表示路径时延,AveragePathGains表示相对功率。fd根据移动速度实时计算,然后通过reset(rayleighChan)重置随机流,保证多次蒙特卡洛实验的可重复性。这里有个细节需要注意:comm.RayleighChannel需要在每次调用前通过release和reset确保信道响应随帧间独立变化,否则不同帧之间信道完全一样,BER结果会失真。
设置完信道之后,我用dsp.TimeScope观察信道冲激响应的时变情况,确认多径的时延和功率分布与设定一致。这个验证步骤很多人会跳过,但信道模块是所有性能差异的根源,如果信道本身就不是预想的样子,后面所有结论都没有意义。
3.2 OFDM收发链路:标准流程中的三个坑
OFDM发射机部分的标准流程是:比特流 -> QAM调制 -> 串并变换 -> 子载波映射 -> IFFT -> 加CP -> 加窗 -> 并串变换发送。接收机反向处理。代码框架可以简化为:
% 发射端 qamSym = qammod(dataBits, M, 'gray', 'InputType', 'bit'); ofdmFreq = zeros(fftLen, numSym); ofdmFreq(dataIdx, :) = reshape(qamSym, numDataSub, numSym); ofdmTime = ifft(ifftshift(ofdmFreq, 1), fftLen, 1); txSignal = [ofdmTime(end-cpLen+1:end, :); ofdmTime]; % 加循环前缀 txWaveform = txSignal(:); % 接收端 rxMatrix = reshape(rxWaveform, fftLen+cpLen, numSym); rxMatrix = rxMatrix(cpLen+1:end, :); rxFreq = fftshift(fft(rxMatrix, fftLen, 1), 1);这里我要强调三个很容易踩的坑。
第一是IFFT/FFT的频谱搬移。MATLAB的fft函数默认将零频放在第一个位置,而OFDM的子载波映射通常按中心频率对称分布,所以发射端要对频域向量做fftshift再ifft,接收端做完fft之后要再ifftshift回来。忽略这个步骤,星座图上会出现子载波映射错位,误码率直接崩掉。
第二是QAM符号功率归一化。qammod默认输出星座点平均功率不是1,例如16QAM的平均功率是10。如果发射和接收没有做功率归一化,或者信道模块输入信号功率与预期不符,最终BER曲线会整体偏移几个dB。正确的做法是在调制后除以sqrt(mean(abs(qamSym).^2)),使平均功率为1,然后在噪声注入时再根据SNR计算噪声方差。
第三是导频符号的功率。在LS信道估计中,估计值是接收信号除以发射导频。如果导频符号没有归一化,估计出的信道增益就会带入一个固定倍数的偏差。这种偏差在SNR高的时候不明显,在SNR低的时候直接导致BER曲线恶化。
3.3 OTFS收发链路:ISFFT和海森堡变换的实现顺序
OTFS的实现比OFDM多了一个维度,但仔细拆开看,它的发射机本质上是“时延-多普勒域符号 -> ISFFT -> 海森堡变换 -> 时域波形”的三步过程。
先看ISFFT。时延-多普勒域网格是M×N矩阵Xdd,其中M是时延维(对应频率子载波数),N是多普勒维(对应时间符号数)。ISFFT的作用是把Xdd变换为时频域矩阵Xtf。在MATLAB中,标准的实现顺序是:先沿多普勒维做IFFT,再沿时延维做FFT:
% 时延-多普勒域 -> 时频域 xtf = fft(ifft(Xdd, N, 2), M, 1) / sqrt(M*N);然后做海森堡变换。海森堡变换本质上就是OFDM调制器的扩展:对时频域矩阵的每一列(即每个时隙上的M个子载波数据)做IFFT,加循环前缀,再串行发送:
% 时频域 -> 时域 txMatrix = ifft(xtf, M, 1); txSignal = [txMatrix(end-cpLen+1:end, :); txMatrix]; % 加CP txWaveform = txSignal(:).';接收端是逆过程:先把接收波形重排为矩阵,去CP,做FFT得到时频域接收矩阵,即维格纳变换,然后做SFFT变换回时延-多普勒域:
% 时域波形 -> 时频域 rxMatrix = reshape(rxWaveform, M+cpLen, N); rxMatrix = rxMatrix(cpLen+1:end, :); ytf = fft(rxMatrix, M, 1); % 时频域 -> 时延-多普勒域 ydd = ifft(fft(ytf, N, 2), M, 1) / sqrt(M*N);这里有一个容易搞混的细节:ISFFT的两维变换方向不同。时延维对应频率,用FFT;多普勒维对应时间,用IFFT。把方向搞反了,发射和接收之间就完全对不上了。我在最初实现时犯过这个错误,现象是BER在低SNR下看起来还行,但SNR越高越差,因为系统等于在做错误的“编码”、即使无噪声也无法完美恢复。排查思路是先在无噪声、无信道条件下做收发自检,如果星座图无法完美还原,第一反应就应该是变换方向或归一化出了问题。
另一个经验是,OTFS收发链路中窗函数的选择对性能影响很大。标准的OTFS通常采用矩形窗,简单且数学上容易分析。但在时变信道下,帧边界的能量泄漏会造成时延-多普勒域信号的扩散,导致误码率上升。如果需要更精细的抑制,可以选用升余弦窗或旁瓣抑制窗,代价是降低频谱效率。对于课程设计和入门级仿真,矩形窗已经完全够用。
3.4 信道估计与均衡:OTFS为什么更麻烦
OFDM接收端的信道估计和均衡相对简单:在每个子载波上,用导频位置的LS估计值做频域插值,得到所有子载波上的信道增益,再做一阶追零或者MMSE均衡。这是OFDM的一大优势——均衡器是单抽头的。
OTFS的均衡要复杂得多。接收端还原到时延-多普勒域的信号模型是一个二维循环卷积关系:
ydd[m,n]可以直接写成发射符号与信道冲激响应在时延-多普勒域上的循环卷积再加上噪声。如果直接做MMSE估计,需要处理MN×MN维的矩阵求逆,对于M=128、N=14的网格,维度是1792×1792,单次仿真就要做上百次矩阵求逆,计算量完全不可接受。
工程上通常采用低复杂度的近似算法。我在实现中使用了基于消息传递(MP)的检测算法,利用信道在时延-多普勒域的稀疏性,把大规模联合检测分解为逐个符号的置信传播更新。MP算法需要设置最大迭代次数(一般设为5-10次)和收敛门限。从实测结果看,迭代5次已经能取得接近理想性能的BER,再增加迭代次数收益很小。
对于MMSE线性均衡,我做了进一步简化:把时延-多普勒域的信道矩阵近似为带状矩阵,只考虑主对角线和附近若干条对角线上的非零元素,将求逆复杂度从O((MN)^3)降低到接近O(MN·K^2),其中K是考虑的非零对角线条数。这个简化在稀疏信道下性能损失很小。
4. 仿真结果对比:谁更扛得住多径和高速
4.1 低速场景:OFDM的舒适区
当移动速度设定为30km/h时,最大多普勒频移约111Hz,对15kHz子载波间隔来说不到千分之八。此时OFDM的子载波正交性基本保持,误码率曲线与理论AWGN下的16QAM曲线几乎重合。
OTFS在该场景下的性能与OFDM相当,两者在SNR 18dB时都能达到10^-4以下的误码率。这符合预期——低速场景信道近乎时不变,OFDM的频域正交优势正好发挥,OTFS虽然在时延-多普勒域也做了很好的能量聚集,但没有低出数量级的差距。
这个结果说明一个问题:OTFS并不是在所有场景都碾压OFDM。如果只做低速固定场景,OFDM是更轻量、更成熟的方案。OTFS的价值要在信道真正“动”起来之后才体现。
4.2 高速场景:OFDM的错误平层与OTFS的稳健
把速度拉高到350km/h,最大多普勒频移约1296Hz,情况就完全不同了。
OFDM的BER曲线在SNR约14-16dB之后出现显著的错误平层,继续加大SNR也无法改善,最终误码率稳定在10^-3量级。这个错误平层来自ICI:多普勒扩展导致子载波间的正交性破坏,无论信噪比多高,干扰项都存在,且与噪声无关,这是OFDM在时变信道下的结构性上限。
OTFS在同一场景下保持了对SNR的敏感度,BER曲线几乎一直随SNR增加而下降,在SNR 20dB时能达到10^-5以下。增益不是小数目,在目标误码率10^-3时,OTFS比OFDM有约8-9dB的SNR增益。
我在不同速度下扫描了BER,得到如下结果(SNR=18dB,16QAM):
| 移动速度 | 最大多普勒频移 | OFDM BER | OTFS BER |
|---|---|---|---|
| 30 km/h | 111 Hz | 4.2e-5 | 3.8e-5 |
| 120 km/h | 444 Hz | 2.8e-3 | 6.5e-5 |
| 250 km/h | 926 Hz | 6.7e-3 | 2.1e-4 |
| 350 km/h | 1296 Hz | 1.1e-2 | 5.4e-4 |
注意这里OTFS在250km/h和350km/h下也开始上升,这是因为我对OTFS帧长N=14的设计在更高速度下的多普勒分辨率受限。要在更高速度下保持性能,需要增大N,即延长帧时长来提升多普勒分辨率,但帧太长也会带来信道在帧内非平稳的问题,这是一个需要权衡的设计点。
4.3 PAPR与复杂度:先进方案的光环之外
OTFS的抗多普勒优势很突出,但它不是免费的午餐。
峰均比方面,OTFS因为本质上是二维扩频的OFDM变换,时域信号仍然是多个子载波的叠加,PAPR问题和OFDM一样严重。我实测在16QAM下两者的CCDF(互补累积分布函数)曲线几乎重合,PAPR超过10dB的概率都在0.1%左右。如果面向实际发射机,PAPR抑制需要单独考虑。
复杂度方面,OFDM的收发链路是线性复杂度,信道估计和均衡是O(N·logN)级别。OTFS发射端多了一次二维变换,复杂度略高但仍可控;真正的大头在接收端均衡。MP检测器的复杂度虽然是O(MN·L·I),其中L是抽头数、I是迭代次数,比全维度MMSE低了很多,但相比OFDM的单抽头均衡仍然高了两个数量级。在M=128、N=14、L=6、迭代5次的配置下,处理一帧的时间大约是OFDM的30倍左右。
4.4 时延-多普勒域信道响应可视化
仿真中有一个环节让我真正理解了OTFS的本质:画出时延-多普勒域的信道响应矩阵。接收端完成信道估计后,我把估计出的信道矩阵画成二维图像,横轴是多普勒抽头索引,纵轴是时延抽头索引。
图像上只有6个孤立的亮点,分别对应信道模型中的6条路径,每个亮点在时延维和多普勒维上的位置对应路径的时延和多普勒频移。整个矩阵是高度稀疏的。OTFS就是把数据符号部署在这个“稀疏亮点”所在的坐标系里,每个符号的能量分布在整个时延-多普勒平面上,经过信道之后,符号间的干扰集中在少数可预测的抽头上,接收机用MP迭代可以把这些干扰逐个剥离。
这种可视化不仅用于验证,还能帮助调试信道模型参数是否合理。比如发现图像上出现垂直条纹,说明信道在频域存在明显的相干性丢失;出现连续区域而不是离散亮点,说明多径分量的时延扩展太大或者抽头数设置不足。
5. 仿真过程中最值得记录的调试经验
5.1 SNR换算与QAM功率归一化:3dB偏差的常见来源
我在第一次跑BER曲线时发现仿真曲线比理论曲线偏移了约3dB。排查了大半天,最后定位在噪声功率计算上。
问题出在QAM符号的功率归一化和噪声方差计算脱节。如果我让QAM符号的平均功率为1,那么一个16QAM符号承载4个比特,比特能量Eb = 1/4。而一般BER曲线横坐标要求是Eb/N0,不是符号级SNR。两者换算关系是:
SNR_dB = EbN0_dB + 10*log10(bitsPerSymbol)
如果漏掉这个bitsPerSymbol项,曲线就会在横坐标上差10*log10(4)≈6dB,而不是3dB。但实际的3dB偏差往往来自另一个地方:噪声方差计算时把实部和虚部合起来时,AWGN的功率应该反映在复数域的方差上。MATLAB的awgn函数默认输入信号是实数还是复数处理方式不同,如果是复数信号,awgn函数按每个实数维度分别计算噪声功率,总噪声功率会是实数信号的2倍。如果不小心用了实数信号版本的awgn,噪声偏小3dB,曲线自然整体左移。
我的建议是不要依赖awgn函数,手动注入噪声更可控:
noiseVar = 10^(-snrDb/10) / bitsPerSymbol; % 按EbN0生成 noise = sqrt(noiseVar/2) * (randn(size(txSignal)) + 1j*randn(size(txSignal))); rxSignal = txSignal + noise;这样每一步都透明可控,出了问题也好排查。
5.2 CP长度与多径时延扩展的失配问题
CP长度小于最大多径时延时,OFDM的循环卷积假设被破坏,前一个符号的拖尾会渗入当前符号,并且FFT窗口内包含不完整的线性卷积段,造成严重的符号间干扰。
我最初设计的CP长度是64个采样点,对应时延约17.3us。信道模型中的最大路径时延是2.5us,按理说是足够的。但我在修改信道模型时把PathDelays乘了一个系数,最大时延变成了8us,仍然小于17.3us,BER却出现了异常。
排查后才发现,问题不在CP不够长,而在OFDM符号的时域信号经过信道后,FFT窗口的对齐位置发生了偏移。因为我在发射端加了CP,接收端也去了CP,但去CP时没有考虑信道引入的时延偏移,导致FFT窗口错位。加入一个简单的符号定时估计模块,找到第一径到达时刻再取CP,问题就解决了。
这个经验说明:仿真中即使信道参数在合理范围内,链路的时序对齐仍然不可掉以轻心。在真实系统中,同步模块是OFDM接收机中极其重要的一环,仿真时可以用理想同步来简化,但必须明确意识到这是理想假设。
5.3 OTFS的时延-多普勒域边界效应
OTFS在高速场景下的BER曲线,在SNR高于20dB后有时会呈现出略微上扬或者“拐弯”的现象。这不是算法本身的问题,而是矩形窗在时延-多普勒域的频谱泄漏导致的。
时延-多普勒域网格的维度是有限的,等效于在时延维和多普勒维分别加了一个矩形窗。矩形窗的频域旁瓣很高,信道的能量会泄漏到相邻抽头,导致本来稀疏的信道矩阵变成“模糊”的带状矩阵。MP检测器对信道矩阵的稀疏性有依赖,旁瓣泄漏越多,检测性能下降越明显。
缓解手段有两个:一是增加保护抽头数量,在时延维和多普勒维的边缘多留一些空白抽头,让泄漏的能量散落在保护区域而不是数据区域内;二是在发送端使用具有更低旁瓣的窗函数,如汉明窗,但这会牺牲部分多普勒分辨率,需要权衡。在实际仿真中,增加保护抽头是最简单有效的办法,我最终把时延维保留边带从0增加到6个抽头后,边界效应基本消失。
5.4 蒙特卡洛仿真加速:并行、预分配与随机流控制
宽带系统仿真的计算量大头在信道滤波和OTFS接收机的MP迭代。在MATLAB中跑完整蒙特卡洛实验,一晚上只够跑十几个SNR点。我的加速经验分三层。
第一层是代码层面的向量化。不要用for循环逐个符号处理,尽量用矩阵运算一次处理一帧。OFDM链路中特别明显,一个FFT代所有子载波数据,循环只在符号级展开。
第二层是并行化。把每个SNR点的仿真独立分配到不同worker上,用parfor替代for。有几个注意点:随机数流要控制好,每个worker分配独立的rand stream并设置种子,否则不同SNR点之间可能产生完全相同的信道序列,影响统计独立性;还有parfor内部的变量分类,循环体内修改的累加变量必须规范使用,否则MATLAB会报错或者静默产生错误结果。
第三层是减少不必要的重复计算。比如信道响应矩阵在相同速度配置下是统计相同的,可以生成一批信道样本后缓存起来,多个SNR点复用同一个信道池,只改变噪声幅度。这种方式既节省了信道生成的开销,又保证了不同SNR点之间比较的是同一个信道环境,减少实验方差。
写在最后的实际体会
整套仿真做下来,我对OFDM和OTFS的认知从“公式背出来了”变成了“问题出现时知道该往哪个方向想”。OFDM的优雅在于结构简单、复杂度低、与现有标准兼容性好,但它的性能天花板在时变信道下非常明显;OTFS用更高的收发复杂度换来了在多径时延和多普勒频移同时存在时的稳定性,这个交换在高速移动通信、低轨卫星通信这类场景中是划算的。
仿真中还有一个技术之外的感受值得分享:把两个方案放在同一套平台下公平对比,比单独实现其中一个更能看清技术本质。因为双方的帧结构、信道建模、导频设计、估计准则全部对齐之后,留下来的差异就是调制方案本身带来的差异。这套MATLAB平台后续还可以往几个方向扩展:加入MIMO维度做MIMO-OTFS性能验证、把感知功能融入OTFS帧做通信感知一体化仿真、或者针对低轨卫星场景修改信道模型。如果时间允许,我建议你在自己的框架里至少把MP检测器的迭代过程可视化出来,看着时延-多普勒域的干扰在几次迭代中被逐步消除,比看任何教材都能更快地理解OTFS接收机的精髓。
本文还有配套的精品资源,点击获取