FBMC基本调制实现:从原型滤波器到FDS/PPN完整指南

发布时间:2026/10/10 19:47:18
FBMC基本调制实现:从原型滤波器到FDS/PPN完整指南
这几年通信圈聊波形绕不开的三个字母就是FBMC。Filter Bank Multi-Carrier滤波器组多载波从5G候选那会儿就被拿出来跟OFDM反复对比讨论到6G依然是高频词。FBMC基本调制实现这个题目我在不同阶段至少动手写过三遍第一遍照着论文框图瞎试第二遍用频域扩展法跑通第三遍才把多相网络结构吃透。这篇文章就是把这几轮积累的完整过程整理出来——原型滤波器怎么选、OQAM为什么非要错开半个符号、频域扩展FDS和时域多相网络PPN两条实现路线各自的细节与坑以及调试时怎么定位问题。适合正在做波形方向毕设、刚接手基带实现或者想把论文那页“发射机框图”变成能跑代码的读者老手可以直接跳到第3节的代码部分对照检查。1. 为什么OFDM不够了FBMC要解决什么问题1.1 OFDM的三座大山CP开销、频谱泄漏、同步敏感所有FBMC的资料开篇都会先批判OFDM这不是为了凑字数而是因为FBMC的每一项设计几乎都精准打在OFDM的短板上。第一座大山是循环前缀CP开销。OFDM为了对抗多径信道每个符号前面都要复制一段尾巴当保护间隔LTE常规CP下符号时长约66.7微秒CP只有约4.7微秒开销在7%左右换成扩展CP直接飙到25%。这些开销纯粹是“保命”用的不传任何有效信息。5G NR虽然有灵活的子载波间隔但CP机制没变开销依然存在。第二座大山是频谱泄漏。OFDM每个子载波用矩形窗成形频域是sinc函数第一旁瓣只比主瓣低约13dB衰减又慢导致带外辐射很难压下去。做蜂窝网还好可以用大块连续频谱加保护带硬扛一旦面对碎片化频谱、认知无线电或者非授权频段共享这种“泼出去收不回来”的旁瓣就成了致命伤。第三座大山是同步敏感。OFDM的正交性建立在严格的时频对齐上频率偏移、符号定时偏差都会直接破坏子载波间正交性产生子载波间干扰ICI。多用户异步接入时代价尤其大。Wi-Fi、LTE都是靠集中式的同步机制把终端“管教”得服服帖帖但如果场景换成海量机器通信、工业无线这种天然松散的接入方式这就不太现实了。1.2 FBMC的思路不给符号“戴帽子”给频谱“做手术”FBMC反着来既然矩形窗不行那就换一个精心设计的原型滤波器让每个子载波在频域都拥有非常干净的“盒状”频谱。代价是滤波器在时域上被拉长跨过多个符号周期相邻符号在时域上必须重叠所以就不引入CP完全靠滤波器自身把符号约束在时频网格里。听起来简单但这一步直接改变了很多底层假设。OFDM里符号之间“井水不犯河水”靠的是保护间隔和复数域的正交性FBMC里符号之间是刻意重叠的靠的是滤波器在时域和频域同时限带以及后来的OQAM技巧。这意味着接收端不能像OFDM那样直接做单抽头均衡同步策略也要改。所以FBMC是“用算法复杂度换频谱效率”的典型代表——没有免费的午餐但这个交换在很多场景下是划算的。我自己的体会是如果把OFDM比作一栋每间房都装了独立隔音墙的公寓那FBMC就是一间开放工位大家说话都低声细语滤波器限带靠声学设计而不是物理隔断来保证互不干扰。理解了这个比喻后面所有实现细节都有了落脚点。2. FBMC调制原理拆解三个关键设计2.1 原型滤波器FBMC的灵魂原型滤波器是整个FBMC系统里最核心的模块没有之一。它的时域长度决定重叠因子K频域响应决定带外泄漏和相邻子载波干扰正交性条件又对它的幅度相位提出了严格约束。工程实现里基本默认用PHYDYAS滤波器——它是欧盟PHYDYAS项目组提出的一套频率采样设计参数固定、性能均衡论文里出现频率极高做基准测试几乎绕不开它。PHYDYAS滤波器用重叠因子K来描述滚降缓急K越大过渡带越窄、旁瓣越低但滤波器越长、延迟越大、复杂度越高。常用取值是K3或K4K4是研究中最常见的配置。它的定义方式很特别直接给频域采样值然后通过IDFT反变换得到时域冲激响应。频域采样系数如下重叠因子KP0P1P2P3K210.70710678√2/2——K310.911437830.41143783—K410.971959830.70710678√2/20.23514695这里的P_l可以理解为滤波器频域响应在0、Δf/K、2Δf/K、3Δf/K这些采样点上的幅度值。给定这些系数时域冲激响应就是p[n] 1 2∑_{l1}^{K-1} P_l·cos(2π·l·n/(KM))n 0, 1, ..., KM-1注意不同论文里可能有(-1)^l的符号差异本质是频点对齐方式不同不影响整体性能但实现时要用同一套约定从头到尾。滤波器总长度为K×M个采样点对应时域长度为K个OFDM符号周期T。比如M1024、K4时原型滤波器长度是4096个点这比OFDM单符号的1024点长得多后续所有重叠、延迟、复杂度分析都源于这个事实。2.2 OQAM实符号也能实现复数域正交这里有个绕不开的理论限制既要滤波器在时域限长、又要频域高滚降还要满足复数域完全正交这在数学上是不成立的Balian-Low定理就是干这个的。也就是说不存在一个现实滤波器能同时做到时域紧支撑、频域紧支撑、又是复数域正交基。OFDM用矩形窗牺牲了频域FBMC如果想要好的频域特性就必须在正交条件上让步。OQAMOffset QAM偏移正交幅度调制就是那个让步方案放弃复数域正交退而求其次只要求实数域正交。具体做法是把每个复数QAM符号拆成实部和虚部实部在第2p个半符号时刻发送虚部被延迟半个符号周期放到第2p1个半符号时刻发送。再配合一个二维相位旋转因子θ_{m,n}j^{mn}让相邻时频格点之间的干扰全部落在“纯虚数”轴上。接收端做匹配滤波之后目标符号是实数而来自周围格点的固有干扰intrinsic interference合在一起恰好是纯虚数。这时只要取实部干扰就被“过滤”掉了。这在工程上是一个极其优雅的处理不消除干扰本身而是把干扰赶到正交方向上让判决时它自然消隐。代价是每个子载波实际只传输实符号想要达到和OFDM相同的复数传输速率就必须两倍速工作——所以OQAM符号间隔是T/2而不是T。2.3 发射端整体框图的参数约定把上面两块拼起来FBMC-OQAM发射端的基本流程可以这样描述输入比特流经过信道编码、调制得到复QAM符号每个复符号被拆成实部、虚部两个实符号按OQAM规则放到相邻半符号时刻每个实符号乘以相位因子θ_{m,n}j^{mn}送入合成滤波器组每个子载波乘上原型滤波器的频域响应并叠加或者等价地在时域做多相滤波输出信号按T/2间隔重叠相加串行送出。这里建议一开始就把参数约定固定子载波数M子载波间隔Δf1/T采样率FsM·ΔfOQAM符号周期T/2对应M/2个采样点原型滤波器长度K·M个采样点。这套约定在我后面给的代码里全程一致你拿论文公式对照时先核对采样率定义否则系数对不上很容易把自己绕晕。3. 基本调制实现从数学到代码3.1 频域扩展FDS实现法频域扩展法是我最推荐先跑通的一条路线因为它直观、不容易出错而且完全贴合滤波器组的原始定义。思路是把一根原型滤波器的频域响应“切成”每根子载波各占一份每份有2K-1个有效采样点然后把每个OQAM符号展开到这2K-1个频点上再一次性做IFFT。具体来说K4时原型滤波器频域采样相对中心点偏移r-(K-1)...(K-1)的取值为G [0.23514695, 0.70710678, 0.97195983, 1, 0.97195983, 0.70710678, 0.23514695]长度为2K-17。每个子载波m占据IFFT输入的第mK个点附近的位置相邻子载波之间会重叠部分频点而且重叠区恰好就是相邻子载波滤波器响应的“尾巴”交汇处。这正是滤波器组形成连续频谱的机理。下面是一个可以直接跑的MATLAB风格教学实现% FBMC-OQAM 频域扩展(FDS)发射机教学简化版 clear; clc; M 64; % 子载波数 K 4; % 重叠因子 N K * M; % IFFT 点数 numSym 32; % OQAM 符号个数注意间隔是 T/2 % PHYDYAS 滤波器频率采样相对中心偏移 r -(K-1)..(K-1) G [0.23514695, 0.70710678, 0.97195983, 1, ... 0.97195983, 0.70710678, 0.23514695]; % 随机 OQAM 实符号先用 BPSK 简化验证链路 a sign(randn(M, numSym)); % 发射缓冲每个 OQAM 符号占 M/2 点末尾留出滤波器余量 txBuf zeros(1, numSym * (M/2) N); for n 1:numSym X zeros(N, 1); for m 0:M-1 % OQAM 相位旋转j^(mn)用 4 值循环表示 theta 1j^(mod(m n - 1, 4)); b a(m1, n) * theta; % 频域扩展把符号 b 乘上滤波器频域采样叠放到 m*K 附近 center m * K 1; % 1-based 中心频点 for r -(K-1):(K-1) idx mod(center r - 1, N) 1; % 循环索引处理边缘 X(idx) X(idx) b * G(r K); end end % KM 点 IFFT得到时域块 block ifft(X) * sqrt(N); % 重叠相加偏移为 M/2 个采样点 startIdx (n-1) * (M/2) 1; txBuf(startIdx : startIdx N - 1) ... txBuf(startIdx : startIdx N - 1) block.; end % 查看时域波形与功率谱 figure; subplot(211); plot(real(txBuf)); title(FBMC 时域波形实部); subplot(212); pwelch(txBuf, 512, 256, 1024, M); title(FBMC 功率谱);这段代码有几个关键点要说明。第一IFFT点数从OFDM的M变成了KM也就是4096点M1024时这是因为频域网格细化了K倍。这里的每一个IFFT输出块长KM个采样点时域持续K个符号周期T。而OQAM符号间隔是T/2对应M/2个采样点所以重叠相加时每次只向前挪M/2点。一个KM长的数据块里会叠了2K个OQAM符号的贡献这正是滤波器组“重叠”的本质。第二循环索引mod(N)处理了边缘子载波的折叠问题。第0号子载波的负偏移频点会折到频谱末端形成保护频带。如果M比较小比如64边缘子载波会略微受到镜像折叠影响实际系统中通常会把边缘几个子载波空出来做保护。第三相位旋转我直接用1j^(mod(mn-1,4))实现四值循环{1, j, -1, -j}。有的论文把θ定义为j^(mn)有的定义为j^(mn)还有的提前把相位吸收到符号映射里。不同约定不影响频谱形状但接收端匹配滤波时的共轭相位必须与发射端严格对应。建议固定一种约定并写清楚头注释不然隔两天回来看代码就是一场灾难。第四IFFT归一化。MATLAB的ifft默认带1/N因子乘sqrt(N)只是为了让每个子载波的平均功率更容易对上理论值。最稳的做法是把txBuf算完之后用mean(abs(txBuf).^2)实测平均功率再统一缩放到目标功率或者0dBFS。不要凭空猜缩放因子直接测量是最靠谱的。3.2 多相网络PPN实现法频域扩展法结构清晰、适合推导验证但考硬件实现就会发现成本太高FM点IFFT变成KM点IFFTM1024、K4时就是4096点FFT乘法器资源直接翻几倍。工程上更常用的是多相网络PPN实现——这也是“FBMC基本调制实现”里真正要背下来的核心。PPN的思路是既然KM点IFFT的本质是“细化频域滤波”那能不能把滤波器搬到IFFT外面用M点IFFT配合一个多相分解的原型滤波器来等效答案是能。原型滤波器有KM个抽头可以按M个相位拆成M条支路每条支路恰好K个系数。IFFT输出的每一拍送给对应相位的支路做累加再用滑动组合得到最终输出。这样FFT规模回到M点滤波器的KM次乘法摊到每个输出采样上从“一次IFFT算4096点”变成“10次IFFT算1024点”的规模资源消耗完全不同。PPN有三个公认容易出错的地方多相支路的排列顺序、延迟线更新的节奏、以及和OQAM奇偶符号的相位配合。多相分解的顺序错了输出波形直接变成噪声延迟线更新节奏错了符号会被整体搬移半个周期相位配合错了实虚部对调误码率曲线直接躺平。我的建议是不要一上来就死磕PPN的数学推导先用FDS实现作为“黄金参考”再对照着调试PPN。两者在相同参数下输出应该只在浮点误差级别上有差异如果对不上优先检查支路顺序和延迟线。PPN的C语言风格的思路可以这样概括先做M点IFFT得到频域符号的时域表示U[i]然后对每个输出采样时刻t把当前时刻所在的支路相位pt mod M从K条延迟线里取出对应系数与之前K拍IFFT输出的分量做乘加结果累加到输出缓冲的对应位置上。这个“取系数、乘加、累加”的组合本质就是在做原型滤波器的卷积只不过利用了多相分解把每步运算量压到最低。实际代码里PPN的循环通常是双重循环外层遍历每个输出采样内层遍历K个滤波器抽头。M通常都是2的幂所以t mod M可以用位与代替取模移位代替乘除这些都是定点化时的常规优化。硬件上M点FFT和M条并联的K抽头FIR结构非常规整FPGA里可以直接用IP核拼出来。3.3 两种实现方式的复杂度对比很多文章把FBMC吹得天花乱坠但对实现的复杂度避而不谈。我直接给一组可对照的数量级数据M1024、K4实现方案IFFT规模每符号周期T的FFT运算量滤波/扩展额外开销综合复杂度适用场景OFDM1024点约10K次复数乘法量级极小基准常规蜂窝FBMC-PPN1024点约20K次复数乘法量级约8K次乘加约为OFDM的2~3倍硬件实现、FPGAFBMC-FDS4096点约100K次复数乘法量级约4.5K次乘加约为OFDM的10倍算法验证、教学原型这里的“每符号周期T”是因为OQAM半符号就要做一次IFFT所以FFT次数翻倍。FDS的复杂度主要来自4096点IFFT4096点FFT需要约4096×log2(4096)/2≈2.5万次蝶形运算而1024点只有5120次蝶形差距很大。所以两个方案的本质区别不是“正确性”而是“成本分配”FDS把成本花在更大的FFT上逻辑简单PPN把成本花在多相滤波上FFT保持原样但控制逻辑和延迟线管理变复杂。如果你做的是Matlab/Python仿真随便选FDS舒服直观如果你要做定点仿真、FPGA原型或者实时基带老老实实上PPN。这是我带过几个项目之后最想说的一句话不要因为FDS代码短就把它当最终方案复杂度评估要从“核心运算规模×符号速率”两个维度一起看。4. 常见问题与排查技巧实录4.1 滤波器系数不是“随便填”的我见过最多的翻车现场是把PHYDYAS频域采样系数当成了时域冲激响应直接拿来卷积或者把K4的4个系数[1, 0.9719, 0.7071, 0.2351]直接当成4抽头滤波器。这两种做法都完蛋因为4个系数是频域的采样值必须通过IDFT或者解析公式展开成KM4096点的时域原型才能用于PPN而FDS里使用这套系数时也必须是2K-17个对称点而不是K4个点。排查方法也简单对原型滤波器做一次freqz看幅频响应是不是“中心为1、两侧平滑滚降、远处接近0”。如果画出来是一个窄脉冲或者高频成分乱跳八成就是系数没配对或者是补零方式不对。另外PHYDYAS滤波器要求频域采样的镜像对称构造时千万别漏了P_{K-1}...P_1与P_1...P_{K-1}的对称部分。4.2 OQAM相位序列与共轭错位OQAM的相位序列是二维周期图案正确实现后接收端在无噪声情况下取实部应该能完美恢复原符号。如果相位序列错了最典型的症状是接收端的匹配滤波输出星座整体旋转45度、出现无法消除的实虚部互扰、误码率平白无故卡在0.5附近。排查建议按以下顺序来先关闭所有信道发射端直接接接收端用BPSK实符号测试逐个子载波打印匹配滤波后的实部和虚部能量。正常时目标子载波处实部能量远大于虚部能量固有干扰合成为纯虚部如果实虚能量接近就要检查θ_{m,n}的生成逻辑特别要注意MATLAB索引从1开始导致n的奇偶判断偏移。另一个常见错误是接收端的共轭相位与发射端不一致比如发射用了j^{mn}接收却用j^{(m-n)}去共轭结果就是高维星座全部对不上。4.3 IFFT缩放与功率归一化很多人第一次跑通代码频谱画出来漂亮但一测误码率就爆最后发现是功率归一化问题。FBMC的重叠相加会让不同符号的能量在时域叠加如果你把IFFT输出直接当OFDM符号用输出信号平均功率和理论功率之间会差一个固定倍数这个倍数和K的配置有关。正确的做法是先算出调制符号的理论平均能量再实测发射缓冲的平均功率用两者的比值做整体缩放。调试时建议在AWGN信道下先跑一遍理论BER曲线做校准比如BPSK在AWGN下Eb/N06dB时BER应该在1e-3量级如果BER曲线整体平移或者完全不降先怀疑功率标定而不是信道模型。4.4 无CP时代的同步与均衡问题这是FBMC工程化最痛的点。没有CP意味着无法直接套用OFDM的“粗同步CP内抖一抖”的思路定时偏差超过容忍范围就会让滤波器组正交性瓦解频率偏移则会把本来就重叠的频谱进一步拉歪。对做毕设或者刚入门的人来说我建议先在“完美同步”假设下跑通链路再考虑引入估计。要做同步常用方法是设计专门的FBMC前导序列利用OQAM的相位结构估计时频偏而不是照搬OFDM的互相关方法。均衡方面FBMC在时频局部平稳信道下可以近似做单抽头均衡但性能受固有干扰影响。更严谨的做法是考虑周围格点干扰的联合均衡或者用迭代干扰消除。这些属于进阶内容但起码要有个意识FBMC不是不能用简单的均衡而是不能用“完全无视干扰”的那种简单均衡。4.5 FDS与PPN输出不一致时的快速定位法如果你同时实现了两条路线输出对不上别急着从头查。把问题拆成两层先对比FFT之前的数据X是否一致——FDS的KM点IFFT输入和PPN中M点IFFT输入之间本来就不是直接的对应关系所以这一步没有意义真正有效的做法是用“单载波单符号”的脉冲测试只让第m个子载波在第n个时刻发一个符号其余全部置零分别用两种实现跑对比时域输出波形。这个脉冲响应对照法可以快速定位是滤波器的问题、延迟线的问题还是重叠相加偏移量的问题。5. 实操心得与参数选择建议5.1 重叠因子K到底选多少K4是研究论文的默认选项频谱泄漏抑制效果已经很可观带外辐射在工程上基本可以直接当“干净”来处理。但是K4的时域滤波器长度是4个符号周期再加上OQAM的半符号间隔整体端到端延迟比OFDM高一个量级这对URLLC这种低延迟场景很不友好。K2的滤波器短一半延迟减半复杂度也低但旁瓣只是勉强可以接受频带利用率也开始打折。我的经验是如果是做仿真对比K4如果做硬件原型或者低延迟场景认真评估K2甚至K3别被论文带节奏。5.2 工程化调试顺序与定点化强烈建议按照下面的阶梯推进第一步BPSK无信道FDS实现验证滤波器和OQAM相位逻辑第二步QAM调制AWGN信道验证功率标定和BER第三步加简单多径信道用理想信道估计做均衡理解固有干扰影响第四步再引入同步算法。每一步都要有明确的数值指标卡住不然积攒的bug会在后续阶段变得极难定位。定点化时PHYDYAS系数量化到16bit完全够用但要注意频域采样系数直接量化后原型滤波器的频响会在远端出现小的起伏NCO或查找表建议用对称结构。资源允许的话多相支路系数用对称性减半存储硬件上能省不少DSP Slice。实测下来PPN在FPGA上比FDS节约一半以上的乘法器资源这是它成为主流工程实现的原因。5.3 后续还能往哪些方向扩展FBMC这条路远不止“基本调制实现”这么简单。往下走可以接触MIMO-FBMC的导频设计、CFO鲁棒估计、以及和GFDM、WCP-OFDM这些竞争波形的横向对比往上走可以和AI信道估计结合处理时变信道下的OQAM固有干扰。我个人兜了一大圈之后的体会是FBMC和OFDM之争最后往往不是“谁更好”的问题而是“你的约束函数是什么”——复杂度预算、延迟预算、频谱碎片化程度、接入方式每一样都会改变答案。把基本的调制实现亲手写一遍你会对这些约束有完全不一样的感觉。至少以后再看到论文里那页发射机框图你不会只在心里默念“哦这是滤波器组”而是会下意识地想他用的FDS还是PPN滤波器的镜像对称做对了吗重叠相加的偏移量是多少这种“一眼看出实现细节”的能力就是亲手写代码带来的最大回报。