当前位置: 首页 > news >正文

DOA估计算法——ESPRIT算法

1 简介

        ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)最早是由Roy等人于1986年提出,是一种广泛应用于高分辨率方向到达(DOA)估计和频率估计的子空间方法。其核心思想基于信号子空间的旋转不变性,能够通过有限的快拍数据实现对信号参数的高精度估计。与经典的MUSIC算法相比,ESPRIT不依赖于复杂的空间谱搜索过程,而是通过结构化的阵列设计(如双阵列或具有重复结构的阵列)直接解算信号的参数,具有较低的计算复杂度。由于在参数估计等方面的优越性,ESPRIT算法近年来得到了广泛应用,并出现了许多变化算法,如LS-ESPRIT算法、TLS-ESPRIT算法、SVD-ESPRIT算法、多重不变ESPRIT算法;波束空间ESPRIT算法和酉ESPRIT算法等。

        ESPRIT算法的主要优势在于其对阵列结构要求相对较低,同时能够在较小样本数和较高噪声条件下保持优良的性能。这使得其在雷达、声纳、通信、天文观测等领域得到了广泛应用。此外,由于其求解过程中采用了特征值分解和最小二乘方法,ESPRIT具有良好的稳健性和解析能力,为多信号处理提供了可靠的工具。随着对信号处理需求的不断提高,ESPRIT算法的研究和扩展也在持续进行,例如推广到二维或三维DOA估计、结合稀疏优化技术以提升分辨能力,以及适应动态场景的实时处理等。这些进展进一步拓宽了ESPRIT算法的应用范围,增强了其实际价值。

图1 图1 子阵分解示意图

2 ESPRIT算法原理

      如图1所示的具有N个阵元的均匀线阵。假设通过该线阵在一定观测时长接收到的阵列数据为X,则其无偏估计的协方差矩阵可以表示为:

其中L表示快拍数。对协方差矩阵进行特征分解将其分解为噪声子空间Un可信号子空间Us :

其中分别表示信号子空间和噪声子空间对应的特征值对角矩阵。根据阵列信号模型与矩阵分解理论,具有两个重要的引理: 

  1. 信号子空间与导向矢量张成的子空间属于同一个子空间,即span{Us}=span{A }.
  2. 信号子空间与噪声子空间正交,即.

值得一提的是,MUSIC算法正是基于信号子空间与噪声子空间正交的特性推导的,关于MUSIC算法的讲解我将另外一篇文章中讲解。现在我们知道UsA属于同一个子空间,基于该引理,Roy首先假设存在一个唯一的满秩矩阵T,使得下式成立:

紧接着他又将一个含有N个阵元的线性阵列拆解为两个子阵(如图1所示),其中子阵1有前N-1个阵元组成,子阵2由后N-1个阵元组成。于是分别得到子阵1和子阵2的信号子空间ExEy,它们满足下式关系: 

紧接着他又将一个含有N个阵元的线性阵列拆解为两个子阵(如图1所示),其中子阵1有前N-1个阵元组成,子阵2由后N-1个阵元组成。于是分别得到子阵1和子阵2的信号子空间ExEy,它们满足下式关系:

Ey=E   (4)

其中是信号相位变化矩阵,与待估计参数相关。式(4)正是利用了旋转不变的特性,因此结合(3)、(4)可以得到:

      (5)

根据式(5)进一步可可得

 (6)

其中。至此可知,ExEy张成相似的子空间,且矩阵Φ的对角线元素为Ψ的特征值。

总结:关于ESPRIT算法,它的实际过程归结于求解式(6)中的Ψ,显然这个问题可以等价于求解方程AX=B的问题,求解该问题可以通过LS、TLS、SLS等方法求解,然后根据ESPRIT思想,旋转因子ΦΨ相似,并根据矩阵相似的理论,故它们有相同的特征值,因此通过特征值可以估计DOA。

3 算法仿真

      根据第2部分中原理,我们知道求解ESPRIT算法归结为欠定方程求解问题,因此在本demo案例中使用TLS(总体最小二乘)进行求解,当然读者如何感兴趣,可以使用LS、SLS等其它一些方法进行求解,值得注意的是,每种方法各有优缺点:以下是TLS-ESPRIT算法求解步骤:

Step1 :根据阵列接收的矩阵X求协方差矩阵R.

Step2 :对协方差矩阵进行特征分解,取K个最大特征值对应的特征向量构成信号子空间,并分为Ex

Ey两部分。

Step3 : 计算下式的特征值分解:

并分解成K×K的子矩阵

Step4 :计算的特征值

Step5 : 计算到达角估计值

3.1 仿真代码示例

仿真环境:Matalb2021b,Windows11

阵元数量:M=16

目标来波方向:40°,10°,20°的非相干信号源

信号的中心频率为:f = 77GHz,信号能量幅度默认为1。

信噪比:SNR=15dB

 快拍数:N = 1024

%%  Author:Poulen
%%  Data:2024/12/15
%%  TLS-ESPRIT算法仿真
%%  总体最小二乘ESPRIT算法,考虑到信号子空间存在估计误差的问题,利用总体最小二乘法来求解ESPRIT方程
clear 
close all;
clc;%产生信号
%仿真初始值设定
M=16;         %阵元单元
c=3e8;       %光速
f0=77e9;     %初始频率
lambda=c/f0; %波长
slope=30e12; %调频斜率
time=60e-6;  %60us
d=0:lambda/2:(M-1)*lambda/2;%阵列天线
thita=[-40];%波达方向
K = length(thita);%产生原始信号
N=1024;%信号长度
t=linspace(0,time,N);A=zeros(M,K);%导向向量空间 M*K
S=zeros(K,N);%信号空间% St = exp(1j*2*pi*(f0*t(:)+1/2*slope*t(:).^2));
f = 100+f0; %非相干信号的频率
for i = 1:KA(:,i) = exp(-1j*2*pi/lambda*d(:)*sind(thita(i)));
%     S(i,:) = St;S(i,:) = exp(1j*2*pi*f*t(:));f = 10000+f;
end
S = A*S; %产生阵列接收数据%向数据添加白噪声
SNR = 30; %单位dB
S = S +(randn(size(S)).*std(S))/db2mag(SNR);%TLS-ESPRIT算法
%step1:计算阵列输出的协方差矩阵
%step2: 对改进协方差矩阵进行特征分解,求解信号子空间Us
%step3: 划分信号子空间为两个子阵对应的子空间,Esx、Esy
%step4: 合并子阵1和子阵2的信号子空间,并求P=Usxy'*Usxy
%step5: 对P进行特征分解,并将2K*2K的特征矩阵E进行分块,分成K*K矩阵,即E = [E11 E12;E21 E22];
%step5: 根据F=-E12 * inv(E22),并对F特征分解求取特征值
%step6: 根据特征值,估计DOA%协方差估计
R = (1/N)*S*conj(S.');%重构协方差矩阵
[V,D] = eig(R);   %对于实数来说已经从小到大排列,复数则随机排列%重新排列特征值大小(按照实部)
EVA = real(diag(D)');  
[EVA,I] = sort(EVA);
V=V(:,I);Us = V(:,(end-K+1):end);%信号子空间Usx = Us(1:end-1,:);
Usy = Us(2:end,:);
% Uxy = [Usx Usy];%对Uxy' * Uxy 进行特征分解
% Exy1 = Uxy' * Uxy;Exy =  [Usx Usy]'*[Usx Usy];[E,~] = eig(Exy);E11 = E(1:K,1:K);
E12 = E(1:K,K+1:2*K);
E21 = E(K+1:2*K,1:K);
E22 = E(K+1:2*K,K+1:2*K);F = -E12 * (inv(E22)) ;
F_eig = eig(F);%DOA估计
DOAEs = asind(-angle(F_eig)/pi);
disp(sort(DOAEs));figure;
theta=deg2rad(DOAEs); %转化为弧度值
polarplot(theta,8,'Marker','^','MarkerSize',6,'Color',[1 0 0],'LineWidth',1.2);
%设置极坐标属性
ax = gca;
ax.ThetaLim = [-60 60];
ax.ThetaDir = 'clockwise';
ax.ThetaZeroLocation = 'top';
ax.RLim = [0 10];
ax.RGrid = 'on' ;
Targetnum = length(DOAEs);
title(['共搜寻出 ' num2str(Targetnum) ' 个目标 ']);

3.2 仿真结果

图2 TLS-ESPRIT仿真结果

TLS-ESPRIT仿真结果如图2所示。ELSPRIT算法优点与局限:

优点:
  • 无需谱峰搜索:相比MUSIC,计算复杂度更低。
  • 参数估计精度高:尤其在高信噪比条件下表现突出。
  • 易于扩展:可推广到二维DOA、多频率估计等场景。
局限:
  • 阵列设计依赖性:需要特殊阵列结构(如平移冗余阵列)。
  • 性能受阵元间距影响:信号间较高相干性可能导致性能下降。

4 总结 

      本期给各位读者细致的分享了ESPRIT算法原理以及仿真实现的过程,如果对你有帮助或喜欢博主的记得点赞加关注,你的支持是博主最大的动力!最后,如有笔误之处欢迎指出。

相关文章:

DOA估计算法——ESPRIT算法

1 简介 ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)最早是由Roy等人于1986年提出,是一种广泛应用于高分辨率方向到达(DOA)估计和频率估计的子空间方法。其核心思想基于信号子空间的…...

CEF 数据加密与网络安全

随着网络攻击的日益猖獗,确保应用的安全性已经成为开发者的首要任务。特别是在现代Web应用中,如何确保数据的加密存储、网络通信的安全性以及有效的认证机制成为至关重要的问题。对于基于 Chromium Embedded Framework (CEF) 的应用,开发者必…...

go build command

文章目录 1.简介2.格式3.选项4.示例5.小结参考文献 1.简介 go build 是 Go 语言工具链中的一个命令,它用于编译 Go 源代码并生成可执行文件。 2.格式 go build [-o output] [build flags] [packages]可选的 -o 选项强制 build 将生成的可执行文件或对象写入指定的…...

理解音频采样率和transformer模型:给Python小白的简单解释

理解音频采样率和transformer模型:给Python小白的简单解释 引言什么是采样率?举个例子有趣的现象Python小实验总结 引言 大家好!今天我们来聊一个有趣的话题:音频采样率和AI模型。不要被这些专业术语吓到,我会用最简单…...

【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...

大模型qiming面试内容整理-系统设计与架构

在大模型和机器学习相关岗位的面试中,系统设计与架构的考察通常会涉及如何设计一个可扩展、可靠且高效的机器学习系统,特别是在面对大规模数据和复杂模型时。这一部分的考察不仅测试候选人对机器学习和深度学习的理解,还会评估其如何设计实际生产环境中的系统来满足需求。以…...

Mac/Windows端长期破解myBase8方法(无需安装火绒)

提醒 不管哪个端,都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100,即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.,显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件,删除Fir…...

firewall

firewall 如果系统使用 firewalld 作为防火墙管理工具,可以使用以下命令: 查看防火墙是否运行: systemctl status firewalld查看防火墙的状态(简洁输出): firewall-cmd --state输出示例: r…...

XSS(跨站攻击)

XSS漏洞(跨站脚本) 1.XSS 漏洞简介 ​ XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从…...

Tomcat添加各种响应头 X-Download-Options、Permissions-Policy等

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 最近部署的项目被绿盟扫出来很多web漏洞,其中tomcat响应占了很大一部分。下面我们整理一下如何处理。 首先说说常见…...

搭建Tomcat(一)---SocketServerSocket

目录 引入1 引入2--socket 流程 Socket(应用程序之间的通讯保障) 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1:ServerSocket和Socket有什么关系? ServerSocket Soc…...

ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小

ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小 文章目录 ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小1. 安装 Times New Roman 字体验证字体是否安装成功 2. 在 Matplotlib 中加载 Times New Roman 字体3. 在 Matplotlib 中使…...

openGauss开源数据库实战二十三

文章目录 任务二十三 openGauss 参数管理任务目标实施步骤一、启动参数文件及参数类型1.参数值修改后必须重新启动数据库的参数2.参数值修改后只需要reload操作的参数 二、设置数据库级参数三、设置用户级参数四、设置会话级参数五、将参数设置为默认值 任务二十三 openGauss 参…...

MySQL 复合查询(重点)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 MySQL 复合查询(重点) 收录于专栏[MySQL] 本专栏旨在分享学习MySQL的一点学习笔记,欢迎大家在评论区交流讨论💌 …...

ASP.NET |日常开发中连接Oracle数据库详解

ASP.NET |日常开发中连接Oracle数据库详解 前言一、安装和配置 Oracle 数据访问组件1.1 安装ODP.NET(Oracle Data Provider for.NET):1.2 引用相关程序集: 二、配置连接字符串2.1 连接字符串的基本组成部分&#xff1a…...

java_连接数据库的方法_后端处理_前端调用_打通整体思路

参考:14 尚上优选项目-平台管理端-权限管理模块-开发角色管理接口(上)_哔哩哔哩_bilibili 第一步. 定义数据 在数据库中定义好数据(如role表格),在java后端定义好对应的实体类(Role类&#xf…...

网络安全知识点

第一章 网络安全概述 1.2.1 网络安全概念P4 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。 1.2.3 网络安全的种类P5 (1…...

pyfink1.20版本下实现消费kafka中数据并实时计算

1、环境 JDK版本:1.8.0_412python版本:3.10.6apache-flink版本:1.20.0flink版本:1.20kafka版本:kafka_2.12-3.1.1flink-sql-connector-kafka版本:3.3.0-1.202、执行python-flink脚本 从kafka的demo获取消…...

国产Tomcat东方通(TongWeb):Linux系统部署全攻略

国产Tomcat东方通(TongWeb):Linux系统部署全攻略 国产tomcat东方通tongweb在linux系统上部署全流程 [这里是图片001] 项目地址: https://gitcode.com/Resource-Bundle-Collection/fca68 项目介绍 在当前的软件开发和运维环境中&#xff0c…...

bilstm -crf 的torch官方的教程 不支持 batchsize 。。。。有更效率更高的方案吗

根据您的需求,您正在寻找一个支持批量处理(batch size)的BiLSTM-CRF模型的PyTorch教程。以下是一些资源,它们提供了更高效的解决方案,包括批量处理的支持: 1. **a-PyTorch-Tutorial-to-Sequence-Labeling*…...

大话软工笔记—需求分析概述

需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...