项目:基于限幅法的OFDM系统PAPR抑制仿真
项目介绍
本项目构建了一个完整的正交频分复用(OFDM)通信系统发射端仿真模型,专注于利用限幅法(Clipping)技术来降低OFDM信号的峰值平均功率比(PAPR)。在MATLAB环境下,程序模拟了从比特流生成到时域信号处理的全过程,重点实现了多阈值硬限幅算法,并通过统计学方法(CCDF)和时域波形图直观展示了限幅对PAPR的抑制效果。
功能特性
- 完整的OFDM发射链路:包含随机数据生成、16-QAM高阶调制、频域过采样(插值)、IFFT变换及功率归一化。
- 多阈值限幅算法:支持自定义多个限幅率(CR, Clipping Ratio),程序能够在一个仿真周期内同时对多种阈值设置(如4dB, 6dB, 8dB)进行处理和对比。
- PAPR统计分析:自动计算原始信号与处理后信号的PAPR值,并生成互补累积分布函数(CCDF)曲线,量化评估抑制性能。
- 可视化展示:
*
CCDF对比图:在对数坐标下展示不同限幅阈值下的PAPR分布概率。
*
时域波形图:直观对比原始信号包络与限幅后的信号包络,并标记限幅阈值电平。
系统要求
- MATLAB R2017a 或更高版本
- Communications Toolbox(用于
qammod 函数)
使用方法
- 确保MATLAB安装了通信工具箱。
- 打开MATLAB软件,定位到项目所在目录。
- 直接运行
main.m 文件。 - 程序运行结束后,控制台将输出仿真进度,并弹出两个图形窗口展示仿真结果。
代码实现逻辑详解
本项目核心代码集中在 main.m 文件中,具体的实现逻辑如下:
1. 系统参数初始化
程序首先定义了OFDM系统的基础参数:
- 子载波数量 (N):设为64。
- 调制方式 (M):采用16-QAM。
- 过采样因子 (L):设为4。为了准确捕捉模拟信号的PAPR,程序在频域进行了4倍过采样(FFT点数为 $64 times 4 = 256$)。
- 仿真符号数 (nSym):设为2000个符号,以保证统计结果的准确性。
- 限幅阈值列表:定义了[4, 6, 8] dB三个等级的限幅率用于对比。
2. OFDM信号生成
在主循环中,程序逐个符号进行生成:
- 数据映射:生成随机整数索引,利用
qammod 进行16-QAM调制,并开启 UnitAveragePower 选项确保频域信号平均功率归一化。 - 频域零填充(过采样):为了实现过采样,程序构建了一个长度为 $N times L$ 的频域向量。将调制后的N个子载波数据映射到向量的低频部分和高频部分(中间补零),这模拟了理想的频域插值。
- IFFT变换:对填充后的频域数据进行逆快速傅里叶变换(IFFT),变换到时域。并乘以 $sqrt{N_{fft}}$ 进行功率归一化,得到时域OFDM符号。
3. PAPR计算与限幅处理
- 原始PAPR计算:计算时域信号的瞬时功率,取其峰值与平均值的比值,转换为分贝(dB)单位存储。
- 限幅算法实现:
* 程序遍历定义的限幅阈值列表(CR_dB_List)。
*
阈值计算:根据当前符号的均方根值(RMS)动态计算绝对阈值 $A = x_{rms} times 10^{CR/20}$。这意味着每个符号的截断门限是随该符号的平均功率自适应的。
*
硬限幅操作:检测信号幅度。对于幅度超过 $A$ 的采样点,将其幅度强制设置为 $A$,同时保留原始相位信息;对于未超过阈值的点,保持原样。
*
处理后PAPR计算:重新计算限幅后信号的PAPR值并存储。
*
Demo数据缓存:程序会自动缓存最后一个符号在特定阈值(列表中间值)下的波形数据,用于后续画图。
4. 统计分析 (CCDF)
仿真循环结束后,利用内置子函数
calculate_ccdf 对收集到的PAPR数据进行统计:
- 定义统计区间为0到14dB,步长0.1dB。
- 计算每一个PAPR阈值点上,实际PAPR大于该阈值的概率(Probability of PAPR > PAPR_0)。
- 分别生成原始信号和三种不同限幅程度下的CCDF数据矩阵。
5. 结果可视化
- Figure 1 (CCDF曲线):绘制半对数坐标图。横轴为PAPR值(dB),纵轴为超出概率。黑色实线代表原始信号,其他颜色标记线代表不同CR下的限幅信号。
- Figure 2 (时域波形):绘制单个OFDM符号的幅度包络。蓝色实线为原始信号,红色虚线为限幅后信号,黑色点划线指示了限幅阈值电平,清晰展示了“削峰”过程。
关键算法与函数分析
- qammod: 用于生成标准的16-QAM星座点。代码中使用了
UnitAveragePower 参数,这对保证后级功率计算的基准一致性至关重要。 - ifft: 实现从频域到时域的转换。代码中采用了将子载波分为两半分别放置在FFT输入数组首尾的策略(
input_fft(1:N/2) 和 input_fft(end-N/2+1:end)),这是为了正确处理FFT的频移特性,确保直流分量位于中心,从而在时域获得正确的过采样插值效果。 - 限幅逻辑: 代码采用了经典的恒定相位硬限幅逻辑:
$$x_{clipped} = begin{cases} x, & |x| le A \ A cdot e^{j angle x}, & |x| > A end{cases}$$
代码通过向量化操作
amplitude > A 快速定位索引,避免了低效的逐点循环,利用
A * (x ./ abs(x)) 实现相位保持的幅度截断。
- calculate_ccdf (子函数): 这是一个通用的统计辅助函数,通过
sum(data > bins(i)) 快速计算大于特定阈值的样本数,从而得到互补累积分布概率。