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的PAPR(0.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)^(k+i)之类的形式。它的目的正是为了把实虚交错在数学上落位,从而保证后续“取实部”的操作成立。这个细节我后面讲代码时还会再强调,因为漏掉这个因子,接收端的BER直接奔着0.1去,怎么追都没用。
2.3 原型滤波器:FBMC谱效率的底气来源
FBMC能实现低带外泄漏,靠的不是灵光一现,而是原型滤波器设计得好。最常被拿来用的,是PHYDYAS项目组提出的那组滤波器系数,它的重叠因子K通常取4,即滤波器冲击响应跨越4个符号周期。
K=4的PHYDYAS滤波器,其频域响应副瓣衰减速度非常快,实测带外辐射要比OFDM低几十dB。但代价也是有的——滤波器越长,符号间重叠越多,信号的整体延迟和实现复杂度也跟着上去了。所以在“低延迟”这个目标下,K到底取2还是4,也是个值得玩味的工程权衡。
我一般仿真默认用K=4,因为谱性能和抗干扰能力都够稳定。但如果你的应用场景对延迟比较敏感,比如URLLC类需求,那可以考虑K=2,代价是滤波器的频域滚降会变缓,带外泄漏会比K=4高,但依然远优于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 / 16QAM |
| FBMC重叠因子K | 4 |
| 原型滤波器 | PHYDYAS |
| 采样率 | 20 MHz |
| 信道模型 | AWGN / ITU-R Pedestrian A |
| 均衡方式 | 单抽头频域均衡(ZF) |
| 评价指标 | PAPR CCDF、BER、谱效率 |
为什么DFT点数选128、有效子载波选256?因为我不想直接把SC-FDMA做得太满,留一些子载波空置可以让滤波器组在带边缘滚降时不会把数据符号“碾碎”。在真实系统里,保护子载波是必要的,这个习惯我从OFDM时代带到FBMC时代,一直没改。
3.2 PHYDYAS原型滤波器生成代码
Matlab里生成PHYDYAS滤波器,最直接的方式就是查表系数加插值。K=4时的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 K=4'); 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这段代码你可以看到,我把步骤拆得比较直白,虽然效率不是最高,但对照原理图去看,每一步都清清楚楚。事实上,真正能把仿真跑快的工程写法,是用多相滤波器结构实现综合滤波器组,而不是这种逐子载波叠加。逐子载波叠加在L=512时还能跑,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_len+1 : 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,多半就是过采样倍数不够或者压根没过采样。这个细节,审稿人不会提醒你,但是射频工程师一眼就能看出来。
接着画CCDF:
figure; 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个符号的实部(从奇数子载波提取)和第t+1个符号的虚部(从偶数子载波提取)拼起来。
实现这个逻辑时,我用了一个缓冲数组:
% 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/(T+T_CP);而加入SC-FDMA预处理后,DFT展宽并不额外占用带宽,因此谱效率几乎没有损失。所以这套方案在谱效率上的口号是“保FBMC的效率,拿SC-FDMA的低PAPR”,两者都不耽误。
4. 实测结果与对比分析
4.1 PAPR对比:最多能压几个dB?
我在相同参数下做了三组对比:纯CP-OFDM、纯FBMC-OQAM、本文方案。调制方式统一用QPSK,512子载波,4倍过采样。
| 方案 | PAPR@0.1%(dB) |
|---|---|
| CP-OFDM | 10.7 |
| 纯FBMC-OQAM | 11.2 |
| 本文方案(FBMC-OQAM + SC-FDMA) | 7.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 CP),FBMC的符号时长只需66.7us,缩短了约6.5%。如果再用短帧设计(比如把TTI从1ms压缩到0.25ms),延迟优势会更明显。
但这里也有一个隐性延迟来源,就是K=4的滤波器带来了4个符号的滤波延迟。换句话说,发端和收端各增加了一些处理时间。想要低延迟,K值不能无限加,工程上一般建议K=2到4之间选择,追求更低延迟就取2,追求更纯频谱就取4。
5. 常见问题与排查技巧实录
5.1 BER高居不下,先查OQAM相位因子
这是我最常遇到的问题。跑了半个小时的仿真,BER一直在0.3附近晃悠,那是真的让人头大。后来仔细对比参考论文,才发现是OQAM相位因子的符号配错了。
OQAM的相位因子一般有两种表示方式,一种是(-1)^(k+i),另一种是j^(k mod 2),两种在数学上等价,但你要是混着用,就会导致实虚交错完全错位。建议的做法是:先在发端把所有符号固定为已知QPSK序列,收端直接打印出提取到的实虚序列,肉眼看看有没有错位,如果有,基本就是相位因子的锅。
5.2 PAPR曲线在低概率区出现“翘尾巴”
正常PAPR CCDF曲线应该是单调下降,但你的仿真里可能会出现在10^-3到10^-4区间突然上扬或者抖动的情况,这通常有两个原因:
- 符号数量不够多。统计PAPR需要至少10万个独立的随机符号,如果你只跑了2000个符号,尾部统计方差很大;
- 过采样不足。如果不过采样就切块统计,信号峰值被低估,尾部概率分布会被压缩,曲线形态怪。
解决方法是:增加蒙特卡洛次数,并且保证每帧信号都做了4倍以上的过采样。
5.3 边界符号误码率特别高
FBMC重叠K=4时,一个符号和前后各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的比值做成可变参数,在不同的信道条件和业务需求下自适应切换。这本质上就是一个“模式切换”波形设计,做出来会是一个很有创新点的课题方向。