【阵列信号处理】DOA估计算法

article/2025/10/6 21:28:53

DOA估计中的ESPRIT算法

ESPRIT算法时一种利用子空间旋转法估计DOA参数的方法,其算法的基本思想是将阵列在结构上分成两个完全一致的子列,两个子列相应阵元偏移的距离相等,也就是说阵列的阵元被分成一对对的形式,而且每一对之间具有相同的平移距离,这样入射角在两个子阵列上仅相差一个旋转不变因子,该因子包含了各个入射信号的波达方向信息,因此通过求解一个广义的特征值,就可以得到入射信号的DOA。该算法与MUSIC算法相比具有以下优点:

*无需精确知道阵列流形向量,仅需要各子阵列之间保持一致,因此降低了对阵列较准的严格性
*不需要在整个空间上进行DOA谱峰搜索从而极大地降低了计算量和存储量

信号建模

从上式我们可以看出两个子列阵列流形之间的关系,将这一关系带入子阵2的接收信号中可以得到下式

ESPRIT算法的关键就在于旋转因子的求解。

主要步骤分为

旋转因子、建立方程
使用特征值分解工具:1)求非零广义特征值; 2)求伪逆; 3)LS-Esprit; 4)TLS-Esprit

LS-Esprit方法步骤

 由阵列数据估计相关矩阵对相关矩阵进行特征值分解用P个大特征值对应的特征矢量构成子空间,并将其分成E_X和E_Y两部分计算矩阵inv(E_X)*E_Y的特征值ξ计算到达角

仿真结果

仿真程序
%LS_ESPRIT ALGORITHM
clear all;
%close all;
clc;
source_number=2;%信元数
sensor_number=8;%原阵元数
sub_sensor_number=7;%子阵元数
N_x=1024; %信号长度
snapshot_number=N_x;%快拍数
w=[pi/4 pi/6].';%信号频率
l=sum(2*pi*3e8./w)/length(source_number);%信号波长  
d=0.5*l;%阵元间距snr=0;%信噪比/dB
source_doa=[-10 60];%两个信号的入射角度
A=[exp(-1j*(0:sensor_number-1)*d*2*pi*sin(source_doa(1)*pi/180)/l);exp(-1j*(0:sensor_number-1)*d*2*pi*sin(source_doa(2)*pi/180)/l)].';%阵列流型s=sqrt(10.^(snr/10))*exp(1j*w*[0:N_x-1]);%仿真信号
%x=A*s+(1/sqrt(2))*(randn(sensor_number,N_x)+1j*randn(sensor_number,N_x));%加了高斯白噪声后的阵列接收信号
x=awgn(A*s,10);
x1=x(1:sub_sensor_number,:);%子阵1接受的数据矢量
x2=x(2:(sub_sensor_number+1),:);%子阵2接受的数据矢量%对两个子阵的模型进行合并
X=[x1;x2];
R=X*X'/snapshot_number;
%对R进行奇异值分解
[U,S,~]=svd(R);
%选择大的特征值构成空间并分成两部分
Us=U(:,1:source_number);
disp(Us);
Us1=Us(1:sub_sensor_number,:);
Us2=Us((sub_sensor_number+1):2*sub_sensor_number,:);
%按照公式得到旋转不变矩阵M
E=pinv(Us1)*Us2;
disp('E');
disp(E);
%对得到的旋转不变矩阵进行特征分解
[V,D]=eig(E);
disp('D');
disp(D);
D=(diag(D)).';
doa=-asin(angle(D)/pi)*180/pi;
doa=sort(doa);
polarplot(doa(1)*pi/180,1,'*',doa(2)*pi/180,1,'square');
grid on;
title('DOA Estimation by LS ESPRIT Algorithm with Monte Carlo');
hold on;
drawnow;

比较简单,从代码中我们可以看出算法中并未涉及阵列流形的计算,所以此方法将适用于阵列流形未知的情况。

TLS-Esprit方法步骤

由阵列数据估计相关矩阵
对相关矩阵进行特征值分解
用P个大特征值对应的特征矢量构成子空间,并将其分成E_X和E_Y两部分
计算矩阵(E_X)’*E_Y的特征向量,并将其分解为PXP的子阵[V_11 V_12; V_21 V_22]
计算V_12*inv(V_22)的特征值
计算到达角

与上述LS-Esprit方法多了几步而已,下面是仿真结果

下面仅给出仿真算法部分
%对两个子阵的模型进行合并
X=[x1;x2];
R=X*X'/snapshot_number;%对R进行奇异值分解
[U,S,~]=svd(R);
Us=U(:,1:source_number);
disp(Us);
Us1=Us(1:sub_sensor_number,:);
Us2=Us((sub_sensor_number+1):2*sub_sensor_number,:);%形成矩阵Us12
Us12=[Us1,Us2];
%对“Us12'*Us12”进行特征分解,得到矩阵F
[F,Sa,Va]=svd(Us12'*Us12);
disp('F');
disp(F);
disp(Sa);
%将F分解为四个小矩阵
F11=F(1:2,1:2);
F12=F(1:2,3:4);
F21=F(3:4,1:2);
F22=F(3:4,3:4);
%按照公式得到旋转不变矩阵E
E=-(F12*(inv(F22)));
disp('E');
disp(E);
%对得到的旋转不变矩阵进行特征分解
[V,D]=eig(E);
disp(D);
D=(diag(D)).';
doa=-asin(angle(D)/pi)*180/pi;
doa=sort(doa);

LS与TLS的Esprit算法对比
针对单一信号源的DOA估计,根据快拍数以及信噪比的不同分别进行1000次蒙特卡洛仿真,后求取估计的RMSE的平均值,实验代码较为简单这里不再给出了,下面直接给出结果。

没太看出来有多大的差别。。。

总结

本文主要实现了基础的EESPRIT算法仿真,包括LS跟TLS,并对两种方法进行了蒙特卡洛仿真,从结果上来看,ESPRIT算法由于不需要角度搜索从而大大提升了算法的运行效率;LS与TLS两者效果差不多,如果后续有些新的理解再来进行修改。
本文未给出一些详细的公式推导,如果后续有时间,将对这一部分进行补充。


http://chatgpt.dhexx.cn/article/urVPeID9.shtml

相关文章

Hector SLAM 原理详解、算法解析

目录 1.原理详解 2.算法解析 1.原理详解 Hector整体算法很直接,就是将激光点与已有的地图“对齐”,即扫描匹配。扫描匹配就是使用当前帧与已经有的地图数据构建误差函数,使用高斯牛顿法得到最优解和偏差量。其工作是实现激光点到栅格地图的转…

MPU 6050姿态角度融合算法

1、介绍 1.1 姿态角(Euler角)pitch yaw roll介绍 飞行器的姿态角并不是指哪个角度,是三个角度的统称。它们是:俯仰、滚转、偏航。你可以想象是飞机围绕XYZ三个轴分别转动形成的夹角。 地面坐标系(earth-surface inert…

linemod算法过程理解

一、提取模板 1、预处理 使用高斯模糊预处理将要作为模板的RGB图 2、模板梯度计算 分别计算RGB三个通道中每个像素点x和y方向的梯度(sobel算子),取幅值最大的作为该像素的梯度,若梯度幅度值小于阈值,则被舍弃 3、梯度离…

MATLAB函数angle、unwrap

一、angle 相位角 语法 P angle(Z)描述 P angle(Z)返回复数数组Z的每个元素的相角(以弧度为单位)。角度介于π之间。对于复数Z,幅值R和相角theta由下式给出 R 绝对值(Z&#xff0…

fbp算法matlab实现,matlab实现fbp算法

matlab提供大量函数,可以方便的完成fbp算法 1)fbp算法原理: 中心切片定理 (CST) : 原数据投影的一维傅立叶变换等于原数据的二维傅立叶变换 投影 --> 一维傅立叶变换 --> 滤波 --> 二维傅立叶反变换 经过上述过程应该得到原始数据 2)投影相关知识 2.1)正投影:对…

一种简单的图形旋转算法

图形旋转好玩又有实用性, 这里介绍一种简单的图形旋转算法. 具体步骤如下: 1. 首先将原图和旋转图的坐标原点都变换到图形的中心位置处. 2. 历遍旋转图形中的每一个pixel, 将pixel的坐标(j,i)反向旋转映射到原图, 得到原图对应的坐标值(Xr,Yr). 3. 考虑到旋转图的尺寸可能大于…

多目标跟踪之数据关联算法——匈牙利算法

零、Track和Detection的cost matrix,distance metric。距离计算的方式有如下几种: 距离cost distance metric,track和detection的距离矩阵。 外观距离appearance distance,来自检测切片ROI的网络特征提取;——余弦距离 运动模型距离 马氏距离,来自检测-跟踪的kalman校正…

EAST算法简单解析

前言 最近写了很多算法代码的解析,但是却很少写原理的解析,这段时间学得快忘得也快,所以寻思这几天写几篇学过算法的原理,可能不是很详细但是一定很简单,利于理解。 算法介绍 EAST: An Efficient and Accurate Scen…

定位算法初探

定位算法初探 一、指纹定位算法介绍 指纹定位(finger-printing localization)算法,是基于室内环境复杂,信号反射折射所形成的在不同位置形成的不同的信号强度信息而提出的一套算法。 指纹算法能很好的利用了反射折射所形成的信号信息,离线首…

使用python模拟实现PID控制算法

使用python模拟实现PID控制算法 PID控制算法是工业应用中最广泛算法之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。 P、I、D分别是“比例(proportional)、积分(integral)、微分&#xff…

TCP Nagle算法简述

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。 (一个连接会设置M…

倒角算法推导

推导原理基本很简单: 已知AB, BC两条线段,且交于B点,求倒角半径为 L,AB,BC的倒角 以最短边(假定为AB)长 LAB, 在BC中,以B为起点,找出与LAB同长度…

[控制算法]

[常用控制算法] 0.博览众长 0.1 视频 1. DR_CAN b站 0.2 文章 1.控制算法整理 0.3 传统 VS 现代控制算法 1. 传统 传统控制算法:PID,模糊,神经网络控制算法。 2. 现代 现代控制算法有比例,LQR算法(用于线性系统)&#x…

求树的直径证明

树的直径(最长路) 的详细证明 主要是利用了反证法: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就…

树的直径和树的重心

1.树包括有根树和无根树,有根树是有向图的子图,无根树是无向图的子图,都满足边数等于节点数减一。根是入度为零或没有父亲的节点 2.树的直径:树上最长的简单路径(不重复经过点的路径) 3.求解算法&#xf…

树的直径总结

树的直径 一、定义 在一棵树中,最远的两个子节点之间的距离被称为树的直径; 链接这两个点的路径被称为树的最长链; 有两种求法,时间复杂度均为 O ( n ) O(n) O(n) ; 二、树形DP 1. 状态 由于一个点的最长路通过…

基础算法 - 树的直径

题目地址:https://leetcode-cn.com/problems/tree-diameter/ 1245. 树的直径 难度中等48收藏分享切换为英文接收动态反馈 给你这棵「无向树」,请你测算并返回它的「直径」:这棵树上最长简单路径的 边数。 我们用一个由所有「边」组成的数…

树的直径-c++

题目 实验室里原先有一台电脑(编号为1),最近氪金带师咕咕东又为实验室购置了N-1台电脑,编号为2到N。每台电脑都用网线连接到一台先前安装的电脑上。但是咕咕东担心网速太慢,他希望知道第i台电脑到其他电脑的最大网线长度,但是可怜…

求树的直径算法以及证明

以下为两次dfs(bfs)的做法以及正确性证明。 算法步骤 (1)任取树上一点S,以S为源点BFS得S到各个顶点的d值; (2)取d值最大者之一为P,再以P为源点BFS得P到各个顶点的d值&am…

求树的直径

树的直径,即树上的最长路径,显然,树的直径可以有很多条(考虑一棵菊花)。 接下来我们考虑如何求出一棵树的直径。有很多种O(n)的算法。 算法1:我们任取树中的一个节点x,找出距离它最远的点y&am…