1. PAPR高企,OFDM系统绕不开的那道坎
1.1 PAPR到底是什么,它为什么让人头疼
如果你是做通信物理层的,应该对OFDM的峰均功率比(PAPR)不陌生。OFDM能拿下4G/5G和WiFi这样的主流市场,靠的是频带利用率高、抗多径能力强,本质上就是“把一路高速数据流拆成多路低速子载波并行传输”。但成也子载波,败也子载波:多个子载波在时域上是线性叠加的,万一某段时间所有符号的相位恰好对齐,合成信号的瞬时幅度就会远远高于平均幅度,形成一个尖锐的峰。
PAPR的全称叫Peak-to-Average Power Ratio,定义非常直白:
[ PAPR = 10\log_{10}\left(\frac{\max |x(n)|^2}{E[|x(n)|^2]}\right) \quad (\text{dB}) ]
这里(x(n))是IFFT之后的时域信号。如果IFFT点数是N,所有子载波相位完全对齐这种最极端情况下的理论峰值可以达到(10\log_{10}N)。N等于1024时就是30dB,当然实际系统里所有子载波一直同相位对齐的概率极低,但统计意义上的高PAPR依然非常现实。比如10000个OFDM符号里,有0.1%的符号PAPR在13dB以上,这类“倒霉样本”就足够让后级电路吃苦了。
用生活里的例子来理解:你开一场线上演唱会,大多数时候音量很稳,但有个高音歌手偶尔飙出一个极大声浪。你要是把功放音量调得太大,这个尖峰就会让喇叭削顶破音;要保证不破音,就得把系统整体音量压下来。RAPR就是描述这种“偶尔飙一下”有多凶的量化指标。它在频域上并不是看不见摸不着的理论参数,而是直接决定功放效率、DAC位宽、芯片面积和整机散热的工程指标。
1.2 高PAPR最终影响的是谁
OFDM高PAPR带来的连锁反应,比很多人想的要大。第一个受害者是功率放大器(PA)。射频功放只有在接近饱和区时效率才高,但PAPR高意味着信号摆幅大,为了不让峰值进入饱和区,必须把工作点大幅回退。回退6dB意味着输出功率只有饱和功率的四分之一,一个标称40%效率的PA,回退之后实际效率可能只能剩20%左右。在基站侧这关系到电费和散热,在终端侧这关系到电池续航,谁做项目谁心里有数。
第二个受害者是ADC和DAC的动态范围。DAC输出信号要覆盖峰值,PAPR高就得预留更多头顶空间,相当于在一个固定位宽的转换器里,信号的有效位数被压缩了。ADC同理,接收端如果AGC没打好,高PAPR信号很容易导致削波,信噪比直接损失。更为隐蔽的是EVM和ACPR问题:PA压缩以后,带内失真让星座点散开,EVM恶化;带外频谱再生让邻道功率超标,要么改滤波器设计,要么接受测试不过的结局。
所以“降低PAPR”从来不是单单为了画一条好看的曲线,它串起了射频链路效率、发射合规性、接收解调表现和系统成本。我见过不少项目前期只盯着频谱效率和吞吐率,等到PA选型时才发现PAPR太高导致无法满足指标,最后不得不回头补课,推翻架构重新做校验。把PAPR问题放在系统设计的第一步来想,确实能省掉后面一整轮的返工。
2. 读懂降PAPR的技术底牌:方案选型决定项目天花板
降低PAPR的思路大体可以分成四类:让信号许可变形的限幅类方法、通过多组候选信号挑最优的概率类方法、在频谱资源上做手脚的预留与星座扩展方法、以及从源头改变波形形态的DFT-S-OFDM等方法。每一类都不是万能的,选择什么方案基本决定了你的EVM余量、实现复杂度和信令开销。
2.1 限幅类:最简单也最保底的一手
限幅(Clipping)的思路是把时域信号幅度超过门限的部分硬切掉,只保留相位信息。优点是实现极其简单,不需要任何边带信息,接收端对发射机改动一无所知也能正常工作。缺点是它直接引入失真:带内失真会让星座图变散,BER变差;带外失真会让频谱重新鼓起来,邻道泄漏增大。
工程上通常不是干削一次就完事,而是“限幅+滤波”连用。滤波的作用是把限幅后产生的带外频谱再清理一遍,常用的做法是直接对限幅后的信号做FFT,把非数据子载波上的分量清零,再IFFT回去。不过滤波器一介入,时域信号的峰值会重新涨回来一点,这叫峰值再生(peak regrowth)。要压得更狠,就要做迭代限幅滤波:限幅、滤波、再限幅、再滤波,两三轮之后PAPR能明显下降,但EVM也在稳步变差。这就是限幅法的本质矛盾:PAPR每降1dB,都要拿信号质量去换。
限幅法在工程里为什么永远有一席之地?因为它对系统改动最小,整条链路从发射到接收都是透明的,只需要在发射端加一个模块。很多WiFi类产品的时间敏感需求下,限幅加滤波往往是救场的第一选择。
2.2 概率类:SLM与PTS的“多量几次再发货”
选择性映射(SLM)和部分传输序列(PTS)走的是另一条路线:允许信号变形,而是在发送前生成多组不同的时域备选信号,然后挑PAPR最小的那一组发出去。接收端只要知道了发射端选了哪组备选,就能反推回原始符号。
SLM的思路是对频域符号向量乘上若干组不同的相位旋转序列,每一组旋转序列都对应出一个不同的时域波形,最终选PAPR最低的发送。PTS的思路则是先把频域子载波分成若干块,每一块单独做IFFT,得到若干组时域片段,然后为每个片段搜索一个最优旋转相位,让叠加后的PAPR最小。
这两类方案的共同优点是不给星座点带来失真,理论上能保住BER;代价是要向接收端传递边带信息。PTS还要面对搜索复杂度问题,分块数V和相位候选数K一旦上去,组合数就是(K^{V-1})量级。V等于4、K等于4时只有64种组合,仿真还好;V涨到8时,4096种组合已经开始让人有点坐不住了。为了控制复杂度,实际项目里往往用次优搜索,比如按顺序一个个调相位,或者用粒子群一类的启发式算法去逼近最优解,不再做全遍历。
2.3 预留与星座扩展:不牺牲信号质量的另类消峰
预留子载波法(Tone Reservation,TR)专治“既不想限幅又不想传边带”的矫情场景。它把部分子载波置为0,不承载数据,只用来生成一个专门的消峰信号,在时域里和目标信号叠加,把过高的峰值“垫”下去。接收端处理这些预留子载波时直接忽略即可,所以发射和接收之间不需要额外通信。
主动星座扩展(Active Constellation Extension,ACE)则是把最外圈的星座点沿着特定合法方向往外推,使得叠加之后信号的峰值相位被抵消掉一部分。因为外圈星座点之间最小欧氏距离没有变,接收端判决的难易程度理论上不会恶化,但扩展过程要控制好方向,否则相邻星座点之间的判定边界会被挤压。
TR和ACE都属于中等复杂度、无失真的折中方案,但是有前提:要么系统里允许预留一部分子载波不传数据(造成频谱效率的小损失),要么调制方式本身有足够的外圈自由度。到我实际做仿真的时候,发现TR的表现很依赖预留子载波的比例和分布方式,预留比例太低,消峰能力上不去,预留太多,频谱效率的损失又成了新问题。
2.4 源头整形:DFT-S-OFDM与频域谱整形
最后一类思路干脆从波形源头解决问题,最典型的代表就是LTE上行采用的DFT-S-OFDM,也叫SC-FDMA。它先对数据块做一次DFT,把符号从频域变回类单载波的形态,再进行子载波映射和IFFT。由于级联后的等效发射信号接近单载波,PAPR天然比纯OFDM低不少,这也是它被选为上行方案的重要原因——终端发射功率受限,波形必须对PA友好。
频域谱整形(Frequency Domain Spectral Shaping)是另一种源头优化,通过对每个子载波的幅度进行加权来抑制时域峰值的形成,好处是接收端可以预知权值并做补偿,坏处是加权意味着部分子载波功率被压低,实际传输效率会有损失。
到这里可以把主流方案放在同一个表格里对比,项目选型时照着这张表做初筛会清楚很多:
| 方案 | 是否引入信号失真 | 是否需要边带 | 接收端改动 | 复杂度 | 典型适用场景 |
|---|---|---|---|---|---|
| 限幅+滤波 | 是 | 否 | 无 | 低 | 快速工程落地、既有系统改造 |
| PTS | 否 | 是 | 需要边带处理 | 中高 | 对BER敏感、追求PAPR增益的定制系统 |
| SLM | 否 | 是 | 需要边带处理 | 中 | 学术研究和链路预算充足的系统 |
| TR预留子载波 | 基本无 | 否 | 无 | 中 | 允许预留子载波的标准 |
| ACE星座扩展 | 无 | 否 | 无 | 中 | 高阶QAM、有外圈星座点可用 |
| DFT-S-OFDM | 无 | 否 | 需匹配接收算法 | 低-中 | 上行链路、低功耗终端 |
3. 从零实现一套降PAPR链路:仿真与调参实战
再好的方案,不落到仿真代码里都是纸上谈兵。我习惯在MATLAB里先把发射机基线跑通,再逐步加入限幅滤波和PTS等模块,最后用CCDF曲线、EVM和频谱模板综合评估。下面按这个顺序把关键步骤和可以复用的脚本都写出来。
3.1 先搭一个OFDM发射机基线
一开始不要急着降PAPR,先保证一个干净OFDM信号能正确生成。仿真参数可以设成Nfft为256点,实际使用的子载波Nsc为200个,调制用最简单的QPSK,统计符号数要足够多,至少跑一千万个调制符号对应的OFDM符号量级。
clear; clc; Nfft = 256; % IFFT/FFT点数 Nsc = 200; % 实际使用子载波数量 numSym = 20000; % OFDM符号数 % QPSK数据:这里用randi直接生成相位 dataBits = randi([0 1], Nsc, numSym); data = exp(1j * (pi/4) + 1j * pi * dataBits); % 子载波索引映射:把数据放到 -Nsc/2 到 Nsc/2-1 的位置 idxBase = (-Nsc/2 : Nsc/2-1).'; idxFft = idxBase + Nfft/2 + 1; % 换算成FFT的bin位置 X = zeros(Nfft, numSym); X(idxFft, :) = data; % IFFT发射,乘以 sqrt(Nfft) 做能量归一化 x = ifft(X, Nfft, 1) * sqrt(Nfft); % 计算每个OFDM符号的PAPR peakPow = max(abs(x).^2, [], 1); avgPow = mean(abs(x).^2, 1); papr = 10*log10(peakPow ./ avgPow); % 画CCDF曲线 thresholds = 0:0.25:12; ccdf = zeros(size(thresholds)); for k = 1:length(thresholds) ccdf(k) = sum(papr > thresholds(k)) / numSym; end figure; semilogy(thresholds, ccdf, 'LineWidth', 1.5); xlabel('PAPR Threshold (dB)'); ylabel('Probability(PAPR > Threshold)'); grid on;这段代码跑完,你会得到一条典型的OFDM“尾巴高高翘起”的CCDF曲线。在QPSK和256点IFFT的参数下,CCDF在(10^{-2})概率处的PAPR大约是11dB左右,(10^{-3})处大概能到12dB以上。这里需要注意,统计符号数太少时曲线尾部会抖动,我用20000个符号都觉得不安心,正式仿真至少跑10万个符号,尤其是后续对比算法增益时,尾部稳定性直接决定了结论是否可信。
3.2 加上限幅和滤波:版本一是不够的
有了基线,下面就可以做限幅和滤波。限幅比CR(Clipping Ratio)定义为门限幅度与信号均方根幅度的比值:
[ CR = \frac{A_{clip}}{\sqrt{E[|x|^2]}} ]
CR越小削得越狠,PAPR降得越明显,EVM也越差。一般取CR在1.0到1.6之间。CR为1.0时,门限等于平均幅度的根均值,削峰力度已经很大;CR取1.4以上时,PAPR改善幅度已比较小,但EVM保持得就好。
% 限幅 CR = 1.2; A_clip = CR * sqrt(mean(abs(x(:)).^2)); amp = abs(x); amp(amp > A_clip) = A_clip; x_clip = amp .* exp(1j * angle(x)); % 滤波:把非数据子载波上的频谱分量清零 X_clip = fft(x_clip, Nfft, 1) / sqrt(Nfft); X_clip(setdiff(1:Nfft, idxFft), :) = 0; x_filt = ifft(X_clip, Nfft, 1) * sqrt(Nfft); % 再算一次PAPR paprClip = 10*log10(max(abs(x_filt).^2, [], 1) ./ mean(abs(x_filt).^2, 1));这段代码放在一起看很简单,真正麻烦的是滤波之后的峰值再生。我第一次跑的时候,限幅后CCDF曲线明明降得很好,一滤波曲线又抬回去了,原因就是限幅产生的带外成分被滤掉后,时域波形重新拉出了峰。要处理这个现象,就把限幅和滤波当成一个整体循环做两三遍。每做一轮,PAPR会继续降一点,但EVM也在积累,所以一般到第三轮以后性价比就很低了。我建议在第一轮直接用比较保守的CR,比如1.3到1.4,再做一次迭代滤波,比直接上很低的CR削出更低的PAPR要稳妥得多。
3.3 PTS的仿真验证和参数权衡
PTS的思路是先把频域符号分块,生成V个时域片段,再搜索每个片段的最优旋转相位。具体仿真可以按下面这个结构来做:
V = 4; % 分块数量 phaseCandidates = [0, pi/2, pi, 3*pi/2]; % 每个块可以选4个相位 % 1. 把子载波分成V组,建议用交织分组,PAPR性能通常好于整段分组 blocksIdx = reshape(1:Nsc, [], V); % 每一列是一组子载波索引 % 注意:实际分组要对应到idxFft % 2. 每块单独IFFT,得到时域片段xv(1..V) xv = zeros(Nfft, V); for v = 1:V tmpX = zeros(Nfft, 1); tmpX(idxFft(blocksIdx(:, v)), 1) = data(blocksIdx(:, v), 1); xv(:, v) = ifft(tmpX, Nfft) * sqrt(Nfft); end % 3. 遍历相位组合,保存最优结果 bestPapr = 1e9; for s1 = 1:length(phaseCandidates) for s2 = 1:length(phaseCandidates) for s3 = 1:length(phaseCandidates) for s4 = 1:length(phaseCandidates) ph = [phaseCandidates(s1), phaseCandidates(s2), ... phaseCandidates(s3), phaseCandidates(s4)]; xCand = sum(xv .* exp(1j*ph), 2); paprCand = max(abs(xCand).^2) / mean(abs(xCand).^2); if paprCand < bestPapr bestPapr = paprCand; bestPh = ph; end end end end end % 4. 用最优相位生成最终发送信号 xPts = sum(xv .* exp(1j*bestPh), 2);这里的复杂度问题非常现实。V=4、K=4时是64次组合搜索,在MATLAB里瞬间完成;V=8、K=8时就是超过800万次组合,直接跑不完了。实际工程里大家会做三件事:把V控制在4左右、把相位候选集压缩到两个(比如只做0和(\pi))、或者用遗传算法/粒子群搜索次优解。我做过V=4、K=2的简化PTS,PAPR在(10^{-3})点能比原始OFDM低2到3dB,而复杂度只有16次叠加计算,性价比相当高。
分组方式的选择也让很多人踩坑。数据子载波相邻分组和交织分组最后出来的PAPR表现完全不同,交织分组方式因为让各个时域片段的峰值发生错开,更容易在相位搜索时找到抵消机会。仿真时我通常会把交织和相邻两种方式都扫一遍,选表现好的作为默认配置。
3.4 用CCDF、EVM和频谱模板一起做裁决
降PAPR方案的评价不能只看CCDF。CCDF只回答“峰值概率有没有降下来”这一个问题,如果在降的过程中把星座图削得稀烂,那整个方案就是负收益。我习惯把三件事放在同一轮仿真里看。
第一件是CCDF曲线,重点看(10^{-2})到(10^{-4})这一段;第二件是接收端解调后的EVM,限幅方案和频谱模板的余量强相关;第三件是发送信号的功率谱密度,确认带外泄露没有殃及邻道。
| 指标 | 原始OFDM | 限幅+滤波CR=1.2 | 二轮限幅滤波 | PTS(V=4, K=2) |
|---|---|---|---|---|
| CCDF 10^-3点 PAPR | 约11.8 dB | 约8.5 dB | 约7.9 dB | 约9.2 dB |
| 接收EVM(无信道) | 0% | 约4%-6% | 约7%-9% | 约0%-1%(视边带误码) |
| 实现复杂度 | 低 | 低 | 低 | 中 |
| 边带开销 | 无 | 无 | 无 | 有 |
这张表是我在QPSK、256点FFT、AWGN下得到的典型数值,具体系统和调制方式不同会有偏差,但它能表达核心趋势:限幅拿EVM换PAPR,PTS拿复杂度换EVM。项目立项时,如果链路预算里EVM还有大量富余,限幅方案性价比极高;如果EVM余量紧张但FFT算力充足,PTS这类无失真手段才值得投。
4. 真实项目里的坑与排查套路
仿真做得再漂亮,落到项目里还是会撞上各种问题。我把这些年做PAPR优化时踩过的坑和排查经验整理出来,可以当成一份速查手册。
4.1 “边带信息”丢了,BER直接崩溃
SLM和PTS这类概率方法最容易被忽略的不是算法本身,而是边带信息的工程化处理。仿真时接收端默认知道发射端选了哪组相位,但真实系统里这个信息也是要占用信道资源传送的。信道一差、边带解错,接收端就会用错误的相位序列去还原信号,整块数据就全错了。
我见过一个项目,PTS在仿真里把PAPR降得非常漂亮,但是一进系统级联调,吞吐率反而下来了,最后定位到边带信息没有被做保护编码,一个比特翻转就让整个码块解调失败。正确的做法是:边带信息要单独做信道编码,或者放到控制信道里用更低阶调制传输,再或者是采用无边的带PTS变体,比如通过接收端对所有候选相位组合做盲检测,利用校验和选出正确的一组。后者虽然免了信令开销,但接收端复杂度大幅上升,需要谨慎权衡。
4.2 限幅之后EVM看着还好,频谱模板却过不了
很多新人第一次做限幅+滤波,看到EVM在5%以内就觉得万事大吉。实际上滤波做得不够干净的话,带外频谱会出现一个“圆弧形”鼓包,在频谱模板边界上和测试限值撞在一起,尤其是邻道泄漏指标非常容易被卡住。
排查时不要只盯带内EVM,要把功率谱密度和标准模板画在同一张图里,看顶部余量是不是小于3dB。如果滤波后带外还是鼓,先检查是不是只做了一轮滤波,因为限幅产生的带外分量很大,滤波器的阶数和通带设计也要跟着调。这里有一个经验参数供参考:IFFT为256点时,数据子载波占200个,滤波时把旁边预留的子载波清空后,最少做两轮“限幅-滤波”循环,带外才会真正收敛。千万不要为了压低PAPR无限迭代,第三轮开始EVM会加速变差而不说,频谱改善也已经很小了。
4.3 降PAPR的增益在仿真里很明显,实测却弱了不少
这是让团队最挫败的落差。原因通常出在三个地方。
第一是DAC量化位数。如果发射端的定点实现位宽不足,信号峰值的量化噪声本身就形成了一个新的“崛起”过程,等效于额外抬高了PAPR。仿真里默认浮点理想精度,一到FPGA定点化就会看到CCDF曲线尾部抬升,建议至少使用12位以上有效位宽,并对各模块中间增益做仔细管理。
第二是插值滤波器和成形滤波器带来的峰均比再生。基带IFFT输出的PAPR再低,经过插值脉冲整形之后都会略有回升。这个在链路仿真里如果不建模就发现不了,所以一定把发射端的插值滤波器放进链路模型里,别只在IFFT输出点做评估。
第三是PA的记忆效应和温度漂移。功放的压缩特性并不是静态的,瞬时峰值过后器件偏置点回不到原始状态,实际ACPR表现会比用小信号模型推出来的差。解决思路是在实验室用实际PA参数做功率扫描,把PAPR优化和PA回退放在一个联合设计表里看,而不是分开各自走路。
下面这张常见问题速查表是我在项目里反复用到的排障清单:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| CCDF正常但EVM超标 | 限幅比太激进、滤波迭代过多 | 提高CR,检查星座图散点 |
| 频谱模板边缘鼓包 | 滤波不彻底、迭代次数不够 | 增加一轮限幅-滤波循环 |
| BER异常但EVM正常 | PTS/SLM边带信息解错 | 检查边带编码与盲检测 |
| 实测PAPR比仿真高 | DAC位宽不足、插值滤波建模缺失 | 加宽位宽,把插值级建模 |
| PTS效果远不达预期 | 分块方式不合适或相位候选太少 | 换交织分组,增加K或优化搜索 |
| 限幅后低PAPR段不长 | 统计样本数太少 | 至少跑10万以上OFDM符号 |
4.4 从选型到落地的习惯性操作
说到工程落地,我再补一个习惯,能把很多风险提前化解:任何PAPR方案都不要直接在全系统里切换,先在离线仿真里保留原始OFDM链路作为对照组,同时测三个量——PAPR CCDF、EVM、ACPR。把三个量画在一张图上,团队评审时直接看权衡曲线,比看单一条CCDF直观得多。
另一个习惯是给方案留开关。我在FPGA实现里往往会做两个配置位,一个用来选“限幅+滤波”还是“PTS”,另一个用来切配置参数。因为现场联调时你永远不知道链路的实际余量卡在哪,可能是ACPR、可能是EVM、也可能是功放温度,预留切换能力比押注单一方案聪明得多。
5. 最后分享一点个人体会
做PAPR降幅快十年,我的结论其实很朴素:不要神化任何方案,也不要贬低限幅这种老办法。项目交付压力大的时候,限幅+滤波永远是最稳的起手式,因为它实现简单、接收端透明、调试变量少;协议允许预留子载波且EVM余量吃紧的时候,TR和PTS这类无失真方案才值得投入;如果能在物理层波形上主动做文章,DFT-S-OFDM这种从源头压PAPR的思路更是长期收益最高。
我个人的一个建议是,仿真环境里一定要把“方案复杂度”这个维度替我量化为芯片面积和功耗的粗估。很多论文里的算法PAPR降得很漂亮,但把迭代次数、矩阵运算、搜索次数一折算,发现比限幅滤波贵出几十倍,项目不会买单。这个思维习惯帮我过滤掉了一大批炫技却不可落地的方案。
最后分享一个调试小技巧:在仿真里调任何降PAPR参数时,先把限幅比和迭代次数写成一个简单配置结构体,然后在同一个图里叠加原始OFDM、限幅版、优化版的CCDF曲线,并把EVM和BER打印到标题栏里。这个做法成本极低,但能让你和团队一眼看清每个方案到底付出了什么代价。很多时候项目成败不取决于算法多先进,而是你有没有把代价和收益的账算清楚。