PAPR 迭代降低算法仿真

📅 2026/6/18 11:39:51
PAPR 迭代降低算法仿真
1) 算法在做什么OFDM 时域信号峰值高本质原因是大量子载波同相叠加。“迭代降低”一般不是一步到位而是限幅把时域样值压到门限 A 以内非线性会抬升底噪/产生带外频域滤波把限幅产生的“带外失真”扔掉只保留子载波位置的频域分量迭代重复 1→2让带内失真慢慢“收敛”PAPR 逐步下降代价每次限幅都会引入带内失真EVM 类损伤因此迭代不是越多越好要在 PAPR 与 EVM/BER 间折衷。2) 关键参数与建模假设参数符号典型值子载波总数N256有效子载波N_usedN或 N-保护 tone调制M16-QAM / QPSK过采样率时域L4限幅门限幅度A由目标 PAPR₀ 换算迭代次数N_iter3~8帧数Monte CarloN_frame≥500CCDF 才稳限幅门限与 PAPR 的关系如果你希望“限幅门限对应某个目标 PAPR₀(dB)”Aσx10PAPR010A \sigma_x \sqrt{10^{\frac{PAPR_0}{10}}}Aσx​1010PAPR0​​​其中 (σx2E[∣x(n)∣2]\sigma_x^2E[|x(n)|^2]σx2​E[∣x(n)∣2])用一段训练样本估计或直接归一化平均功率为 1。3) 核心函数迭代限幅 频域滤波ICF这里我用频域把“非子载波位置置零”来模拟“只保留有用子载波”——等价于理想的子载波内滤波。functionx_outicf_ofdm(y,A,N_iter,Nfft,N_used,cp_len)% ICF_OFDM Iterative Clipping and Frequency-Domain Filtering% y : 时域 OFDM 符号 (NfftL*Nfft? 这里约定 y 长度为 Nfft)% A : 限幅门限 (幅度)% N_iter : 迭代次数% Nfft : FFT 点数% N_used : 有效子载波数这里用简单中心映射示意% cp_len : CP 长度不影响限幅核但你要统一接口就留着xy(:);% --- 子载波索引简单取中心 N_used ---kcfloor((Nfft-N_used)/2)1;idx_usedkc:(kcN_used-1);forit1:N_iter% 1) 限幅magabs(x);phaseexp(1j*angle(x));mask(magA);x_cx;x_c(mask)A.*phase(mask);% 硬限幅你可换软限幅dx_c-x;% 限幅失真% 2) 回频域只保留子载波位置滤掉带外Dfft(d,Nfft);D_filterzeros(Nfft,1);D_filter(idx_used)D(idx_used);% 子载波内留着% 3) 重建时域xx_c-ifft(D,Nfft);% 经典写法x_new x_c - ifft(带外)% 等价理解只保留带内 x ifft(D_filter)% 可选再做一个小保护避免数值反弹x(abs(x)A)A.*exp(1j*angle(x(abs(x)A)));endx_outx;end如果你要更“射频味”把频域滤波换成FIR/矩形窗对应 sinc 时域或保留 DC/左右对称子载波即可结构不变。4) 完整仿真骨架产生 OFDM → 迭代降低 → PAPR/CCDF4.1 主脚本clear;clc;close all;%% 参数 Nfft256;N_usedNfft;% 这里先不用虚拟子载波方便看清 PAPRM16;% QAML4;% 过采样倍数N_sym1;% 每帧 OFDM 符号数PAPR 通常不依赖多符号cp_lenNfft/8;% 迭代参数N_iter5;PAPR0_dB7;% 你想“对应的限幅门限”参考不是保证值N_frame1000;% Monte-Carlo%% 归一化令 E[|x|^2]1 % 16-QAM 平均能量 (格雷/单位平均功率归一化可自己定)constqammod(0:M-1,M,...InputTypeinteger,UnitAveragePowertrue);% const (2*(randi([0 1],N,1)-0.5) 1j*(2*(randi([0 1],N,1)-0.5))) / sqrt(2); % QPSK 例子PAPR_vec_rawnan(N_frame,1);PAPR_vec_icfnan(N_frame,1);rng(42);forf1:N_frame%% 1) 随机数据brandi([0M-1],N_used*N_sym,1);Xfqammod(b,M,InputTypeinteger,UnitAveragePowertrue);%% 2) 映射到 FFT 位置中心映射kcfloor((Nfft-N_used)/2)1;Xzeros(Nfft,1);X(kc:kcN_used-1)Xf;%% 3) IFFT → 过采样可在此做最简IFFT 后插值更“标准”用 L*Nfftx_rawifft(X,Nfft)*sqrt(Nfft);% 归一化看你习惯下面我们用功率归一化% --- 功率归一化使得 E[|x|^2]1 ---x_rawx_raw/sqrt(mean(abs(x_raw).^2));% 为省事这里先不做 L1 插值PAPR 仍可比但更严格的要插值xx_raw;%% 4) 原始 PAPRpower_instabs(x).^2;PAPR_raw(f)10*log10(max(power_inst)/mean(power_inst));%% 5) 限幅门限Asqrt(mean(power_inst))*sqrt(10^(PAPR0_dB/10));%% 6) ICFx_icficf_ofdm(x,A,N_iter,Nfft,N_used,cp_len);% 重新功率归一化可选便于公平比较x_icfx_icf/sqrt(mean(abs(x_icf).^2));power_inst2abs(x_icf).^2;PAPR_icf(f)10*log10(max(power_inst2)/mean(power_inst2));end%% CCDF PAPR_db0:0.1:12;ccdf_rawarrayfun((t)mean(PAPR_rawt),PAPR_db);ccdf_icfarrayfun((t)mean(PAPR_icft),PAPR_db);figure;semilogy(PAPR_db,ccdf_raw,k--,LineWidth,2);hold on;grid on;semilogy(PAPR_db,ccdf_icf,r-,LineWidth,2);xlabel(PAPR_0 (dB));ylabel(CCDF Prob(PAPRPAPR_0));legend(Raw OFDM,ICF (iterstring(N_iter)));title(OFDM PAPR 降低迭代限幅频域滤波);参考代码 PAPR 迭代降低算法仿真www.youwenfan.com/contentcsv/81410.html5) 3 个“仿真坑”PAPR 看起来偏低 / 没峰→ 你很可能没做过采样。真 PAPR 需要用至少 (L\ge4) 的过采样IFFT 插值或更长 IFFT否则会漏掉峰。做法用Nfft_up L*Nfft把频域填到更大网格再做 IFFT。迭代后波形“反而更怪”→ 常见原因你限幅门限太低A 太小→ 强削波 → 带内 EVM 暴增或者你滤波没正确“只保留子载波/带内”。先把N_iter1跑通、看时域波形再往上加。CCDF 不稳曲线毛毛躁躁→N_frame不够。PAPR 尾部是稀有事件通常要几千帧才平滑看你精度需求。