基于MSE与LMS算法的OFDM相位噪声抑制及干扰消除仿真
项目介绍
本项目是一个基于MATLAB的通信系统仿真程序,旨在深入研究相位噪声(Phase Noise)对正交频分复用(OFDM)系统的影响,并验证相应的抑制算法。
OFDM系统对相位噪声极为敏感,相位噪声主要产生两种效应:一是导致所有子载波发生共同旋转的通用相角错误(CPE),二是破坏子载波正交性产生的载波间干扰(ICI)。本项目构建了完整的OFDM收发链路,模拟了多径信道和Wiener过程产生的相位噪声,并实现了基于MSE准则的CPE校正算法以及基于LMS自适应滤波的ICI消除算法。
功能特性
- 完整的OFDM链路仿真:包含随机比特生成、QAM调制、导频插入、IFFT/FFT变换、循环前缀(CP)处理及多径信道卷积。
- 相位噪声建模:使用Wiener过程模拟振荡器的相位漂移,真实还原相位噪声对时域信号的累积影响。
- 三种接收策略对比:
1.
无校正:仅进行理想信道均衡,不处理相位噪声。
2.
CPE校正:利用导频信号,通过最小均方误差(MSE)准则估计并补偿公共相位旋转。
3.
联合校正(CPE + ICI消除):在CPE校正的基础上,结合LMS自适应算法消除相邻子载波带来的干扰。
- 性能可视化:自动生成误码率(BER)随信噪比(SNR)变化的曲线图,以及高信噪比下的星座图对比,直观展示校正效果。
系统要求
- MATLAB R2016a及以上版本
- Signal Processing Toolbox(用于QAM调制解调函数)
- Communications Toolbox(用于误码率计算辅助及信道模型)
实现逻辑与算法细节
本项目的主程序逻辑严密地遵循了OFDM通信系统的标准处理流程。以下是代码实现的详细分析:
1. 核心参数配置
系统定义了64个子载波,其中循环前缀(CP)长度为16。采用16QAM调制增强频谱效率,并每隔8个子载波插入一个导频用于相位估计。相位噪声的剧烈程度由方差参数控制,LMS算法的迭代步长设为0.05以平衡收敛速度与稳定性。
2. 发射端处理
每一帧包含100个OFDM符号。由于使用了QAM调制,程序首先生成随机比特流并映射到星座点。在频域构建OFDM符号时,数据子载波填充调制信号,导频子载波填充随机生成的BPSK信号(幅度为±1)。经过IFFT变换转换为时域信号后,添加循环前缀以消除符号间干扰(ISI)。
3. 信道环境模拟
代码模拟了复合的信道损伤环境:
- 多径衰落:使用一个三径信道模型(两径有延迟和相位偏移),通过卷积操作施加于发送信号。
- 相位噪声:利用Wiener过程(随机游走模型)生成时变相位噪声。当前时刻的相位由上一时刻相位叠加高斯白噪声增量得到。该相位噪声以复指数形式乘到时域信号上。
- AWGN:根据设定的信噪比(SNR),计算信号功率并添加加性高斯白噪声。
4. 接收端与信道均衡
接收端去除CP并进行FFT变换后,首先执行理想信道均衡(Zero-Forcing)。代码假设信道频域响应已知,通过除法消除多径信道的影响,从而将问题焦点隔离在相位噪声的抑制上。
5. 相位噪声抑制算法
代码实现了层层递进的两种校正策略:
策略一:基于MSE的CPE估计与校正
由于相位噪声的低频分量在所有子载波上产生相同的相角旋转(CPE),代码提取接收到的导频信号,计算其与发送导频的共轭乘积之和。基于MSE准则,这一操作等价于求加权平均相位差。计算出的角度被用于对整个OFDM符号的所有子载波进行反向旋转补偿。
策略二:CPE与ICI联合消除(LMS算法)
经过CPE校正后的信号仍存在由高频相位噪声引起的ICI。代码实现了一个频域的判决引导(Decision Directed)LMS自适应滤波器:
- 判决:对CPE校正后的信号进行硬判决(Hard Decision),获取最接近的星座点作为参考信号。
- 干扰建模:假设ICI主要来自左右相邻的子载波。
- 自适应迭代:代码在频域逐个子载波进行循环。对于当前子载波,利用相邻子载波的判决值构建输入向量。
- 权重更新:计算预估的ICI干扰并从信号中减去。计算误差(对于导频位置使用已知真值,数据位置使用硬判决值),并根据最小均方误差梯度下降法更新ICI权重系数。通过这种方式,算法能够动态追踪并抵消频谱泄漏造成的干扰。
6. 结果与可视化
仿真结束后,程序会计算并统计三种策略下的误码率。绘图模块生成两个子图:
- BER曲线:展示从0dB到30dB信噪比范围内,无校正、仅CPE校正、联合校正三种情况下的误码率下降趋势。
- 星座图:选取特定信噪比(如25dB),绘制接收信号的星座点分布。可以看到无校正时的相位旋转(圆环状分布)、CPE校正后的相位对齐但仍有扩散、以及联合校正后星座点的进一步收敛。
使用方法
- 确保MATLAB安装了必要的工具箱。
- 将包含代码的
.m 文件放置在MATLAB当前工作路径或搜索路径中。 - 直接运行主函数
main。 - 程序将在命令行输出当前仿真的SNR进度,待仿真完成后自动弹出结果对比窗口。