基于 ESPRIT 算法的 DOA 估计与智能天线仿真
项目介绍
本项目是一个基于 MATLAB 的阵列信号处理仿真系统,专注于利用旋转不变子空间技术(ESPRIT)进行波达方向(DOA)估计。项目实现了两种核心算法:标准最小二乘 ESPRIT(LS-ESPRIT)和总体最小二乘 ESPRIT(TLS-ESPRIT),并结合估计结果进行了智能天线波束形成的演示。此外,系统还包含蒙特卡洛仿真模块,用于评估算法在不同信噪比(SNR)下的性能表现。
功能特性
- 高保真信号模型:不仅模拟了均匀线性阵列(ULA)对远场窄带信号的接收,还支持自定义阵元数量、信源数量、入射角度及快拍数,并引入高斯白噪声(AWGN)模拟真实信道环境。
- 双算法实现:
*
LS-ESPRIT:基于最小二乘准则求解旋转不变因子。
*
TLS-ESPRIT:基于总体最小二乘准则,通过奇异值分解(SVD)进一步降低噪声对子空间旋转特性的影响。
- 智能天线波束仿真:利用计算出的 DOA 角度自动生成加权系数,绘制波束方向图,直观展示天线阵列指向目标信号的能力。
- 多维度可视化:
* 协方差矩阵特征值分布图(用于验证信号子空间维度)。
* 单次快拍下的 DOA 估计结果对比图(星座图/散点图形式)。
* 智能天线空间谱/波束方向图。
* RMSE(均方根误差)随 SNR 变化的性能曲线。
- 鲁棒性评估:内置蒙特卡洛仿真循环,自动解决特征分解带来的角度顺序模糊问题,准确计算 RMSE。
系统要求
- MATLAB R2016a 或更高版本
- 无需额外工具箱(核心算法仅依赖基础线性代数运算:
eig, svd, pinv 等)
使用方法
直接运行主脚本 main.m 即可。脚本会自动执行以下流程:
- 初始化系统参数。
- 执行单次仿真演示,输出 LS 和 TLS 算法的估计角度及耗时。
- 弹出图形窗口展示特征值分布、估计结果散点图和波束方向图。
- 进入蒙特卡洛循环(可能需要几秒钟),计算不同 SNR 下的 RMSE。
- 弹出第二个图形窗口展示性能评估曲线。
用户可以在代码顶部的“系统参数设置”区域修改以下参数:
- 阵元数量 (N)
- 阵元间距与波长比 (d_lambda)
- 快拍数 (K)
- 真实入射角度 (theta_true)
- 信噪比范围与实验次数
代码逻辑与实现细节
主程序 main.m 的逻辑流程严谨且模块化,具体实现如下:
1. 系统参数初始化
程序首先定义了仿真所需的物理参数,包括 8 阵元的 ULA、半波长间距、200 次快拍以及两个位于 -15° 和 30° 的信源。同时设定了蒙特卡洛仿真的 SNR 遍历范围(-10dB 至 20dB)。
2. 单次仿真与演示
- 信号生成:调用信号生成函数,根据设定的几何结构产生接收数据矩阵 $X$。
- 算法执行:分别调用 LS-ESPRIT 和 TLS-ESPRIT 函数处理同一组数据 $X$,并记录运行时间。
- 结果对比:对估计出的角度进行排序,方便直接在控制台与真实角度进行对比打印。
3. 可视化模块
程序生成一个包含三个子图的综合窗口:
- 特征值分布:对数据矩阵进行奇异值分解,绘制幅度分布,直观展示“信号子空间”与“噪声子空间”的能量差异。
- 单次估计对比:利用
stem 图绘制真实角度与两种算法估计值的相对位置,模拟星座图效果。 - 波束方向图:选取 TLS-ESPRIT 估计出的第一个角度作为目标方向,计算常规波束形成加权矢量(Steering Vector),并在 -90° 至 90° 范围内扫描阵列响应,绘制归一化增益图,验证波束是否准确指向目标。
4. 性能评估(蒙特卡洛仿真)
程序进入双重循环:
- 外层循环遍历 SNR 范围。
- 内层循环进行 100 次由于噪声随机性导致的独立实验。
- 误差计算:由于特征分解得到的角度顺序是随机的,程序调用专门的误差匹配函数,遍历所有排列组合,寻找与真实角度偏差最小的对应关系,从而计算均方误差。
- 最后绘制 RMSE vs SNR 的半对数曲线,对比 LS 和 TLS 算法在不同噪声水平下的精度差异。
关键算法函数说明
generate_signal
构建阵列接收模型 $X = A S + N$。
- A (导向矩阵):利用 $e^{-j 2pi d sin(theta)}$ 构建。
- S (信号):生成复高斯随机信号。
- N (噪声):根据用户输入的 SNR 计算噪声功率,生成加性高斯白噪声。
esprit_ls (LS-ESPRIT)
标准最小二乘 ESPRIT 算法实现:
- 计算协方差矩阵并进行特征分解。
- 提取对应最大 $M$ 个特征值的特征向量构成信号子空间 $U_s$。
- 利用旋转不变性构造子阵 $U_1$ (前 $N-1$ 行) 和 $U_2$ (后 $N-1$ 行)。
- 使用左除运算符求解 $U_1 Psi = U_2$ 中的旋转矩阵 $Psi$ (相当于 $(U_1^H U_1)^{-1} U_1^H U_2$)。
- 对 $Psi$ 进行特征分解,利用其特征值的相位信息反解 DOA。
esprit_tls (TLS-ESPRIT)
总体最小二乘 ESPRIT 算法实现:
- 同样提取信号子空间并构造子阵 $U_1, U_2$。
- 构造复合矩阵 $C_{xy} = [U_1, U_2]$ 并对其进行 SVD 分解。
- 利用 $C_{xy}$ 的右奇异矩阵 $V$ 的右下角块(对应较小奇异值的部分)来求解旋转矩阵 $Psi = -V_{12} V_{22}^{-1}$。这种方法考虑了 $U_1$ 和 $U_2$ 两侧的误差,通常在高信噪比下表现更稳健。
calc_min_error
解决多信源估计中的“次序模糊”问题。该函数生成估计结果的所有全排列,分别计算与真实角度向量的欧氏距离,取最小值作为本次实验的误差依据,确保 RMSE 计算的准确性。