☰
SLM-PTS 抑制 PAPR 实战:MATLAB 实现 PSK/QAM 调制与 CCDF 对比
2026/10/31 9:54:26 网站建设 项目流程

简介:这份资源面向无线通信与OFDM系统仿真方向的学习者和研究者,聚焦降低信号峰均功率比(PAPR)这一经典难题。压缩包内含基于MATLAB的实现脚本,围绕SLM(选择性映射)与PTS(部分传输序列)两种技术的单独使用及联合策略展开,并涉及PSK、QAM等调制方式下的性能分析,可用于理解候选符号数量、子载波分组策略与计算复杂度之间的权衡。包体共1个文件,为m脚本类型,压缩后约1KB,体量轻便,便于直接运行与二次修改。目前已有194人学习下载,说明该方向具备一定关注度。读者可借助脚本复现SLM-PTS降低PAPR的仿真流程,观察不同参数配置下的峰均比改善效果,并在此基础上调整算法细节,为OFDM系统发射机设计与相关课题研究提供可参考的代码基础。

1. 从 slm_psk_qam 这个包名说起:SLM-PTS 到底在解决什么工程问题

如果你在 OFDM 或 QAM 基带链路里调过功放,大概率遇到过同一个现象:EVM 指标在实验室小功率下很漂亮,一推到接近 P1dB 压缩点,星座图就开始发散,误码率曲线整体右移。根因往往不是调制解调算法本身,而是发射信号的峰均比(PAPR)太高,功放被迫回退,效率被吃掉。slm_psk_qam.rar这个包名把三件事捆在一起:PSK/QAM 调制、SLM(选择性映射)和 PTS(部分传输序列),目标就是压 PAPR。SLM-PTS 是这两类概率类抑制技术的组合叫法,核心思路是同一组频域数据生成多个候选时域信号,挑峰均比最低的那个发出去。它适合做基带算法验证、通信课程设计、以及需要在 MATLAB 里快速跑通 PAPR 对比曲线的工程师。这一章先把问题边界划清楚,后面几章再落到具体实现和参数。

PAPR 的定义是信号峰值功率与平均功率之比,单位 dB。OFDM 子载波叠加后,时域包络近似高斯分布,峰均比随子载波数增大而升高,典型 64 到 1024 子载波场景下 CCDF 曲线在 10^-3 概率处能到 10 dB 以上。SLM 的做法是给频域符号乘上不同的相位旋转序列,IFFT 后得到多个候选,选 PAPR 最小的;PTS 则是把频域数据分块,每块乘相位因子后再合并。两者都能在不引入带外失真的前提下降低 PAPR,代价是计算量和边带信息(SI)传输。slm_psk_qam这个命名暗示包里同时覆盖 PSK 和 QAM 两种映射,方便对比不同调制阶数下 SLM-PTS 的抑制效果。理解这一点,后面的参数设置才有依据。

2. SLM 与 PTS 的算法骨架:候选信号怎么生成、相位怎么选

2.1 SLM 的候选生成与相位序列设计

SLM 的本质是相位旋转。设频域符号向量为 X,长度为 N,生成 U 个相位序列 P(u) = [e^{jφ(u,0)}, ..., e^{jφ(u,N-1)}],每个候选信号为 x(u) = IFFT(X ⊙ P(u))。相位因子通常取 {±1, ±j} 或 {1, -1},前者是 4 相位集合,后者是 2 相位集合。相位集合越大,候选多样性越好,但边带信息比特数也越多。常见做法是 U 取 4 到 16,相位集合取 {±1, ±j},此时每个候选需要 log2(U) 比特的边带信息。

选相位序列时有个容易忽略的点:序列之间要尽量不相关。如果两个相位序列只差一个常数相位,IFFT 后只是整体旋转,PAPR 几乎一样,等于浪费了一个候选。我一般用随机生成加相关性检查,或者直接用 Hadamard 行向量映射到 {±1}。下面这段 MATLAB 代码给出 SLM 候选生成和 PAPR 计算的最小骨架。

% SLM 最小实现:N 子载波,U 个候选,QPSK 映射 N = 256; % 子载波数 U = 8; % 候选数 QPSK = [1+1j, 1-1j, -1+1j, -1-1j] / sqrt(2); X = QPSK(randi(4, 1, N)); % 频域符号 % 生成 U 个相位序列,元素取自 {1,-1,1j,-1j} phaseSet = [1, -1, 1j, -1j]; P = phaseSet(randi(4, U, N)); papr = zeros(1, U); for u = 1:U x = ifft(X .* P(u, :), N); % 候选时域信号 papr(u) = 10*log10(max(abs(x).^2) / mean(abs(x).^2)); end [paprMin, idx] = min(papr); % 选最优候选

逻辑说明:X .* P(u,:)是频域相位旋转,ifft后得到候选时域信号,papr按峰值功率比平均功率计算。参数说明:N决定 PAPR 基线,子载波越多基线越高;U是计算量和抑制效果的折中,U 从 4 增到 16 通常能多压 1 到 2 dB,但 IFFT 次数线性增长;phaseSet用 4 相位比 2 相位多约 0.5 到 1 dB 增益,代价是边带信息从 1 比特变 2 比特每候选。

2.2 PTS 的分块、相位加权与合并

PTS 把 N 个子载波分成 V 个子块,每个子块单独 IFFT,得到 v 个部分序列,再对每个部分序列乘相位因子 b(v) ∈ {±1, ±j},合并后选 PAPR 最小的组合。和 SLM 的区别在于:SLM 是整体旋转,PTS 是分块旋转,候选空间更大,但需要 V 次 IFFT,计算量随子块数增长。常见分块方式有相邻分块、交织分块和随机分块,交织分块在 PAPR 抑制上通常略好,因为子块间相关性更低。

% PTS 最小实现:V 个子块,相位因子遍历 V = 4; % 子块数 X_blocks = reshape(X, V, N/V); % 相邻分块 bSet = [1, -1, 1j, -1j]; bestPAPR = inf; bestB = []; for b1 = bSet for b2 = bSet for b3 = bSet for b4 = bSet b = [b1 b2 b3 b4]; x = zeros(1, N); for v = 1:V x = x + b(v) * ifft(X_blocks(v, :), N); end p = 10*log10(max(abs(x).^2) / mean(abs(x).^2)); if p < bestPAPR bestPAPR = p; bestB = b; end end end end end

逻辑说明:每个子块先 IFFT 再乘相位因子合并,遍历所有相位组合选最优。参数说明:V是子块数,V=4 时组合数 4^4=256,V=8 时 4^8=65536,计算量爆炸,所以实际常用次优搜索;bSet取 4 相位;分块方式影响抑制效果,交织分块需要把reshape换成索引重排。PTS 的边带信息是 V 个相位因子的索引,V=4 时需要 8 比特。

2.3 SLM-PTS 混合:为什么要把两者叠起来

单独用 SLM,U=16 时典型能压 3 到 4 dB;单独用 PTS,V=4 时能压 3 到 5 dB。两者叠起来的思路是:先用 PTS 分块降低部分序列的峰值相关性,再对合并后的信号做 SLM 候选选择,或者反过来先 SLM 再 PTS。混合结构能多压 1 到 2 dB,但计算量是两者乘积。slm_psk_qam这个包名把 SLM 和 PTS 并列,说明它大概率实现了混合流程。工程上要权衡的是:多压 1 dB 值不值得多花几倍 IFFT。如果功放回退余量紧张,值得;如果只是课程验证,单独 SLM 就够。

3. 在 MATLAB 里跑通 slm_psk_qam:从解压到 PAPR 曲线

3.1 环境准备与包结构确认

拿到slm_psk_qam.rar后,先解压到不含中文和空格的路径,MATLAB 对中文路径的兼容性时好时坏,这是血泪经验。解压后确认目录里是否有主脚本、调制函数、PAPR 计算函数和绘图脚本。常见结构是主脚本调用modulate、slm_pts、calc_papr三个函数。如果包里只有脚本没有函数,说明是单文件实现,直接运行主脚本即可。MATLAB 版本建议 R2018b 以上,ifft和randi的行为在旧版本有差异。

% 检查包内文件与路径 addpath(genpath('slm_psk_qam')); % 加入所有子目录 which slm_pts % 确认函数可见 ver % 查看 MATLAB 版本

逻辑说明:genpath递归加入子目录,避免函数找不到;which确认关键函数在路径上;ver确认版本。参数说明:如果which返回空,说明函数名和包内不一致,需要打开主脚本看实际调用名。

3.2 关键参数设置:子载波数、候选数、调制阶数

跑通之前先把参数表定下来。下面这张表是我在 PAPR 对比实验里常用的配置,直接抄即可。

参数含义推荐值影响
N子载波数256 / 512 / 1024越大 PAPR 基线越高
USLM 候选数4 / 8 / 16越大抑制越好,IFFT 次数线性增
VPTS 子块数2 / 4 / 8越大候选空间越大,计算量指数增
M调制阶数4 / 16 / 64QAM 阶数越高,PAPR 略升
phaseSet相位集合{±1} 或 {±1,±j}4 相位多压 0.5~1 dB
oversample过采样倍数4准确捕捉峰值,1 会低估 PAPR

过采样这个参数最容易被忽略。不过采样时,IFFT 输出的峰值可能落在采样点之间,PAPR 被低估 1 到 2 dB。常见做法是 IFFT 长度取 4N,即 4 倍过采样,再算 PAPR。slm_psk_qam里如果没做过采样,对比曲线会偏乐观。

3.3 跑通主流程并画出 CCDF 曲线

CCDF 是 PAPR 抑制效果的标准展示方式:横轴 PAPR 门限,纵轴超过该门限的概率。下面代码给出从调制到 CCDF 的完整流程。

N = 256; U = 8; V = 4; M = 16; oversample = 4; numSymbols = 1000; % 蒙特卡洛次数 paprSLM = zeros(1, numSymbols); paprPTS = zeros(1, numSymbols); paprHybrid = zeros(1, numSymbols); for s = 1:numSymbols X = qammod(randi([0 M-1], 1, N), M, 'UnitAveragePower', true); % 纯 SLM P = (1j).^randi(4, U, N); p = inf; for u = 1:U x = ifft(X .* P(u,:), N*oversample); p = min(p, 10*log10(max(abs(x).^2)/mean(abs(x).^2))); end paprSLM(s) = p; % 纯 PTS(次优:固定第一块相位为 1) Xb = reshape(X, V, N/V); best = inf; for b2 = [1 -1 1j -1j] for b3 = [1 -1 1j -1j] for b4 = [1 -1 1j -1j] b = [1 b2 b3 b4]; x = zeros(1, N*oversample); for v = 1:V x = x + b(v)*ifft(Xb(v,:), N*oversample); end best = min(best, 10*log10(max(abs(x).^2)/mean(abs(x).^2))); end end end paprPTS(s) = best; % 混合:PTS 后接 SLM P2 = (1j).^randi(4, U, N); ph = inf; for u = 1:U x = ifft((X .* P2(u,:)), N*oversample); ph = min(ph, 10*log10(max(abs(x).^2)/mean(abs(x).^2))); end paprHybrid(s) = min(best, ph); end % 画 CCDF figure; hold on; for data = {paprSLM, paprPTS, paprHybrid} [f, x] = ecdf(data{1}); plot(x, 1-f, 'LineWidth', 1.5); end xlabel('PAPR (dB)'); ylabel('CCDF'); grid on; legend('SLM', 'PTS', 'SLM-PTS');

逻辑说明:外层蒙特卡洛循环生成随机 QAM 符号,分别跑 SLM、PTS 和混合,记录每次的 PAPR,最后用ecdf画 CCDF。参数说明:numSymbols取 1000 以上曲线才平滑,100 以下抖动明显;oversample=4是准确度关键;PTS 里固定第一块相位为 1 是次优搜索,把组合数从 256 降到 64,损失约 0.3 dB。混合那行min(best, ph)是简化写法,严格混合应该先 PTS 合并再 SLM 选,这里只是示意。

跑完后看 CCDF 曲线:在 10^-3 概率处,SLM 比原始 OFDM 低 3 到 4 dB,PTS 低 3 到 5 dB,混合低 5 到 6 dB。如果曲线没降,先查过采样和相位序列相关性。

4. 避坑与排查:SLM-PTS 实现里最容易翻车的 5 个点

4.1 现象:PAPR 曲线几乎不降,和原始 OFDM 重合

原因:相位序列之间高度相关,或者候选数 U 实际只有 1。常见于随机生成相位序列时没检查相关性,或者循环里P(u,:)索引写错,每次用的都是同一行。另一个可能是 IFFT 没做过采样,峰值被低估,看起来降了但实际没降。

解决:打印相位序列的相关系数矩阵,确认非对角元素接近 0;检查循环索引;把 IFFT 长度改成 4N 再对比。我一般会在候选生成后加一句corr(P')看相关性。

4.2 现象:PTS 计算时间爆炸,跑一次要几分钟

原因:V 取 8 时组合数 4^8=65536,每个组合都要 V 次 IFFT,计算量是 V×4^V。V=8 时单符号就要几十万次 IFFT,蒙特卡洛 1000 次直接卡死。

解决:用次优搜索,固定第一块相位为 1,组合数降到 4^(V-1);或者用二进制相位 {±1} 把组合数降到 2^V;再或者用迭代翻转法,每次只翻转一个子块相位,复杂度降到 V×4。工程上 V 不超过 4,再大就用 SLM 替代。

4.3 现象:QAM 高阶调制时 PAPR 比 QPSK 高很多,误码率也差

原因:QAM 阶数越高,星座点幅度分布越广,IFFT 后峰值概率增大,PAPR 基线本身升高。如果 SLM-PTS 参数没跟着调,抑制效果被基线升高抵消。另外高阶 QAM 对相位噪声和功放非线性更敏感,PAPR 降了但 EVM 未必改善。

解决:高阶 QAM 下把 U 或 V 调大 1 档,过采样保持 4;同时看 EVM 而不只看 PAPR,PAPR 降 1 dB 但 EVM 恶化 2 dB 就不划算。slm_psk_qam里如果同时有 PSK 和 QAM 脚本,对比时保持 N 和 U 一致。

4.4 现象:边带信息传输出错,接收端解调全错

原因:SLM-PTS 需要把选中的相位序列索引传到接收端,如果边带信息比特数算错,或者传输中出错,接收端无法恢复原始符号。常见于 U=8 时用了 2 比特而不是 3 比特,或者 PTS 的 V 个相位因子索引打包顺序和接收端不一致。

解决:边带信息比特数 = log2(U) 向上取整,PTS 是 V×log2(相位集合大小)。打包顺序在收发两端用同一个函数,别一边按子块顺序一边按相位值排序。边带信息本身可以用信道编码保护,或者用差分相位避免传输。

4.5 现象:换 MATLAB 版本后qammod报错或结果不同

原因:qammod在 R2018a 前后参数名和默认功率归一化行为有变化,旧版本默认平均功率为 1,新版本需要显式指定'UnitAveragePower', true。不指定时 PAPR 计算基准不一致,对比曲线不可比。

解决:统一加'UnitAveragePower', true;如果版本太旧不支持,手动除以sqrt(mean(abs(X).^2))归一化。跑对比实验前先ver确认版本,别跨版本比曲线。

5. 进阶技巧:用相位序列预筛选和分段搜索把混合方案跑快

混合 SLM-PTS 的瓶颈在候选数乘积。U=8、V=4 时,如果先 PTS 再 SLM,等效候选是 8×64=512 次 IFFT,蒙特卡洛 1000 次就是 51 万次 IFFT,MATLAB 里跑一轮要十几分钟。我一般用两个技巧压时间:相位序列预筛选和分段搜索。

预筛选的思路是:不是所有相位序列都值得算 IFFT。先对每个候选算一个低复杂度的 PAPR 估计,比如只算部分采样点的峰值,或者用频域峰均比近似,筛掉明显差的候选,只对前 30% 做完整 IFFT。下面代码给出预筛选骨架。

% 相位序列预筛选:先用部分采样估计 PAPR coarseFactor = 4; % 粗筛采样间隔 keepRatio = 0.3; % 保留比例 U = 16; P = (1j).^randi(4, U, N); coarsePAPR = zeros(1, U); for u = 1:U x = ifft(X .* P(u,:), N); xc = x(1:coarseFactor:end); % 降采样估计 coarsePAPR(u) = max(abs(xc).^2) / mean(abs(x).^2); end [~, sortIdx] = sort(coarsePAPR); keepIdx = sortIdx(1:round(U*keepRatio)); % 保留最优的 30% bestPAPR = inf; for u = keepIdx x = ifft(X .* P(u,:), N*4); % 完整过采样 bestPAPR = min(bestPAPR, 10*log10(max(abs(x).^2)/mean(abs(x).^2))); end

逻辑说明:先用 1 倍采样算粗 PAPR 排序,只对前 30% 做 4 倍过采样完整计算。参数说明:coarseFactor越大粗筛越快但排序越不准,取 4 是折中;keepRatio取 0.3 时能省 70% 完整 IFFT,损失约 0.2 dB。这个技巧在 U=16 以上收益明显,U=4 时没必要。

分段搜索用在 PTS 上:V=4 时不用遍历 64 个组合,先固定后两块相位为 1,遍历前两块选最优,再固定前两块最优值遍历后两块,两轮下来只算 8+8=16 个组合,损失约 0.5 dB。如果对 0.5 dB 不敏感,这个技巧能把 PTS 时间压到四分之一。

验证方法上,我习惯用两条曲线交叉确认:一条是 PAPR CCDF,一条是 BER 对 SNR。PAPR 降了但 BER 没改善,说明抑制没转化成链路增益,可能是边带信息开销吃掉了收益,或者功放模型没加。加一个 Saleh 或 Rapp 功放模型再跑,PAPR 抑制的收益才看得见。这个习惯帮我避免过好几次「曲线好看但链路没用」的翻车。

最后说个我自己的教训:别一上来就堆 U 和 V。先把 N=256、U=4、V=2 跑通,确认 CCDF 降了 2 dB 以上,再逐步加参数。参数一多,出错的地方从 3 个变 10 个,排查成本指数上升。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询