LTE物理层仿真:SC-FDMA与OFDMA的Matlab链路实现与调试

发布时间:2026/9/8 0:37:49
LTE物理层仿真:SC-FDMA与OFDMA的Matlab链路实现与调试 干了这么多年物理层算法仿真我见过太多人拿到“LTE链路仿真”这个题目先把各模块的代码堆起来跑出几条BER曲线就算交差。可实际上如果你不理解LTE为什么上行用SC-FDMA、下行用OFDMA不理解那个“DFT扩频”插在IFFT之前到底解决了什么那仿出来的结果多半也是自欺欺人。前段时间帮一个师弟排查了一版上行链路仿真误码率卡在10的负一次方下不来最后发现他压根没做DFT预编码——拿OFDMA波形硬仿LTE上行。这种错误非常典型也说明很多人并没有把这两种波形的本质差异当回事。这篇文章我不打算讲那种“打开工具箱、拖模块”的demo式教程而是从物理层收发链路的角度把基于Matlab的LTE上下行仿真逐块拆开为什么选这两个波形、发射端接收端分别有哪些模块、信道模型和频偏怎么加、结果怎么评估。我会把代码骨架和调试经验一起放出来理工科背景、想动手搭物理层链路的读者应该都能从里面找到可以直接抄作业的部分。1. 上行SC-FDMA、下行OFDMALTE为什么上下行不肯用同一种波形很多人第一次接触LTE物理层都会有同一个疑问OFDMA这么好子载波正交、实现简单、还能支持MIMO和频选调度为什么上行非要换成SC-FDMA直接上下行都用OFDMA不是更省事吗这个问题背后其实是链路预算、功放效率和终端成本之间的博弈不是标准委员会拍脑袋决定的事。1.1 下行用OFDMA抗多径和调度的双重优势OFDMA的本质是把一个宽带信道划分成大量窄带子载波每个子载波带宽15kHz远小于信道的相干带宽。这样一来原本让人头疼的频率选择性衰落在单个子载波上看就近似平坦了。接收端把时域信号做FFT回频域后可以对每个子载波独立做信道估计和均衡这个性质让接收机结构大幅度简化也让MIMO检测变得相对直接。另一个关键好处是频率选择性调度。基站侧知道每个用户在哪些子载波上信道质量好就可以把资源块分配给信道条件最好的用户这是LTE系统吞吐量能打的主要原因之一。除此之外OFDMA的子载波正交性保证了小区内多用户干扰很小只要同步做好用户之间基本不互相踩踏。但OFDMA有一个绕不开的先天毛病高峰均功率比。多载波信号在时域上相当于大量独立子载波信号的叠加当各子载波瞬时相位对齐时时域包络会出现很高的峰值。这个峰值相对于平均功率的比例就是PAPR。PAPR高意味着发射机的功率放大器必须留出很大的功率回退来避免非线性失真否则频谱扩张和星座畸变会一起吃满指标。1.2 上行用SC-FDMA终端功放惹不起的PAPRPAPR这个问题在基站侧还可以忍毕竟基站有大功率功放、有散热条件、有稳定的供电可以牺牲一些效率换取线性度。但手机终端不行终端功放直接决定电池续航和小区覆盖半径。如果上行也搞OFDMA终端为了保持线性度不得不严重回退功率那么同样一块电池、同样一颗功放能打出去的有效功率就小很多小区边缘用户的上行链路预算就会崩掉。所以LTE上行选择了SC-FDMA这个名称容易让人误解它实际上就是在OFDMA发射链路里把一组本来是时域的QAM符号先做一次DFT变换转换到频域再按OFDMA的方式做子载波映射和IFFT。因为每个子载波上承载的不再是某一个独立的QAM符号而是所有数据符号的线性叠加所以时域信号的包络波动会被平均掉PAPR显著下降。接收端做逆操作FFT回频域、均衡、然后再做一次IDFT把符号恢复成时域QAM序列。你可以把OFDMA理解成每个数据符号都独占一个窄带子信道而SC-FDMA则是一个宽带单载波信号被“频域整型”之后塞进多个子载波里。SC-FDMA本质上是DFT扩频的OFDM业界习惯叫DFT-S-OFDM。它的PAPR比OFDMA低代价是失去了子载波级的独立频选调度能力不过LTE上行设计成集中式映射基站照样可以对不同的用户分配不同的资源块只是在一个资源块内部符号是“摊开”到所有子载波上的。1.3 两种波形在接收机链路上的差异直接对比两种链路的模块顺序就能看明白链路方向发射端关键模块接收端关键模块PAPR特性下行OFDMA编码调制 - 串并变换 - 子载波映射 - IFFT - 加CP去CP - FFT - 子载波解映射 - 信道均衡 - 解调解码高一般10-12dB随子载波数和调制阶数变化上行SC-FDMA编码调制 - M点DFT - 子载波映射 - IFFT - 加CP去CP - FFT - 子载波解映射 - 频域均衡 - M点IDFT - 解调解码比OFDMA低3-5dB左右从Matlab实现的角度看上行和下行发射端只差一个“在IFFT之前插入M点DFT”的模块接收端则差一个“在均衡之后、解调之前补一次M点IDFT”的模块。代码量上只是多几行但如果你把这两步漏掉整个上行的PAPR特性和频域表达就和真实LTE对不上号误码率性能也会和理论分析严重偏离。2. 先搭下行OFDMA链路从加扰到CP插入的Matlab分块实现我拿到这种仿真任务习惯先把下行链路老老实实搭一遍。原因很简单下行是OFDMA结构最典型而且LTE的很多信令和导频设计都是先围绕下行定义的。下行链路跑通了上行改造就是在此基础上做“减法加步骤”的事。2.1 仿真参数怎么定不要一上来就仿20MHz很多人一开口就说“我要做20MHz带宽的LTE仿真”然后4096点FFT一开跑一帧数据要等半天调试效率极低。仿真这东西参数规模不是越大越好关键是能反映系统行为。我常用的做法是仿5MHz带宽FFT大小512有效子载波300个对应25个物理资源块。这个规模刚好能把OFDMA的行为完整展现出来。如果嫌慢还可以再降到1.4MHz6个RB、128点FFT算法验证完全够用只是信道模型的抽头数量需要跟着匹配。子载波间隔15kHz这个量级不要随意动它是LTE波形的根本改了它就等于在仿别的系统了。我的一组常用参数如下参数取值系统带宽5MHz采样率7.68MHzFFT点数512有效子载波数30025RB × 12子载波间隔15kHz每时隙OFDM符号数7常规CP循环前缀长度36采样点简化处理这里要特别说明一个容易出错的点LTE标准里的循环前缀长度是用30.72MHz采样率定义的常规CP第一个符号是160个采样、其余符号是144个采样。在5MHz带宽下采样率变成7.68MHzCP长度要按比例换算成40和36。很多教程直接拿144用结果就是CP长度多了近4倍波形不对信道时延扩展的抗性也被错误地拉高。我在算法验证阶段为了省事会把所有符号的CP统一写成36但在对比标准协议时一定要清楚这个近似。2.2 OFDMA发射端从比特流到加CP的时域信号发射端的数据流程是随机比特 - 加扰 - 调制QPSK/16QAM/64QAM- 层映射单层时就是一组符号- 预编码单天线时可以跳过- 资源粒子映射 - IFFT - 加循环前缀 - 并串转换。加扰这一步看着不起眼实际作用很大。它用伪随机序列把比特随机化避免长串连续0或连续1导致调制信号出现过大峰值或直流偏置。Matlab里可以用自带的伪随机生成器搭一个简单的Gold序列也可以用lte工具箱的函数但我个人建议前期还是手写这样你能清楚看到每一级数据长什么样。调制和资源映射是相对直观的部分。调制就是把比特映射成复数符号QPSK、16QAM、64QAM分别对应2、4、6个比特。资源映射要注意的是有效子载波只有300个但IFFT点数是512剩下212个位置要补零。这些补零位置对应频带两端的保护子载波和中间的直流子载波不能随便映射。下面这个代码片段差不多就是OFDMA发射端的核心% 假设 txSym 是已经完成调制和层映射后的频域符号长度300 Nfft 512; nRB 25; nSC nRB * 12; % 300 个有效子载波 Ncp 36; % 简化CP % 资源映射频域符号放到中心位置两侧补零 freqGrid zeros(Nfft, 1); % 以直流为中心放置300个子载波直流位置不占用 leftSC 150; % 左侧有效子载波数直流空出 dcPos Nfft/2 1; freqGrid(dcPos-leftSC : dcPosleftSC-1) txSym; % IFFT 得到时域信号 txTime ifft(ifftshift(freqGrid)) * sqrt(Nfft); % 加循环前缀 cpPart txTime(end-Ncp1 : end); txSymbol [cpPart; txTime];ifftshift和sqrt(Nfft)这两个细节容易踩坑。ifftshift负责把频域排列变为Matlab的IFFT输入格式缩放因子则是为了保持功率归一。如果不做这一步星座图会歪而且每个子载波的实际幅度会和理论值对不上。2.3 接收端去CP、FFT、信道估计与MMSE均衡下行接收端就是发射端的逆过程但多了信道估计和均衡这两个关键模块。第一步是把CP丢掉然后把时域信号做FFT变回频域。这里有个判断如果你能保证收发两端频偏很小FFT的窗口起始位置直接取在CP结束后即可如果信道多径时延导致符号间干扰就需要做符号定时同步这个在基础仿真里可以先忽略。信道估计最简单的方式是LS估计即在已知导频位置处用接收到的导频值除以本地参考导频值得到导频处的信道频率响应。然后通过插值得到数据位置的信道响应。实际仿真中一个时隙内有分布在不同符号和子载波上的参考信号你可以为每个资源块取最近的导频做估计也可以用线性插值。均衡我用得最多的是MMSE均衡而不是更简单的ZF均衡。ZF在噪声放大方面太粗放尤其在高阶调制情况下星座边缘点的噪声会被明显放大。MMSE的公式长这样% H_est 为估计出的信道频响 noisy_power 为噪声方差 eqSym (conj(H_est) .* rxSym) ./ (abs(H_est).^2 noisy_power);注意那个noisy_power在高SNR下它的贡献可以忽略均衡退化为ZF在低SNR下它能有效抑制噪声放大MMSE均衡的增益主要就体现在这里。仿真时要记得把噪声方差按每个子载波上的功率来算不要拿整个带宽的总噪声功率凑数。2.4 第一版跑通后怎么确认链路是对的链路搭完不要急着加信道、加频偏、加各种“高级”功能。第一步先在AWGN信道只加高斯白噪声无多径、无频偏、理想信道估计下跑一个QPSK或16QAM的BER曲线和理论误码率曲线画在同一张图上。如果两者能基本贴合说明收发链路、调制映射、功率归一化都正确了如果差得多优先检查星座图是否有旋转、缩放或偏移。我见过很多人链路一通就开始跑64QAM结果星座图一团糟还不知道问题出在哪。正确做法是从最简单的调制阶数一步步往上加QPSK没问题再上16QAM再上64QAM。每一级确认无误再到后面加信道模型、加频偏逐层引入复杂度。这种分层验证的方法看起来慢实际定位问题的速度快好几倍。3. 上行SC-FDMA改造在IFFT之前加DFT、在均衡之后补IDFT下行跑通了上行的改造就清晰了。SC-FDMA和OFDMA在代码结构上的区别可以用一句话概括上行在IFFT之前多做了一次M点DFT在接收端均衡之后多做了一次M点IDFT。就这么简单但这一步的存在与否决定了整个波形的PAPR和误码性能。3.1 发射端多出来的那个M点DFT对于上行链路假设一个时隙内调制的QAM符号序列长度为MM必须等于分配给该用户的有效子载波数通常是物理资源块数的12倍。比如6个RB就是72个符号。这M个QAM符号本身是时域序列先做一次M点DFT得到长度为M的“频域序列”。然后把这些频域值映射到M个连续子载波上剩下的子载波补零再做N点IFFT。你仔细看这个流程QAM符号到达接收端经过均衡后还要做一次IDFT才能还原出原始QAM符号所以LTE上行的“数据符号”并不是直接在某个子载波上调制的这个认知非常重要。代码上其实只是多了一行% 假设 modSym 是调制后的 M 个QAM符号M nRB * 12 M nRB * 12; freqSym fft(modSym, M); % M点DFTDFT扩频 % 然后 freqSym 送入子载波映射再做 IFFT步骤同下行这里容易犯的一个错误是忘记对freqSym做归一化。DFT和IDFT不是严格归一化的线性变换Matlab的fft没有除根号系数。如果你在发射端做了fft接收端又做ifft连续两次变换会引入一个M倍的增益。早期我在这上面吃过亏星座图幅度怎么都不对最后把两端变换增益一除就正常了。3.2 接收端频域均衡之后才能做IDFTSC-FDMA接收端有个顺序问题非常关键必须先做频域均衡再做IDFT不能反过来。因为信道是作用在频域上的如果先把频域信号变回时域再做均衡就需要处理时域卷积均衡要么复杂度爆炸要么精度损失严重。正确流程是去CP - FFT - 子载波解映射 - 频域信道估计与均衡 - M点IDFT - 解调。这里的频域均衡和下行OFDMA接收端是完全一样的你可以复用下行那段MMSE均衡的代码。唯一不同在于均衡完成后下行直接解调而上行需要先做一次M点IDFT把符号“还原”成QAM序列再解调。eqFreq (conj(H_est) .* rxMappedFreq) ./ (abs(H_est).^2 noisy_power); eqTime ifft(eqFreq, M) * sqrt(M); % 补偿DFT/IDFT的归一化系数 demodSym qamdemod(eqTime, modOrder, UnitAveragePower, true);注意qamdemod里的UnitAveragePower参数。LTE上行QAM星座图的平均功率为1调制时信号要按单位平均功率生成解调时也要告诉解调器信号是单位功率的否则高阶QAM的判决边界会整体错位。3.3 用CCDF曲线量化SC-FDMA的PAPR优势理论上讲SC-FDMA的PAPR比OFDMA低但低多少需要实测才有说服力。PAPR的统计特性一般用互补累积分布函数曲线画横轴是PAPR门限值纵轴是信号包络超过该门限的概率。我做过一组对比同样的调制方式、同样的子载波数72个有效子载波、4倍过采样QPSK条件下OFDMA在0.01%概率处的PAPR大约在10.5到11dB而SC-FDMA大约在6.5到7dB差距相当可观。64QAM因为星座点本身幅度差异大两者的差距会缩小但SC-FDMA仍然有明显优势。CCDF曲线的Matlab代码可以这样写% 生成一组SC-FDMA和OFDMA时域信号存放在 txScfdma 和 txOfdma 中 % 计算每个符号的PAPR单位dB paprScfdma 10*log10(max(abs(txScfdma).^2) ./ mean(abs(txScfdma).^2)); paprOfdma 10*log10(max(abs(txOfdma).^2) ./ mean(abs(txOfdma).^2)); % 画CCDF ccdf(paprScfdma); hold on; ccdf(paprOfdma); legend(SC-FDMA,OFDMA);在仿真中验证PAPR建议用超过一万个符号做统计否则尾巴部分的数据波动很大。另外PAPR计算一定要做过采样之后再做直接拿IFFT输出点算PAPR会把峰值低估很多因为真实发射机在上变频前本来就会有成型滤波和插值时域连续包络的峰值往往藏在采样点之间。4. 信道模型与仿真参数EPA/EVA/ETU的选型和影响无信道仿真只是基本功真正贴近LTE实际环境的表现必须引入多径信道模型。LTE标准里常用的三个信道模型是EPA、EVA、ETU它们的区别主要体现在时延扩展和多普勒频移上。选哪个模型取决于你想仿真的场景。4.1 三种常用LTE信道模型的区别EPAExtended Pedestrian A对应低时延扩展的城区步行场景最大时延扩展只有410ns适合用来验证基础链路性能EVAExtended Vehicular A对应车载移动场景最大时延扩展2510ns多普勒频移按车速可设5Hz或70HzETUExtended Typical Urban对应典型城区环境最大时延扩展5000ns多普勒频移可以到300Hz是最严苛的信道模型。信道模型适用场景最大时延扩展典型多普勒抽头数EPA低时延扩展步行410ns5Hz7EVA车载移动2510ns5/15/70Hz9ETU城区强多径5000ns70/300Hz9从实现角度讲EPA只有7个抽头、时延扩展小即使用简单的一阶线性插值信道估计也能拿到不错的结果适合作为“第二个仿真场景”第一个是AWGN。EVA和ETU则需要更精细的信道估计和均衡策略。4.2 采样率、CP长度和最大时延扩展的联动关系CP的长度不是随便选的它的核心约束就是最大时延扩展。只要信道最大多径时延小于CP长度前一个符号的多径拖尾就不会干扰到后一个符号的FFT窗口系统可以做到无符号间干扰。以5MHz带宽为例CP长度36个采样点采样周期约130nsCP实际覆盖约4.69us。这个长度覆盖EPA和EVA绰绰有余但ETU的5us最大时延就逼近临界一旦多径延时的尾部落到CP之外子载波正交性会受到破坏某些子载波之间开始出现干扰这个时候你再怎么调均衡算法也很难完全消除。所以你会发现同样的仿真代码从EPA切到ETU误码率曲线会出现明显的性能台阶。这不是代码写错了而是信道的时延扩展已经逼近甚至超过了CP的保护能力。你在解释结果时一定要有这个意识。4.3 时变信道环境下均衡器什么时候该更新低速场景比如EPA 5Hz下一个时隙0.5ms内信道变化很慢用一个时隙内的导频做一次信道估计直接应用到整个时隙的数据符号误差可以忽略。但到了EVA 70Hz或ETU 300Hz信道在一个时隙内的变化已经不可忽视这时候每时隙估计一次信道就不够用了。我通常的做法是每符号或每两个符号更新一次信道估计用导频符号做插值。具体代码如下% 假设 rxGrid 为 12 x 14 的时隙资源网格12子载波14个符号 % 导频位于第1和第5个OFDM符号做线性插值估计其他符号 hEst1 lsEstimate(rxGrid(:,1), pilots1); hEst5 lsEstimate(rxGrid(:,5), pilots5); for symIdx 1:14 alpha (symIdx - 1) / 4; hEst(:, symIdx) hEst1 * (1-alpha) hEst5 * alpha; end这个只是示意实际LTE的导频位置分配还要考虑小区特定参考信号和天线端口的问题但思路是一致的用离散导频做二维插值估计出整个时频资源网格上的信道响应。多普勒越高插值间隔要越小否则信道估计误差本身就会成为误码的主要来源。5. 频偏估计仿真里最容易被跳过却最致命的一环很多刚做物理层仿真的人会觉得频偏是硬件工程师的事算法仿真里自己收发两端都用同一个时钟哪来的频偏这句话在理想AWGN仿真里成立但一旦你想验证一个稍微真实一点的接收机就必须正视频偏。LTE接收机面对的多普勒频移和晶振偏差处理不好会让OFDMA性能直接崩掉。5.1 频偏对OFDMA和DFT-S-OFDM的具体伤害载波频偏有两种作用一个是让整个频谱发生平移导致FFT输出发生子载波间泄漏破坏子载波正交性产生ICI另一个是让时域信号产生相位旋转星座点会沿着圆周旋转导致判决困难。OFDMA对频偏尤其敏感因为子载波之间的正交性就是靠精确的频域对齐维持的。如果频偏达到子载波间隔的几个百分点信噪比稍微高一点误码率就会出现地板效应怎么调其他参数都压不下去。对于SC-FDMA频偏的影响还要加一条因为接收端在频域均衡后要做IDFT频偏导致的相位旋转会在IDFT之后扩散到整个数据块上使损伤更“均匀”地分布在所有符号上。5.2 利用循环前缀做小数倍频偏估计常用的一种方法是用循环前缀和OFDM符号尾部的相关性来估计小数倍频偏。因为CP是符号尾部的复制接收端把CP部分和符号尾部对应位置做相关两者的相位差就包含了频偏信息。假设接收信号去CP前的完整符号长度为NNcp其中前面Ncp个采样是CP后面N个采样是有效数据。由于CP和符号尾部来自同一段信号在无噪声情况下满足theta angle(sum(rxSym(nCP1 : nCPN) .* conj(rxSym(1:N)))); cfo theta / (2 * pi * N / Nfft * Ts);这里theta就是CP与数据尾部之间的相位差它正比于频偏和OFDM符号有效时间的乘积。注意这个方法能估计的频偏范围是±0.5个子载波间隔超过这个范围的整数倍频偏要靠主同步信号或导频来做粗估计。在基础仿真中我们通常假设已经完成了时隙同步和整数倍频偏估计只处理剩余的小数倍频偏。5.3 纠正之后性能恢复到什么程度仿真中加频偏很简单在发射信号上乘一个线性相位即可n (0 : length(txSignal)-1).; txSignalFreqOff txSignal .* exp(1j*2*pi*deltaF/fs * n);其中deltaF就是人为注入的频偏fs是采样率。接收端估计出cfo后乘上共轭相位完成纠正rxCorrected rxSignal .* exp(-1j*2*pi*cfo/fs * n);我自己实测下来在5MHz带宽、300个有效子载波的仿真配置下当注入的频偏为500Hz约0.033个子载波间隔时如果不做纠偏64QAM的星座图会明显旋转BLER曲线出现约2到3dB的性能损失用CP相关做估计并纠正后性能基本能恢复到无频偏的90%以上。如果频偏达到1kHz以上不做估计的链路直接没法看。这里还要提醒一个细节CP相关估计在低SNR下的方差比较大所以实际接收机往往会多发几个符号做平均或者在时域先做前导相关粗同步。仿真里如果想追求稳健可以对多符号的估计结果做平滑滤波不要只拿一个符号的估计值去纠正。6. 结果分析与调参经验星座图、BLER曲线和那些坑链路调通、信道和频偏都加上之后剩下的工作就是怎么评估仿真结果、怎么快速定位问题。这块的经验可能比搭链路本身更值钱因为你在跑仿真的过程中大概率会遇到各种“看起来不对但不知道哪里不对”的情况。6.1 星座图是链路健康度的第一张体检报告我调试链路时第一件事永远是看星座图。它能非常直观地告诉你问题出在哪个方向星座点整体旋转说明有残余频偏星座点发散成同心圆说明功率归一化出了问题或者存在IQ不平衡星座点出现明显的偏置说明调制解调时引用了错误的直流分量星座点分布正常但解调误码率高那问题可能出在比特映射或解扰上。一个健康的高SNR星座图在16QAM下四个象限的簇团应该清晰可辨簇团中心位于标称星座点附近。如果簇团呈现环状扩散说明相位噪声或频偏残余是主要矛盾如果簇团呈高斯弥散状说明加性噪声主导。定性地判断这些特征能帮你省下大量瞎猜的时间。用EVM做量化评估也是一个很好的手段。EVM的定义是误差向量幅度与参考星座幅度的比值公式如下EVM sqrt(mean(abs(rxSym - idealSym).^2) / mean(abs(idealSym).^2)) * 100;在AWGN信道下EVM和SNR大致满足“EVM约等于1除以根号SNR后取百分比”的关系比如SNR20dB时EVM应该接近10%。如果你测出来的EVM明显偏离这个关系说明链路里有额外损伤源。6.2 BLER曲线怎么读仿真点数怎么设误码率曲线BER大家都熟悉但LTE系统里更常用的是误块率BLER。一个传输块包含若干比特只要其中有任一比特错误这个块就算错了。BLER和BER之间不是简单的线性关系高阶调制和长块长下BLER通常明显高于BER。仿真BLER时一个常见的错误是每个信噪比点只跑几百帧就下结论结果曲线抖得像心电图。我一般要求每个SNR点至少统计到100个错误块如果SNR较高很难出错就跑固定帧数比如5000到10000帧然后标出“该点未观测到错误”。这样的曲线虽然耗时但趋势可读性强。还要注意SNR的定义方式。在OFDM系统里SNR是指每个子载波上的符号信噪比不是整个带宽上的信噪比。仿真中加噪声时噪声功率要按“信号平均功率除以每个子载波的SNR”来算而不是拿总信号功率去除以总噪声功率。如果搞混了你的曲线会整体平移好几个dB而且不同带宽设置下的结果还互相矛盾。6.3 我自己踩过的一组典型“坑”最后列一串我做LTE链路仿真以来遇到过的经典问题每一个都是真实填坑经验缺失DFT扩频直接拿OFDMA仿上行。这个问题出现的频率之高超出想象。表象是上行BLER比下行差很多或者星座图总是带一种奇怪的“扩散感”。排查时先检查发射端是不是有fft(modSym, M)这一步接收端是不是有ifft(eqFreq, M)这一步缺一不可。频域符号放置位置错误。直流子载波在LTE里是不用的很多人在做资源映射时把第一个有效子载波直接放到了直流位置结果星座图没事但带外泄漏和误码率都异常。正确做法是把有效子载波均匀分到直流两侧。这个坑在IF倍频程上不明显一旦做低带宽如1.4MHz仿真就非常突出。功率归一化搞混。调制符号平均功率是1IFFT之后要乘sqrt(Nfft)还是Nfft很多人搞不清楚。其实只需要保证发射端的频域符号功率和时域符号功率相等即可。建议在链路的最前面先做一个noise-free闭环测试如果发射的星座点和接收的星座点完全重合说明归一化是对的。CP长度没有按带宽换算。前面说过5MHz带宽下CP不是144而是36。用错CP会表现为信道时延扩展容忍度虚高换到ETU信道时反而性能莫名下降。频偏估计只做小数倍不搞整数倍。如果你注入的频偏超过半个子载波间隔CP相关法估计出来的频偏方向可能是反的纠正后反而更差。工程上先做整数倍频偏估计再做小数倍仿真里也要至少意识到这个边界。均衡顺序错误。SC-FDMA必须先频域均衡再IDFTOFDMA则直接解调。这个顺序反了星座图会彻底散掉。每次遇到“上行的星座图比下行乱得多”的反馈我第一反应大概率是这一条。加了理想信道估计就以为万事大吉。很多仿真代码在信道估计这一步直接用真实信道响应不做估计误差建模。这样得到的性能是“信道已知”的上界看起来很好实际上和真实接收机的差距可能很大。至少要在仿真中对比一次“理想信道估计”和“LS估计线性插值”两条曲线这样才能对估计损耗有个直观认识。做物理层仿真我的经验是八个字自下而上逐级验证。先把AWGN下的调制解调链路做扎实再引入信道、同步、估计每一步都留好对照实验。这样即使最后结果不理想你也有足够的中间节点排查问题。仿真不是目的真正有价值的是在搭建过程中建立起对LTE波形各个设计决策的理解——为什么CP要这么长为什么上行要做DFT扩频为什么频偏会影响正交性。把这些想明白了你写出来的代码才不只是代码而是你对一套通信系统的理解。