ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

PTS算法抑制OFDM峰均比:三种分割方式的MATLAB仿真与性能对比

2026/9/7 21:57:30 拓冰建站 浏览量
PTS算法抑制OFDM峰均比:三种分割方式的MATLAB仿真与性能对比 简介这是一份关于降低峰均值比PAPR的PTS算法MATLAB实现文档面向通信系统、数字信号处理领域的研究人员与MATLAB开发者用于解决OFDM等系统中信号峰均比较高的问题。资源共包含1个doc文件压缩包大小51KB文件内以MATLAB程序代码为主完整呈现了随机交织、随机分割、相临分割等多种PTS子块分割方式下的遍历搜索实现流程并配有必要的注释说明。文档从基本原理出发利用randint生成QPSK符号索引通过ifft完成频域到时域转换并基于相位因子集合进行峰值功率搜索从而对比不同分割策略下的PAPR改善效果。代码采用向量化矩阵运算结构清晰便于读者直接运行与二次修改可作为PAPR降低算法研究、课程设计或毕业设计的实用参考资料。目前已有89人学习下载适合需要快速上手PTS算法仿真与MATLAB编程实践的读者。 做OFDM系统仿真最头疼的就是PAPR峰值均值比居高不下。功放线性区有限PAPR一大回退就大效率直接往下掉。PTS算法是抑制PAPR比较经典的一类方法但网上很多教程只讲原理一上MATLAB就被“分割方式”卡住。最近我整理了一套PTS算法MATLAB程序重点把随机分割、相邻分割、交织分割这三种方式都跑了一遍顺便把标题里“随机交织”“相临”这些容易绕晕的说法梳理清楚。这篇就按我的实际调试过程来写适合正在做OFDM峰均比仿真、或者刚接触PTS想快速拿到可运行代码的朋友。1. 三种分割方式分别是什么别再被“随机交织”绕晕1.1 相邻分割最直观的起点相邻分割就是把N个子载波按顺序切成V段每一段连续的子载波分给同一个子块。比如N256、V4时第1个块拿第1到64个子载波第2个块拿第65到128个子载波以此类推。这种分割最直观也最常被论文当作Baseline。MATLAB里用一行reshape(1:N, N/V, V).就能生成对应的索引表。但相邻分割的性能并不是最好的。原因是每个子块在频域上占据的是一段连续谱不同子块的频域分量在位置上比较“靠近”对应到时域上各个分路的包络形状会比较相似峰值出现的位置也相对容易重叠。所以它只是起点不是终点。1.2 交织分割规则但性能受限交织分割是每隔V个子载波取一个给同一块。例如V4时第1个块取第1、5、9……个子载波第2个块取第2、6、10……个子载波。这种分法的索引同样可以用reshape(1:N, V, N/V)直接生成非常规则。交织分割有一个很有意思的性质每个子块在频域上是等间隔稀疏分布所以它对应的时域信号可以看成是同一个OFDM符号的周期延拓。这个性质让它在实现时可以采用抽取结构减少IFFT计算量。但也是因为这种强周期性各子块时域信号的峰值相位关系太固定相位旋转能调整的“自由度”不多实际PAPR抑制效果往往是三种分割方式里最弱的。1.3 随机分割性能最好也最需要固定种子随机分割的做法是先把N个子载波的下标随机打乱再均匀分成V份。每份包含N/V个随机位置上的子载波。代码上可以这样做[~, rp] sort(rand(N, 1)); randIdx reshape(rp, V, N/V);随机分割能让每个子块在频域上散得足够开不同子块对应的时域信号相关性更低峰值出现在不同时刻的概率更大所以相位搜索时更容易找到一组系数把高峰抵消掉。这个优势在V不是特别大的时候就已经很明显了。代价是分割图样每次都不一样仿真结果会有波动所以调试的时候一定要固定随机种子否则你很难判断性能差异是算法带来的还是随机抖动带来的。1.4 标题里的“随机交织”到底指什么很多同学看到“随机交织、随机、相临、交织分割”这一堆词叠在一起就懵了。我的理解是这些名字并不是几个并列的完全不同的算法而是PTS里同一个分块步骤下的不同索引策略。“随机交织”本质上可以看作随机分割的一种变体先产生一个随机交织图样再按照交织后的顺序做分割最终得到的仍然是每块N/V个随机子载波效果等价于随机分割。“相临”其实就是“相邻”的笔误代表相邻分割。所以你在读论文或程序时只要抓住一个核心问题——每个子块到底拿走了哪些子载波——就不会再被各种叫法绕晕。2. 分割方式影响性能的底层逻辑2.1 PTS的核心是让几个时域信号互相“消峰”PTS算法本身不复杂。把待发送的频域符号X切成V个子块X_v每个子块分别做IFFT得到x_v然后给每个x_v乘上一个旋转相位b_v再相加。目标就是选择一组b_v让合成信号$$\tilde{x} \sum_{v1}^V b_v x_v$$的PAPR最小。由于b_v来自有限集合比如{1, -1, j, -j}这本质上是一个小规模的组合优化问题。要理解它为什么有效可以打个比方几个小组原本在同一时间点同时大声喊合唱的时候那个点就爆音了。PTS允许每个小组带一点延迟或者反相让它们峰值时刻不要那么齐。这里的相位因子就是调整每个小组喊话节奏的旋钮。2.2 相关性越低相位搜索越容易生效分块方式决定了x_v之间的统计相关性这是分割方式影响性能的根本原因。随机分割后不同子块的频率分量均匀地散落在整个频带x_v的包络相互独立性很高峰值重合的概率低。所以只需要在有限组合里试几十次就很容易找到明显降峰的组合。相邻分割的x_v也有一定独立性但频域上靠得太近时域包络形状更接近峰值重合的概率更高。交织分割的x_v相关性最强几乎是一个序列的不同循环版本旋转相位能改变的波形形态有限性能自然排最后。从搜索复杂度看三种分割方式在相同V和W下需要搜索的组合数都是W^(V-1)因为通常固定第一个子块相位为1避免整体取反造成的重复搜索。所以分割方式并不改变搜索次数。交织分割的价值主要在实现层面它的频域等间隔结构可以转换为少点数的IFFT从而降低硬件计算量。这也是为什么它PAPR性能不是最优却仍然有论文在用的原因。3. MATLAB程序核心框架分块、IFFT、相位搜索一次跑通3.1 仿真参数和主循环骨架下面这套程序不依赖通信工具箱QPSK调制也是手动映射的只要有MATLAB就能跑。主程序结构包括参数配置、分割索引生成、过采样、IFFT分块、相位搜索、PAPR统计。N 256; % 子载波数 L 4; % 过采样率 V 4; % 子块数 W 4; % 相位集合大小 numSym 10000; % OFDM符号数 phaseSet exp(1j * 2 * pi * (0:W-1) / W); rng(2024); % 固定随机种子保证可复现 % 三种分割方式索引任选其一 adjIdx reshape(1:N, N/V, V).; % 相邻分割 intIdx reshape(1:N, V, N/V); % 交织分割 [~, tmp] sort(rand(N, 1)); randIdx reshape(tmp, V, N/V); % 随机分割 % 选择一种 partIdx randIdx; paprs zeros(numSym, 1); for n 1:numSym % QPSK调制手动映射不依赖工具箱 data randi([0 3], N, 1); sym (1/sqrt(2)) * ((2*(data2)-1) 1j*(2*mod(data,2)-1)); X sym; % 原始OFDM过采样把N个子载波放在IFFT双边带对应位置 Xup zeros(L*N, 1); Xup(1:N/2) X(1:N/2); Xup(L*N - N/2 1 : L*N) X(N/2 1 : N); % 对每个子块分别IFFT xv zeros(L*N, V); for v 1:V Xv zeros(N, 1); idx partIdx(v, :); Xv(idx) X(idx); Xvup zeros(L*N, 1); Xvup(1:N/2) Xv(1:N/2); Xvup(L*N - N/2 1 : L*N) Xv(N/2 1 : N); xv(:, v) ifft(Xvup, L*N) * sqrt(L*N); end % 穷举相位因子组合固定第一个子块相位为1 papr_min 1e9; for bIdx 0:W^(V-1)-1 b ones(V, 1); t bIdx; for v 2:V b(v) phaseSet(mod(t, W) 1); t floor(t / W); end xc xv * b; % 各列乘上对应b_v再相加 p 10*log10(max(abs(xc).^2) / mean(abs(xc).^2)); if p papr_min papr_min p; end end paprs(n) papr_min; end这里最关键的一点是每个候选相位组合只需要做矩阵向量乘不需要重新IFFT。因为每个子块的时域信号xv在一个符号内只算一次候选组合只是对已有的V路信号做线性叠加。这是PTS仿真能跑得动的关键很多人误以为每个候选都要IFFT结果程序慢到怀疑人生。3.2 生成CCDF曲线的统计代码PTS效果一般用补累计分布函数CCDF看横轴是PAPR阈值纵轴是PAPR超过阈值的概率。统计代码很简单% 计算CCDF并绘图 thr 0:0.1:13; ccdf zeros(size(thr)); for k 1:length(thr) ccdf(k) sum(paprs thr(k)) / numSym; end semilogy(thr, ccdf); xlabel(PAPR threshold (dB)); ylabel(CCDF); grid on;如果想要对比原始OFDM可以在同一个循环里直接对Xup做IFFT算出未经过PTS的PAPR存成另一个数组。这样就能把原始OFDM、相邻分割、交织分割、随机分割四条曲线画在同一张图上对比。4. 同一仿真条件下三种分割的性能差异4.1 仿真条件与CCDF实测结果我跑的参数是N256、L4、V4、W4、QPSK符号数10000随机种子固定为2024。在CCDF10^-3这个常用比较点上结果大致如下方案PAPRCCDF10^-3 (dB)原始OFDM11.9相邻分割PTS8.1交织分割PTS8.7随机分割PTS7.4这个结果和主流文献趋势一致随机分割最好相邻分割其次交织分割最弱。三种PTS方案相比原始OFDM都有3dB以上的提升随机分割更是压低了4.5dB左右。如果你用的调制阶数、子载波数不同具体数值会有变化但相对排序基本不会变。从CCDF曲线形态看随机分割不仅能压低尾部而且曲线整体明显左移相邻分割在中间区域表现不错但极低概率尾部会略差于随机分割交织分割的中段和尾部都比较靠右这也是它“规则化”付出的代价。4.2 为什么随机分割最好但交织分割仍有人用随机分割性能最好工程上却有一个现实问题分割图样越随机接收端要恢复原始数据就越依赖准确的边信息。PTS本身需要传输每个子块的相位因子分割方式如果也是随机变化的那接收端还需要同步同一套随机图样否则数据根本解不出来。所以在实际系统里随机分割需要额外约定随机种子或通过控制信道下发复杂度不是零。交织分割虽然PAPR增益小一些但它的分块结构是固定的、规则的接收端不需要任何额外信息就能知道每个子块的位置。更重要的是交织分割可以借助抽取/插值结构把V路IFFT的计算量降下来这对硬件实现非常友好。所以如果目标不是极限性能而是追求可实现的功耗和面积交织分割仍然是一个合理选择。我个人的建议是仿真验证阶段用随机分割拿性能上限工程化设计阶段再根据硬件约束在相邻和交织之间权衡。不要只看一条CCDF曲线就下结论。5. 调参经验与排错记录5.1 过采样率不要低于4PAPR是连续信号的峰值特性直接用N点IFFT采样峰值很可能落在采样点之间导致PAPR被低估。过采样率L建议至少取4再往上增加到8结果差异已经很小。上面程序里所有IFFT长度都用L*N就是避免这个问题。5.2 相位因子集合大小W和子块数V的权衡V4、W4是我最常用的起点搜索次数是4^364次。如果想进一步提升性能优先增加V而不是W因为子块数增多能让PTS在时域上有更多对抗峰值的自由度。比如V8、W2的搜索次数是2^7128次比V4、W4多了一倍但降峰效果往往更明显。不过V增大边信息占比也会上升最后可能吃掉的增益。5.3 几个容易让结果“假错”的细节先说索引方向。reshape(1:N, N/V, V).和reshape(1:N, V, N/V)产生的索引表方向完全不同跑之前最好打印partIdx(1, :)看一眼前三行避免调了一晚上发现分割方式是反的。再说过采样。很多人习惯先对X做整体补零得到Xup然后直接在Xup上用partIdx索引取子块。这是一个经典错误因为partIdx是针对原始N维频域向量的Xup的索引已经不是原来的子载波排列了。正确做法是在原始X上先分块再对每个子块分别过采样。关于IFFT的归一化程序里我乘了sqrt(L*N)目的是让时域幅度更接近OFDM连续信号定义。如果你只算PAPR不乘也完全不影响因为PAPR是峰值和平均功率的比值常数缩放会被约掉。但要注意如果你把时域信号存下来做后处理就必须统一归一化规则。最后是随机种子。随机分割仿真不固定种子两次运行相差零点几个dB都很正常。用rng(2024)固定种子才能保证对比不同参数时的差异是真实性能变化而不是随机波动。我的习惯是拿到别人PTS程序后先不看相位搜索部分直接看partIdx的前几行基本上立刻能判断分割方式对不对。然后固定种子跑一版原始OFDM和PTS的对比如果PTS结果比原始还高那八成是过采样或索引搞错了。这个方法帮我省下了很多调试时间你也可以试试。本文还有配套的精品资源点击获取