尧图精选

从DFT视角理解OFDM:正交性、IFFT与子载波间隔的工程实践

🕒 发布时间:2026/10/1 18:04:43 📁 来源:尧图网络
说OFDM之前我想先分享一个观察市面上讲OFDM的资料十有八九一上来就甩框图IFFT、循环前缀、信道估计一股脑全倒给你看完记住了“OFDMIFFTCP”但真让你解释为什么发射端做一次IFFT就能把几十个子载波叠成一个波形发出去很多同学就卡壳了。我自己也碰过几次壁最后是从离散傅里叶变换DFT这条线重新捋了一遍才把OFDM的底摸透。所以这篇不是教科书式的原理复读而是我从DFT视角梳理出的、理解OFDM的最直接的一条路——先搞懂DFT和正交性再看OFDM发射机、接收机里每一块电路到底在算什么最后落到子载波间隔、FFT点数和实际系统参数上。这篇文章适合正在学移动通信的人、做无线通信链路仿真的人以及刚接手物理层开发但被OFDM概念绕晕的同行。这篇文章不会引用复杂的推导会尽量用工程视角把“为什么这么做”讲清楚读完你可以自己上手跑通一个最小OFDM链路再去看LTE或5G的物理层参数表会有种“原来如此”的感觉。1. 从DFT到OFDM一条最自然的认知路径1.1 先把OFDM的本质说清楚OFDM全称正交频分复用说穿了是一种多载波调制方案。核心思想就一句话把一个高速串行数据流拆分成N个并行的低速子流每个子流去调制一个彼此正交的子载波然后合成一个宽带信号发出去。为什么要费劲拆开因为无线信道是多径信道。发射信号经过建筑物、地面反射到达接收端时是多份不同时延、不同衰减的信号叠加。如果只有一个高速符号流符号周期很短多径时延相对符号时长就很大前一个符号的拖尾会砸进后一个符号形成严重的符号间干扰。把速率降下来、符号周期拉长N倍多径时延对单个符号的影响就相对变小了。OFDM对抗多径的底层逻辑就在这里。OFDM的第二个好处是每个子载波占的带宽很窄窄到信道在单个子载波上可以近似看成平坦衰落。接收端只需要在每一个子载波上做一个复除法就能把信道影响抵消掉不需要像单载波系统那样设计一个几百阶的时域均衡器。这就是OFDM能在LTE、5G、Wi-Fi这些系统里遍地开花的原因——它用“算法复杂度”换掉了“硬件复杂度”。1.2 一个“频分复用”的直觉误区我第一次学OFDM时有个误解以为OFDM就是把一段宽带频谱切成许多小频段每个子载波用各用各的频段互不重叠。那是传统频分复用FDM的思路频谱效率很低而且需要很大的保护间隔因为滤波器做不到理想矩形。OFDM不一样的地方在于它的子载波频谱是重叠的而且靠“正交性”来保证互不干扰。每个子载波的频谱形状是sinc函数主瓣旁边有一串衰减的旁瓣。如果子载波间隔刚好等于符号速率也就是每个子载波的频谱峰值点正好落在相邻子载波频谱的零点上。你在某个子载波的峰值点去采样看不到其他子载波的能量这就是正交。给一个直观的类比想象一个大房间里很多人同时说话如果每个人的声音频率不同而且大家说话的节拍完全同步你带着一副“只能听某个频率”的耳朵就能从嘈杂的背景里精准提取出那个人的声音其他人听起来像白噪声背景。OFDM的接收端对每个子载波做的就是这个“只盯一个频率”的匹配。正交的数学表达很简单。两个不同子载波频率 f₁ 和 f₂在一个符号周期 T 内满足∫ e^{j2πf₁t} · e^{-j2πf₂t} dt 0当 f₁ ≠ f₂只有频率差是 1/T 的整数倍时这个积分才是零。所以说“子载波间隔 1/T”不是拍脑袋定的它是正交性的必然要求也是整个OFDM系统里最核心的一个参数。1.3 DFT在这里扮演的真正角色DFT本身不是OFDM的目标但OFDM“碰巧”能用DFT极其优雅地实现。早期OFDM是用一组振荡器和滤波器组实现的几十个、几百个子载波就要几十套、几百套模拟器件硬件又贵又难调根本推不到商用。后来人们发现对一组频域符号做IDFT/DFT恰好就是多载波调制/解调的过程。从DFT的视角看OFDM系统变得非常简洁发射端一组QAM复符号 X[0]…X[N-1]做IDFT得到时域采样点 x[0]…x[N-1]经DAC变成模拟波形发送。接收端收到时域采样点后做DFT得到频域复符号 X̂[0]…X̂[N-1]再做解映射。也就是说OFDM的发射机本质上是一台“高性能IDFT运算器”接收机本质上是一台“高性能DFT运算器”。这是DFT和OFDM之间最深层的关系——OFDM把多载波调制这个复杂的模拟信号处理问题转化成了数字信号处理里的一个标准矩阵运算。后面两章会分别拆开发射端和接收端逐步展开这两句话。2. 发射端为什么调制信号就是一次IDFT运算2.1 子载波正交性的矩阵语言设一组频域符号 X[0], X[1], …, X[N-1]它们是QAM调制后的复数值。OFDM符号时域采样点 x[n] 由IDFT给出x[n] (1/N) Σ_{k0}^{N-1} X[k] · e^{j2πkn/N}n 0, 1, …, N-1式子里的 e^{j2πkn/N} 就是第k个子载波的离散复指数。如果换一种语言IDFT就是把X[k]这组数投影到N个正交基向量上然后叠加。这N个基向量彼此独立、正交所以可以互不干扰地在同一个时域序列里共存。正交性在离散域的具体表现是Σ_{n0}^{N-1} e^{j2π(k₁-k₂)n/N} 0当 k₁ ≠ k₂举个例子N4时第1个子载波的基向量取采样点后是 (1, j, -1, -j)第2个子载波是 (1, -1, 1, -1)两个序列对应位置相乘再求和结果是0。无论N取多大只要是不同的子载波内积都是0。这就是“正交”最实在的含义——线性代数里的正交向量这一条线串起了整个OFDM。2.2 从符号序列到实际波形生成工程上发射端不是直接用矩阵乘算IDFT而是用IFFT。FFT把复杂度从 O(N²) 降到 O(NlogN)2048点的系统里差距是几百倍没有FFT就没有现代OFDM系统。一个典型OFDM发射链路的流程是这样的比特流经过编码、交织再进行QAM映射得到N个复符号 X[k]。把X[k]映射到FFT对应的子载波位置边缘位置填零作为保护带。做N点IFFT得到N个时域采样点。在符号前面加循环前缀CP变成NNcp个采样点。经DAC、低通滤波、上变频到射频功放后发送。第二步里的“填零”容易被忽略。真实的OFDM系统并不会让所有子载波都发数据。最边缘的子载波要做保护带抑制频谱泄漏到相邻信道正中间通常留一个DC子载波不发送数据因为接收端本振泄漏和直流偏置都落在零频附近会严重污染这个位置。比如LTE 20MHz带宽FFT是2048点真正可用的子载波只有1200个其余848个都空闲。这里有一个细节想提醒一下IFFT和IDFT在归一化上并不完全一样。MATLAB的ifft默认带1/NPython的numpy.fft.ifft也带1/N但很多硬件IP核的IFFT不做归一化把结果直接输出。如果你在浮点仿真里把归一化丢了发射功率会偏大N倍后面解调、EVM测量全乱。我自己就出过这个岔子。好习惯是在链路首尾明确标出归一化因子仿真和硬件对接前先算一遍功率增益。2.3 关键参数子载波间隔、采样率与FFT点数的关系这一节是很多同学最头疼的部分其实就三个公式串起来。设子载波间隔为 ΔfOFDM符号持续时间为 T则 T 1/Δf。若FFT点数为N系统采样率为 fs则有 fs N × Δf。实际发送的符号还要加上循环前缀总时长变成 T_total T T_cp。举一个LTE的具体数字。LTE常规子载波间隔是15kHz那么一个OFDM符号的有效时长就是 T 1/15kHz ≈ 66.67μs。当系统带宽是20MHz时采样率 fs 30.72MHz这时 FFT点数 N fs/Δf 2048。加上循环前缀后一个常规CP符号包含2192个采样点2048144时长约71.35μs。这些数字你能自己推出来之后再看协议参数表就不再是背数字了而是知道它是怎么算出来的。子载波间隔 Δf 的选择是一场权衡Δf越大OFDM符号越短对频率偏移和多普勒更不敏感适合高频段高速移动场景。Δf越大CP时长等比例缩短CP开销占比增大频谱效率下降。Δf越小频谱效率高、CP开销小但符号变长对相位噪声和多普勒很敏感。5G NR用参数集 μ 来缩放子载波间隔Δf 15×2^μ kHz。μ0是15kHzμ1是30kHzμ2是60kHzμ3是120kHzμ4是240kHz。为什么高频需要更大的间隔因为高频段相位噪声更严重而且移动带来的多普勒频移按载频比例放大子载波间隔太小子载波间干扰就会压不住。3. 接收端用DFT把混叠在一起的子载波“拆开”3.1 从时域采样点还原频域符号接收端的核心问题是你收到的时域信号是N个子载波叠加后的混合体。怎么把每个子载波上的符号干净地摘出来答案是DFT。忽略信道和噪声、假设收发完全同步的情况下接收端的采样点就是发射端x[n]。对x[n]做DFTY[m] Σ_{n0}^{N-1} x[n] · e^{-j2πmn/N}代入发射IDFT的表达式利用子载波正交性会得到一个非常干净的结果Y[m] N·X[m]归一化后就是 Y[m] X[m]。也就是说DFT相当于在每一个子载波频点上做了一次匹配滤波。它把接收信号在这个频点的投影算出来其他子载波泄漏过来的分量正好在投影积分为零。这也就是为什么OFDM接收机不需要一组带通滤波器一个FFT就全部搞定。你可以从“投影”的角度理解DFT的物理含义它是在问“我的接收信号里有多少成分长得像第k个子载波”而这个答案就是X[k]。完整的接收链路就是发射的逆过程去CP → 串并转换 → N点FFT → 信道估计与均衡 → QAM解映射 → 解码。其中信道估计就是利用已知的导频子载波算出每个子载波上的信道复数增益 H[k]然后X̂[k] Y[k] / H[k]H[k]噪声项。因为每个子载波带宽窄信道是平坦的一个复数除法就是全部均衡这是OFDM接收机能在低复杂度下工作的关键。3.2 同步误差下的DFT泄漏现象下面说一个实际系统里躲不开的问题频偏。发射端和接收端的本振频率不可能完全一致多普勒效应也会带来频率偏移。设归一化频偏为 Δε以子载波间隔为单位接收信号相当于在频域被整体搬移了Δε个bin。问题在于DFT的分辨率是1/N当Δε不是整数时子载波能量会泄漏到所有相邻频点这就是频谱泄漏。每个子载波之间互相污染产生子载波间干扰星座点会旋转并打散。一个直观结论归一化频偏为0.5时信号能量会分散到很多相邻子载波上EVM急剧恶化。这就是为什么接收机要先做频偏估计和补偿。典型的做法分两步粗频偏估计利用循环前缀的重复特性或前导序列估计出整数倍子载波间隔的频偏在频域搬移回来。细频偏估计利用导频符号估计残余频偏在时域乘一个旋转因子 e^{-j2πΔεn/N} 来纠正时域相位。时域乘旋转因子这个操作本质上是连续调整每个采样点的相位。频偏在小数倍子载波间隔时星座点整体的旋转角随采样点线性累积一个OFDM符号下来星座图就已经转了很多度。所以细频偏补偿必须在FFT之前做否则旋转已经发生了FFT之后再做相位校正就只能补偿平均相位残留的相位噪声仍然会摊平星座。3.3 循环前缀DFT循环卷积的工程钥匙OFDM接收端做的是FFT而FFT隐含了一个周期性假设它把输入序列看成是无限循环延拓的。这带来一个矛盾真实信道是线性卷积不是循环卷积多径会把前一个符号的尾巴叠到当前符号上。循环前缀CP就是解决这个矛盾的手段。具体做法是把OFDM符号末尾的一段采样点复制到符号前面。只要CP长度大于信道最大时延扩展多径造成的前一个符号干扰就全部落在CP区间内。接收端丢弃CP后当前符号窗口内的信号在数学上等价于发射序列与信道的循环卷积。再加上DFT的循环卷积定理时域循环卷积对应频域乘积。所以接收端FFT之后每个子载波上看到的信号就是Y[k] H[k]·X[k] W[k]这里H[k]是信道頻率响应W[k]是噪声。这个式子干净得让人惊讶。没有CP时这个等式不成立那个“每个子载波一个复数除法均衡”的梦想就碎了有了CP多径信道对OFDM的影响就从“复杂时域均衡”简化为“每个频点一个复数乘法”。CP不是没有代价的。它占用时间资源却完全不携带新信息。CP占比越高有效吞吐越低。所以实际系统里CP长度是个精细的设计太长浪费频谱效率太短扛不住多径时延。5G NR在60kHz子载波间隔下额外支持扩展CP就是给大时延扩展场景准备的另一个选项。4. 实操中的FFT/IFFT细节与参数设计4.1 FFT点数、系统带宽与保护子载波我们把数字再具体化一点。以LTE 20MHz带宽为例采样率30.72MHzFFT点数2048子载波间隔15kHz可用子载波1200个从-600到-1和1到600DC子载波1个不发送数据保护子载波847个很多人不理解为什么20MHz带宽用30.72MHz采样率还只用了1200个子载波。因为20MHz的带宽是信道带宽而OFDM信号的实际占用带宽只有 1200×15kHz18MHz两侧留出约2MHz作为保护带。这些保护带让OFDM信号的带外泄漏不至于干扰邻道也给发射机的频谱成型滤波器留出过渡带的余量。在5G NR里同样的思路只是参数集可缩放。100MHz带宽、μ130kHz间隔时FFT点数3264可用子载波2730个左右保护带比例随带宽和μ不同变化。设计系统时不是先定FFT点数而是先根据业务需求定带宽再根据场景定子载波间隔然后反推FFT点数和采样率。顺序反过来就容易被一堆牵制关系绕进去。4.2 频谱分析与仿真验证用FFT看OFDM下面给一个最小可行的链路仿真流程。目标不是完整协议仿真而是验证你理解的核心链路QAM映射 → IFFT → 加CP → FFT → 解映射。import numpy as np N 64 # FFT点数 cp_len 16 # 循环前缀长度 M 16 # 16QAM # 1. 生成随机QAM符号 bits np.random.randint(0, 2, (N - 2, 4)) # 留两个保护子载波 qam_map np.array([-3-3j, -3-1j, -33j, -31j, -1-3j, -1-1j, -13j, -11j, 3-3j, 3-1j, 33j, 31j, 1-3j, 1-1j, 13j, 11j]) / np.sqrt(10) symbols np.zeros(N, dtypecomplex) symbols[1:N//2] qam_map[bits[:N//2-1].dot([8,4,2,1])] symbols[N//21:] qam_map[bits[N//2-1:].dot([8,4,2,1])] # 2. IFFT得到时域信号 tx np.fft.ifft(symbols, N) # 3. 加循环前缀 tx_cp np.concatenate([tx[-cp_len:], tx]) # 4. 无信道无噪声情况下接收端去CP、FFT rx_cp tx_cp rx rx_cp[cp_len:cp_lenN] rx_symbols np.fft.fft(rx, N) # 5. 观察恢复的星座 print(np.max(np.abs(rx_symbols - symbols * N))) # 应接近0跑完这段代码你会看到FFT恢复的符号和原始符号之间误差在数值精度范围内。这个最小链路是理解OFDM的“hello world”建议动手跑一遍比看十篇原理文章都管用。真实系统里还要处理信道流程变成接收时域信号 → 去CP → FFT → 用导频估计信道 → 均衡 → 解映射。用LS估计可以很简单地做导频信道估计H_est rx_pilot / tx_pilot这里的除法是逐元素除法对应每个子载波单独均衡。你能直观感受到“OFDM把复杂信道变成每个频点一个复系数”这句话的分量。4.3 浮点与定点实现的几个坑仿真里用浮点很爽但要把OFDM搬进FPGA或ASIC定点实现才是常态。这里有几个常见的坑第一个是IFFT的位宽增长。IFFT每做一级蝶形运算数据位宽会增加。如果不做内部缩放最终位宽远超输入。硬件IP一般提供两种缩放置策略每级除以2或者最后一次除以N。每种策略的信噪比性能不一样测试时需要验证极端信号下的溢出行为。第二个是IFFT和FFT的归一化分工。工程里常见做法是发射端IFFT不做归一化接收端FFT做完整归一化也有两端各做1/√N的。定点实现里除以N的操作如果放在最后动态范围就大容易溢出如果每级除2量化噪声又会累积。没有标准答案需要用目标EVM来定。第三个是饱和与截断。定点实现的乘法器输出需要截断直接截断会引入偏置和噪声。实际工程中会加一点微小的抖动信号来消除截断误差的相关性这能让带内噪声更平坦星座点更干净。看起来是“玄学”其实是量化噪声整形的基础操作。还有一个所有OFDM系统都绕不开的工程问题峰均比PAPR。多个子载波同相位叠加时时域峰值会很高功放要留很大的回退否则信号会被削平带外辐射超标。单载波频分多址DFT-s-OFDM就是在OFDM前加一个DFT来降低PAPR的方案。这也是为什么LTE上行采用DFT-s-OFDM而不是纯OFDM的工程理由——终端功放比基站更吃回退成本。5. 常见问题与排查技巧实录5.1 子载波间隔到底怎么选多普勒与相位噪声的博弈平时被问得最多的就是“这个系统为什么用15kHz或30kHz子载波间隔”。前面说了公式这里补全工程经验。移动带来的最大多普勒频移 f_d v·f_c/c。假设载频3.5GHz、移动速度120km/h多普勒约390Hz。如果子载波间隔15kHz多普勒约占总间隔的2.6%如果速度500km/h多普勒约1620Hz占比10.8%这时候ICI已经明显影响性能了需要30kHz甚至60kHz的子载波间隔。相位噪声是另一个限制因素。振荡器的相位噪声在频谱上表现为近端的“洛伦兹型”尾巴它会让子载波频谱被展宽引入ICI。子载波间隔越小相位噪声的相对影响越大。高频段振荡器相位噪声本来就差所以5G NR在毫米波频段用120kHz、240kHz间隔不是随便定的是综合相位噪声、多普勒、CP开销三者优化的结果。一个粗略的经验准则是多普勒频移控制在子载波间隔的5%以内相位噪声拐角频率低于子载波间隔的若干分之一系统性能才比较安全。你去翻任何一套OFDM系统的选参文档都能看到这个博弈的影子。5.2 频谱泄漏与窗函数为什么FFT看OFDM总有“拖尾”在频谱仪上测OFDM信号你会看到带外有旁瓣衰减只有13dB左右。这是矩形窗的sinc频谱决定的。一个OFDM符号天然就是矩形加窗的矩形窗的傅里叶变换是sinc第一旁瓣只比主瓣低13.5dB这个辐射水平对邻道很不友好。实际系统会做符号级加窗把每个符号的头尾少量采样点做升余弦滚降让符号切换时波形平滑过渡旁瓣就压下去了。代价是需要额外的滚降时间通常只有CP长度里割让很少的一部分对吞吐影响很小。如果你自己仿真OFDM频谱用N点FFT直接看时域信号会看到频谱不是理想的矩形块而是一堆sinc叠出来的包络两侧有拖尾。这不是bug是数学本质。想看得更接近“理想OFDM频谱”应该用更长的FFT比如8倍过采样并加汉宁窗压低旁瓣再观察包络形状。做频谱模板测试时这套方法就是基本功。5.3 同步、泄漏和EVM的现场调试手段用空载波测噪声底系统里总有没被激活的子载波在这些位置上FFT的输出应该只有噪声。如果空载波上出现了明显的能量说明存在ICI或频谱泄漏频偏没有补偿干净。单子载波测试只激活一个子载波看其他子载波上的能量。这个“泄漏量”就是当前接收机实际的ICI水平也是衡量同步精度的最直接指标。我做接收机联调时第一步永远是这个测试。星座图分方向看异常星座点整体旋转是残余频偏星座点呈椭圆旋转是IQ不平衡或采样时钟偏移星座点外圈散得比内圈大是功放非线性或相位噪声。这些特征在调试现场比任何指标都好用。EVM不是只有一个数字看EVM时建议拆成幅度误差和相位误差两部分很多问题只体现在其中一个维度上。相位误差大往往是同步和相位噪声的问题幅度误差大往往是均衡和增益控制的问题。写到这里我几乎把这几年理解OFDM的路径完整复述了一遍。我自己也是从“接收端FFT为什么能拆开信号”这个点顿悟的——当你意识到DFT本质上是在计算接收信号在每个子载波基向量上的投影OFDM的整座大厦就通了。给后面学的人一句实在话别急着啃协议栈里的参数表先在仿真里把一个最小OFDM链路跑起来再去看LTE或NR的物理层细节你会觉得所有数字都长得非常合理。最后再分享一个小技巧如果你卡在某个OFDM问题上动不了把它翻译回DFT的语言重新问一遍——“我的输入序列在某个基向量上的投影怎么了”大部分答案自己就浮现出来了。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →