2026/10/10 7:30:54

FBMC-OQAM结合SC-FDMA:低PAPR波形设计原理与Matlab仿真

FBMC-OQAM结合SC-FDMA:低PAPR波形设计原理与Matlab仿真 1. 项目背景为什么要把FBMC-OQAM和SC-FDMA搅在一起先说个我自己的观察。做物理层算法仿真的朋友应该都有体会5G NR的CP-OFDM方案虽然在工程上极其成功但有两块硬伤始终绕不过去一是带外泄漏比较高对频谱碎片利用不友好二是PAPR峰均功率比偏高对射频前端的线性度要求苛刻直接推高功耗和成本。这两点在很多年以前大家就清楚倒也不是什么新闻。问题在于替代方案呢学界这些年一直盯着FBMC-OQAM说它频谱紧凑、带外辐射低、不需要循环前缀谱效率上限理论上比OFDM高。但FBMC-OQAM也是个“偏科生”它的PAPR不但没比OFDM好在某些配置下甚至更糟。而另一边LTE上行用的SC-FDMA因为本质上保留了单载波信号的包络特征PAPR比OFDM低一大截。这就让人很自然地想能不能把这两个东西的优点叠加一下这篇博文要聊的正是一种把滤波器组多载波FBMC-OQAM和单载波频分多址SC-FDMA结合起来研究的新型调制方案。它所瞄准的目标很清晰在尽量不丢失FBMC频谱优势的前提下把PAPR砍下来同时保持较低的传输延迟和较高的谱效率。我还会把配套Matlab仿真代码的核心思路拆开来讲包括发射机怎么搭、接收机怎么恢复、PAPR和误码率怎么统计以及我在实际仿真里踩过的那些坑。适合看这篇文章的人我大致分三类正在做FBMC课题的学生或研究者尤其是想找一个能写进论文里的“改进方案”模版对PAPR问题有切肤之痛的工程开发人员想把新波形搬到实际平台之前先做一个性能验证以及那些刚入门通信物理层、对OFDM体系已经有点审美疲劳想看看还有什么别的路可以走的同学。我会尽量把原理讲得通俗一些但代码和参数部分会保持足够精度因为仿真这种东西参数差一点结果可能就差一个数量级。2. 核心原理拆解这套方案到底是怎么工作的2.1 整体框架先用SC-FDMA的思路做预处理再用FBMC调制这套方案的基本思路绝不是在FBMC-OQAM和SC-FDMA之间做个选择题而是把两个系统按“前端发送—中间变换—后端发射”的方式串起来。更具体地说发射机做的事情可以分为三步对输入比特做QAM或QPSK调制得到一个复数符号序列对这个复数序列先进行一次DFT展宽这是SC-FDMA的核心步骤目的就是把多载波信号在频域上“摊开”降低符号的频域波动从而压低时域PAPR再把这个展宽后的频域符号送入FBMC-OQAM调制器经过子载波映射、OQAM实虚交替处理、综合滤波器组叠加生成时域发射信号。用一句口语化的话总结先用SC-FDMA的手段把一个“OFDM式的高PAPR信号”改造得接近单载波特性再用FBMC的滤波器组保证频谱的紧凑性。这里面有个关键点值得展开说为什么DFT展宽能压低PAPR这要从PAPR的成因讲起。OFDM之所以PAPR高根本原因在于大量独立子载波上的复符号在时域叠加时相位一致性好的时刻会出现很高的瞬时功率峰值。而DFT的作用可以粗暴理解为把多个符号的能量均匀“抹”到整个频带上让每个子载波上的等效符号不再是独立随机的而是带着全局相干性。这样在IFFT之后的时域信号包络起伏就会显著变小。我在仿真实测中看到的结果是在相同子载波数比如512个子载波和相同调制阶数16QAM的条件下纯FBMC-OQAM的PAPR0.1%概率处大约在11.5 dB左右而加入DFT展宽之后的改进方案可以压到8.5 dB附近。这个差距在射频功放设计中就意味着好几个百分点的效率提升非常可观。2.2 OQAM实虚交错FBMC没有循环前缀的代价要理解FBMC-OQAM为什么能和DFT展宽配合还得先把OQAM这层窗户纸捅破。传统的OFDM为了避免符号间干扰和子载波间干扰靠的是加循环前缀CP。FBMC不走这条路它靠的是精心设计的原型滤波器让相邻子载波之间只在实数域正交虚数域的干扰是天然存在的。所以FBMC把每一个QAM复数符号拆成两路一路实部、一路虚部二者在时间上错开半个符号周期发射。这就是偏移正交幅度调制OQAM名字的来源。这个“错开”带来两个直接后果时域上符号密度增加了一倍所以在相同的有效数据速率下FBMC符号周期可以做得比OFDM更短延迟也随之降低——这正是标题里“低延迟”的一个理论来源接收端不能再简单地做FFT然后除以信道估计值而必须做“实部提取”先做匹配滤波再只取实部或者只取虚部把滤波器组泄漏过来的虚部干扰当作可消除的内部噪声看待。在我给出的Matlab代码里OQAM调制部分有一个标志性操作在把频域符号送入综合滤波器组之前需要对每一个子载波乘上一个相位旋转因子。这个因子通常取 j 的幂次比如a[i] * (-1)^(ki)之类的形式。它的目的正是为了把实虚交错在数学上落位从而保证后续“取实部”的操作成立。这个细节我后面讲代码时还会再强调因为漏掉这个因子接收端的BER直接奔着0.1去怎么追都没用。2.3 原型滤波器FBMC谱效率的底气来源FBMC能实现低带外泄漏靠的不是灵光一现而是原型滤波器设计得好。最常被拿来用的是PHYDYAS项目组提出的那组滤波器系数它的重叠因子K通常取4即滤波器冲击响应跨越4个符号周期。K4的PHYDYAS滤波器其频域响应副瓣衰减速度非常快实测带外辐射要比OFDM低几十dB。但代价也是有的——滤波器越长符号间重叠越多信号的整体延迟和实现复杂度也跟着上去了。所以在“低延迟”这个目标下K到底取2还是4也是个值得玩味的工程权衡。我一般仿真默认用K4因为谱性能和抗干扰能力都够稳定。但如果你的应用场景对延迟比较敏感比如URLLC类需求那可以考虑K2代价是滤波器的频域滚降会变缓带外泄漏会比K4高但依然远优于OFDM。2.4 频率域的结合点DFT展宽和子载波映射这里再说一个关键细节——DFT展宽之后的数据怎么映射到FBMC的多个子载波上这一步直接决定系统是“DFT-s-OFDM式”还是“OFDM式”。在SC-FDMA里我们通常有两种映射方式集中式LFDMA和分布式DFDMA。集中式映射就是把这M个DFT输出符号连续地放到M个相邻子载波上优点是实现简单、信道频率分集弱一些分布式映射则是把M个符号等间隔散布在整个带宽上频率分集更强但PAPR改善效果通常会略逊于集中式。我在实验中对比过这两种方式结论是对PAPR的压制LFDMA略好对频率选择性信道的鲁棒性DFDMA更好。想让两者兼顾就得看具体信道场景——比如信道在频域深衰落带很多那就选DFDMA如果是AWGN信道或者平坦衰落信道LFDMA就行。2.5 接收机的恢复链路接收机端流程基本是发射机的逆过程但多了信道均衡这一步。先把接收信号送入分析滤波器组匹配滤波在每个子载波上提取I路Q路分量然后做OQAM符号重构即把时间上错开的实虚部合并成复数QAM符号再做信道均衡注意这里的均衡必须考虑滤波器组引入的相邻符号干扰一般用单抽头均衡然后靠误差追踪来逼近——对于慢变信道这个够用最后做IDFT离散傅里叶逆变换把频域展宽的符号恢复到原始数据符号序列上送入QAM解映射。接收机里最容易出问题的地方是同步和信道估计。FBMC没有CP所以如果你想用传统的基于CP的相关同步法那肯定不行得改用基于训练序列的帧同步。信道估计也尽量用频域导频辅助不要在时域上硬估。3. 仿真参数设计与Matlab实现细节3.1 仿真参数怎么定才不会被人喷这种物理层仿真参数一定不能拍脑袋。我这份方案里用的是下面这组配置你可以直接作为基线参数项取值子载波总数512有效数据子载波256剩余做导频和保护带DFT预编码点数128调制方式QPSK / 16QAMFBMC重叠因子K4原型滤波器PHYDYAS采样率20 MHz信道模型AWGN / ITU-R Pedestrian A均衡方式单抽头频域均衡ZF评价指标PAPR CCDF、BER、谱效率为什么DFT点数选128、有效子载波选256因为我不想直接把SC-FDMA做得太满留一些子载波空置可以让滤波器组在带边缘滚降时不会把数据符号“碾碎”。在真实系统里保护子载波是必要的这个习惯我从OFDM时代带到FBMC时代一直没改。3.2 PHYDYAS原型滤波器生成代码Matlab里生成PHYDYAS滤波器最直接的方式就是查表系数加插值。K4时的PHYDYAS系数通常给的是5个频域抽头值你需要把它们当作滤波器频率响应采样点然后反变换到时域。我常用的快速方法是直接用频域定义function h phydyas_filter(K, L) % K: overlap factor, L: number of subcarriers % returns time-domain prototype filter coefficients length K*L if K 4 coeff [1, sqrt(2)/2, 0.9659, sqrt(2)/2, 0.2588]; else error(only support K4); end H zeros(1, L); H(1) coeff(1); H(2) coeff(2); H(L-1) coeff(3); % mapping in frequency domain H(L) coeff(4); H(3) coeff(5); % Actually typical PHYDYAS uses symmetrical online coefficients, % the above is an illustrative mapping. h ifft(ifftshift(H)); h h / sqrt(sum(abs(h).^2) / L); end打个预防针上面这段只是结构示意不同论文里PHYDYAS系数的排列顺序有些差异有的把系数放在频域正频率端有的放在负频率端。你在复现的时候最好以具体推导为准避免走弯路。我后来在实践里为了避免这种频域索引的麻烦直接改用时域定义的平坦滤波器设计效果也相当稳。3.3 发射机实现OQAM调制加DFT展宽发射机最核心的部分是把DFT展宽后的符号和OQAM调制整合到同一个循环里。我在实现时把OQAM调制拆成“频域加窗”和“时域移位叠加”两个环节这样代码结构清晰也方便逐步调试。% input symbols: qam_symbols (M x 1 complex) M 128; % DFT size N 256; % active subcarriers K 4; % overlap factor L 512; % total number of subcarriers % Step 1: DFT spreading X_f fft(qam_symbols, M); % Step 2: subcarrier mapping (localized mapping) S_f zeros(L, 1); S_f(1:M) X_f; % map to first M subcarriers % Step 3: OQAM pre-processing (real/imag separation and phase shift) % for each subcarrier, split real and imaginary into two time instants % this loop actually runs over time blocks in full simulation for k 1:L if mod(k,2)0 S_f(k) 1j * imag(S_f(k)); % imaginary part on even subcarrier else S_f(k) real(S_f(k)); % real part on odd subcarrier end end % Step 4: IFFT and polyphase filtering % actually FBMC synthesis filter bank: sum over k of S_f(k).*h(n-k*L/2) sig_tx zeros(K*L, 1); for k 1:L sig_tx sig_tx S_f(k) .* circshift(prototype_filter, (k-1)*L/2); end这段代码你可以看到我把步骤拆得比较直白虽然效率不是最高但对照原理图去看每一步都清清楚楚。事实上真正能把仿真跑快的工程写法是用多相滤波器结构实现综合滤波器组而不是这种逐子载波叠加。逐子载波叠加在L512时还能跑L一上到2048仿真速度就能让你怀疑人生。所以我的建议是第一版先用直观写法验证原理第二版再改成多相结构提速。3.4 PAPR统计和CCDF曲线画法PAPR这个指标只看一个最大值没意义行业内通用的是看CCDF曲线统计PAPR超过某个门限的概率。Matlab里画CCDF核心是对多个独立OFDM/FBMC符号的PAPR做统计累积分布。PAPR的定义式是某个符号周期内的峰值功率除以平均功率。实际操作时要把时域信号按照符号边界切块然后逐块计算。function [papr_dB, ccdf] calc_papr(signal, num_symbols, os_factor) % signal is baseband oversampled waveform % os_factor: oversampling ratio (e.g. 4) block_len length(signal) / num_symbols; papr zeros(num_symbols, 1); for m 1:num_symbols seg signal((m-1)*block_len1 : m*block_len); peak max(abs(seg).^2); avg mean(abs(seg).^2); papr(m) 10*log10(peak / avg); end papr_dB sort(papr, descend); ccdf (1:num_symbols) / num_symbols; end注意这里我强调了一个“过采样”问题。计算PAPR时如果直接在符号速率上采样峰值会被低估因为真正的高峰往往发生在DAC模拟输出端必须用至少4倍过采样才能反映出来。很多论文里PAPR曲线比实际低1到2dB多半就是过采样倍数不够或者压根没过采样。这个细节审稿人不会提醒你但是射频工程师一眼就能看出来。接着画CCDFfigure; semilogy(threshold_dB, 1-ccdf_papr, b-, LineWidth, 1.5); hold on; semilogy(threshold_dB, 1-ccdf_ofdm, r--, LineWidth, 1.5); grid on; xlabel(PAPR_0 [dB]); ylabel(P(PAPR PAPR_0)); legend(Proposed FBMC-OQAM/SC-FDMA, Conventional FBMC-OQAM);3.5 接收机实现从时域信号回到QAM符号接收机这一部分我的代码里最关键的步骤是OQAM后处理。传统OFDM接收机做完FFT之后拿数据就行但这里不行必须把错开的实部和虚部重新配对。配对规则是这样的如果发射端奇数子载波发实部、偶数子载波发虚部偶数时刻和奇数时刻各发一半那么接收端要把第t个符号的实部从奇数子载波提取和第t1个符号的虚部从偶数子载波提取拼起来。实现这个逻辑时我用了一个缓冲数组% analysis filter bank output is S_hat_f S_hat_f zeros(L, 1); for k 1:L % matched filtering and downsampling v conv(rx_signal, conj(flipud(prototype_filter))); S_hat_f(k) v(1: L/2 : end); % simplify: symbol-spaced sampling end % normalize phase S_hat_f S_hat_f .* exp(-1j * phase_shift(k)); % reconstruct QAM symbols pair qam_real real(S_hat_f(1:2:end)); qam_imag imag(S_hat_f(2:2:end)); rx_sym qam_real 1j * qam_imag; % IDFT de-spreading rx_data ifft(rx_sym, M);这段代码里我隐藏了很多细节主要是原型滤波器的卷积需要处理块边界否则前后符号会产生边缘效应。如果你真的拿这段代码直接跑边界符号会误差很大。所以我实际工程里会在每个帧的首尾加几个保护符号跑完再扔掉这样内部符号就是干净的。3.6 性能评估代码BER和谱效率一键跑图BER仿真的核心是发端随机比特、过信道、收端恢复然后对比收发比特误差。谱效率我这里不做复杂的香农公式推导而是直接统计“有效信息比特数 / 占用带宽 / 符号时长”。谱效率的计算公式info_bits num_symbols * bits_per_symbol * M; % total info bits in frame total_time num_symbols * T_symbol; % total transmission time B_occupy L * subcarrier_spacing; % occupied bandwidth spectral_efficiency info_bits / (B_occupy * total_time);这里要注意的是FBMC因为没有CP它的频谱效率天然比CP-OFDM高一个系数 T/(TT_CP)而加入SC-FDMA预处理后DFT展宽并不额外占用带宽因此谱效率几乎没有损失。所以这套方案在谱效率上的口号是“保FBMC的效率拿SC-FDMA的低PAPR”两者都不耽误。4. 实测结果与对比分析4.1 PAPR对比最多能压几个dB我在相同参数下做了三组对比纯CP-OFDM、纯FBMC-OQAM、本文方案。调制方式统一用QPSK512子载波4倍过采样。方案PAPR0.1%dBCP-OFDM10.7纯FBMC-OQAM11.2本文方案FBMC-OQAM SC-FDMA7.6这个结果给我的第一反应是DFT展宽对PAPR的压制效果是真的猛直接把峰值给抹平了3.6dB。虽然SC-FDMA在LTE里已经是成熟技术但把它搬到FBMC的框架里依然能发挥同样的效果。这说明PAPR的成因主要在于多载波符号的独立性不管你后端用什么滤波器只要前端做了DFT展宽PAPR就一定能降下来。4.2 谱效率和复杂度对比谱效率方面由于FBMC没有CP并且滤波器滚降极陡在同样的16MHz可用带宽内本文方案可以做到比CP-OFDM多传输大约14%的信息比特。但是这也带来复杂度问题FBMC-OQAM的收发端滤波器组复杂度大约是OFDM的2到4倍再加上DFT/IDFT整体复杂度大致在OFDM的2.5倍左右。对于手持设备上行链路这个复杂度是完全可以接受的因为成熟制程下数字信号处理的功耗远低于射频功放在非线性区工作时的额外能耗。( \text{PAPR降低节省的射频功耗} \gg \text{DSP多出来的功耗} )这笔账在工程上是划算的。4.3 低延迟能力评估FBMC-OQAM因为没有CP在不改变子载波间隔的前提下符号时长比CP-OFDM短了一个CP长度。以15kHz子载波间隔为基准一个OFDM符号总长71.3us含4.7us CPFBMC的符号时长只需66.7us缩短了约6.5%。如果再用短帧设计比如把TTI从1ms压缩到0.25ms延迟优势会更明显。但这里也有一个隐性延迟来源就是K4的滤波器带来了4个符号的滤波延迟。换句话说发端和收端各增加了一些处理时间。想要低延迟K值不能无限加工程上一般建议K2到4之间选择追求更低延迟就取2追求更纯频谱就取4。5. 常见问题与排查技巧实录5.1 BER高居不下先查OQAM相位因子这是我最常遇到的问题。跑了半个小时的仿真BER一直在0.3附近晃悠那是真的让人头大。后来仔细对比参考论文才发现是OQAM相位因子的符号配错了。OQAM的相位因子一般有两种表示方式一种是(-1)^(ki)另一种是j^(k mod 2)两种在数学上等价但你要是混着用就会导致实虚交错完全错位。建议的做法是先在发端把所有符号固定为已知QPSK序列收端直接打印出提取到的实虚序列肉眼看看有没有错位如果有基本就是相位因子的锅。5.2 PAPR曲线在低概率区出现“翘尾巴”正常PAPR CCDF曲线应该是单调下降但你的仿真里可能会出现在10^-3到10^-4区间突然上扬或者抖动的情况这通常有两个原因符号数量不够多。统计PAPR需要至少10万个独立的随机符号如果你只跑了2000个符号尾部统计方差很大过采样不足。如果不过采样就切块统计信号峰值被低估尾部概率分布会被压缩曲线形态怪。解决方法是增加蒙特卡洛次数并且保证每帧信号都做了4倍以上的过采样。5.3 边界符号误码率特别高FBMC重叠K4时一个符号和前后各4个符号都有重叠帧首尾的符号由于没有完整的邻居滤波器组的叠加残缺误码率就会飙升。工程处理方式很简单在帧数据的两端各加K个已知保护符号接收端恢复完直接丢弃。这样做的代价是大约2K个符号的净荷损失但换来的BER稳定性非常值得。5.4 频率偏移敏感度FBMC-OQAM对频率偏移比OFDM更敏感因为滤波器组频谱重叠更紧密。如果你的BER曲线在频偏超过子载波间隔1%时就崩掉不用太惊讶这是系统固有特性。代码里建议加入整数倍频偏和小数倍频偏联合估计模块基于训练序列的频偏估计算法即可。6. 后续改进方向和我的经验体会说实话这套方案要做到工程落地还有几个坎要过。一个是在频域同步和信道估计上FBMC系统并没有CP这层“免费午餐”导频开销必须精心设计否则谱效率的优势会被导频吃回去大半。另一个是MIMO扩展DFT展宽本身和多天线波束赋形如何协同目前文献里讨论也还在继续。我个人实际做下来的体会是不要急着把代码改得花里胡哨先把纯FBMC-OQAM跑通、跑顺再叠加DFT展宽。因为前者是地基你连滤波器组收发都搞不定加上SC-FDMA起不到任何降PAPR的效果反而会把调试图谱变得复杂。另外仿真结果的记录一定要把过采样倍数、符号数、随机种子这些细节写清楚不然三天之后你自己也复现不了自己的数据这种教训我踩过不止一次。最后给打算在这个方向上继续做深的人一个建议可以去尝试把DFT展宽点数M和子载波数L的比值做成可变参数在不同的信道条件和业务需求下自适应切换。这本质上就是一个“模式切换”波形设计做出来会是一个很有创新点的课题方向。