一.基于压缩感知(CS)的DOA估计方法-OMP-CS算法

news2025/3/14 10:29:18

阅读须知:

1.本文为本人原创作品仅供学习参考,未经过本人同意禁止转载和抄袭。

2.要想无障碍阅读本文需要一定的压缩感知理论以及压缩感知信号重构算法基础。

3.话不多说,直接开搞。

1 基于压缩感知DOA估计方法原理

        假设有K个远场窄带信号入射到有M个天线的均匀线阵上,第k个信号的入射角度为𝜃𝑘。t时刻阵列接收的单快拍数据矢量可以表示为:

上式是经典的阵列接收数据模型,不管是圆阵还是均匀阵(管它什么牛马阵,都是这个表达式,变的只有阵列流行矩阵A)。其中n(t)表示阵列接收噪声。下面精彩的来了,好好看好好学。对阵列流行矩阵A进行扩展,形成完备的冗余字典G,使它包含了所有可能的方位角度,即 :

其中,Q为方位角θk的等网格划分数目。我们可以看到,利用冗余字典式G可以将式(1)转化为稀疏表示的问题,即

 其中,δQ维系数向量。即x基于字典GK-稀疏的。非零元素的位置对应向量的对应角代表了θ的值,非零元素幅值即为信号在采样时刻幅度。观察式(3)可知,x是传感器阵列接收的数据为已知,G为字典矩阵已知,δ是信号的稀疏表示,它是未知的,不为零的元素出现的位置即表征了DOA信息。通过(3)DOA估计转化为了信号重构的问题,因此只需要求解下式的优化问题,即可重构δ,即:

 考虑到噪声的影响,式(4)可以转化为带有不等式约束的优化问题:

综上所述,基于压缩感知DOA估计的方法归根到底就是一个压缩感知信号重构的问题,关(4)或(5)的信号重构问题有很多算法可以解决,比如我们熟知的贪婪类算法——正交匹配追踪算法(OMP)、广义正交匹配算法(GOMP)、子空间追踪算法(SP)等。接下来在本文中,我将使用OMP算法求解。

2 OMP算法原理

        OMP算法是比较早提出的贪婪类算法。贪婪类算法基于最小化𝑙0范数问题进行稀疏信号构。此类算法因其理论简单、计算量小等优点被广泛应用于实际问题中。该类算法首先从感知矩阵中选取合适的原子,然后将选好的原子组成支撑集,最后利用支撑集来估计信号。因此,该类算法主要包括两部分:原子选取和信号估计。OMP算法利用内积匹配准则进行原子识别,选出与信号残差最匹配的一个原子,用其索引更新支撑集,利用最小二乘法估计信号。

算法具体步骤如下所示:

需要注意的是:上图中所说的观测值为x,即阵列接收的数据。感知矩阵为G,即字典矩阵。稀疏信号x即为δ。

另外:如果对OMP算法仍不熟悉的,可以多看看相关文献,这里为了减少文章冗余,不再赘述。

3 实验结果

        设一个单快拍入射信号,接收阵元为16,入射信号数目为2,信号入射角为[-10°,20°],得到的仿真结果如下图所示:

图 1 基于压缩感知DOA估计仿真结果

        为了探究信噪比与稀疏度对算法的影响,我们分别给出不同信噪比和不同稀疏度(对应目标信源数量)实验图如图2所示:

图 2 (a)不同信噪比下仿真结果[-20,-10,20]dB (b)不同稀疏度下仿真结果[1,2,5]

 根据实验结果得到以下结论:

1.基于压缩感知DOA估计精度与信号重构算法相关,从图中可以看出低信噪比情况下利用OMP算法求解信号精度感人,甚至出现错误估算的情况。因此基于OMP算法的压缩感知DOA估计不适用于低信噪比情况,而在高信噪比时,OMP算法估计精度较好。

2.基于压缩感知DOA估计方法与传统的MUSIC、ESPRIT子空间的方法相比,该方法对信源数(这里对应于稀疏度)的正确估计依赖不强,但需要注意只有在信源估计数量大于信源数量时依赖才不强,反之则可能直接丢失信号。

4 OMP-CS Matlab仿真代码

%Author:Poulen
%Data : 2023.6.12
%Algorithm simulation: OMP-CS Algorithm

%该算法是基于(正交匹配追踪算法)OMP压缩感知信号重构算法的DOA估计方法

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=[-10,20];%波达方向
K = length(thita); 

%产生原始信号
N=1;%选取单个信号快拍
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:K
    A(:,i) = exp(-1j*2*pi/lambda*d(:)*sind(thita(i)));
%     S(i,:) = St;
    S(i,:) = exp(1j*2*pi*f*t(:));
    f = 1000+f;
end
S = A*S; %产生阵列接收数据

%向数据添加白噪声
SNR = 30; %单位dB
S = S +(randn(size(S)).*std(S))/db2mag(SNR);

%算法步骤:
%%%%%%%%%%%%%%%%
%step 1: 生成冗余矩阵G,使得信号满足稀疏重建的,包含了DOA方向的所有可能的角
%step 2: 信号重构,关于压缩感知信号重构的方法多种多样,在本次demo中选取了正交匹配追踪算法重构稀疏信号
%%%%%%%%%%%%%%%%

%生成过完备冗余字典矩阵,即感知矩阵,其包含所有可能的DOA

scale = -60:59; %所有可能的角度
G = zeros(M,length(scale)); %感知矩阵
output = zeros(length(scale),1);
for i=1:length(scale)
    G(:,i) = exp(-1j*2*pi/lambda*d(:)*sind(scale(i)));
end

%设置初值
K_Sparse = 5; %稀疏度   注意:该稀疏度可随意更改,这里我直接选用为仿真的信源数
r = S;        %残差
R = [];       %原子集
umax_index = [];
%OPM算法信号重构过程
for t=1:K_Sparse
    u = abs(G' * r); 
    temp=find(u==max(u));
    umax_index = [umax_index,temp];
    R = [R,G(:,temp)];
    x = pinv(R)*S ;
    r = S - R * x;
end
output(umax_index) = x; %重构K-sprase信号

figure;
plot(scale,abs(output),'LineWidth',1.6,'Color',[0 0 0]);
xlabel('AngleRange(°)');
ylabel('Amplitude(dB)');
title('OMP-CS Algorithm');
legend([' K-Sparse = ' num2str(K_Sparse) ' ']);

%基于压缩感知DOA估计方法
%在低信噪比是,DOA估计误差较大
%该方法与传统的MUSIC、ESPRITzi子空间的方法相比,该方法对信源数的正确估计依赖不强,注意:只有在信源估计数量
%大于信源数量时依赖才不强,反之则可能直接丢失信号

结束语

      由于实力有限,文中难免出现不足之处。在后续的文章中,我将会更新一些有关DOA估计的相关方法,提供大家借鉴与学习,还望大家多多支持支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dpdk21.11 编译(meson+ninja)及VFIO模块的加载和运行

目录 前言 安装前的环境配置 编译流程 1. 设置环境变量(好像也不需要了) 2. 构建dpdk 3. 编译 执行测试 1. 绑定vfio-pci 模块 2. 挂载网卡 3. 设置大页 4. 启动测试程序-testpmd 前言 操作系统:ubuntu22.04.2 LTS 内核版本&#…

深入理解 Java ServiceLoader、Dubbo ExtensionLoader 源码结合实战篇

介绍Java SPIDriver 实现类DriverManager 驱动管理器类loadInitialDrivers 方法registerDriver 方法getConnection 方法 ServiceLoader 核心类LazyIterator#hasNextService 方法LazyIterator#nextService 方法 Dubbo SPI加载策略FilterExtensionLoaderExtensionLoader#getExten…

框架篇面试详解

spring AOP AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装成为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码&am…

02-舞动数据类型:Golang 类型定义的奇妙之旅

📃个人主页:个人主页 🔥系列专栏:Golang基础 💬Go(又称Golang)是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性,拥有高效的并发编程能力和简洁的语法。G…

chatgpt赋能python:Python如何建设网页并实现客户端与服务器端的通信

Python如何建设网页并实现客户端与服务器端的通信 介绍 Python是一种流行的编程语言,被广泛应用于Web开发。在Web开发中,Python可以用来建立并联接网页与服务器端的通信。 这篇文章将介绍如何使用Python建立网页,并展示如何实现客户端与服…

Science Advance||个体脑中鲁棒的动态脑网络

文章目录 个体化动态方法(INSCAPE 方法):(A)生成脑共同激活状态的组模板:(B)个体水平分析: 不同的大脑状态有特定的协同激活模式(coactivation patterns&…

IntSet

基本概述 IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。 结构如下: typedef struct intset {uint32_t encoding; /* 编码方式,支持存放16位、32位、64位整数(4字节32比特…

chatgpt赋能python:Python如何并排输入数字

Python如何并排输入数字 Python是一个功能强大的编程语言,可以用于各种用途,包括数据分析、机器学习、Web开发等。对于很多初学者来说,学会如何并排输入数字可能是一个基础的技巧。在本文中,我们将介绍如何使用Python在同一行中输…

RK3588平台开发系列讲解(USB篇)USB 常用调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、USB枚举成功标志二、USB speed查询三、USB 查询PID、VID四、USB 当前 端口组合五、USB 动态打印debug日志六、USB IPC log分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要 介绍 USB 常用调试…

安卓期末考试知识总结(2)

文章目录 第四章:程序活动单元Activity四大组件Activity生命周期Activity的启动模式standardsingleTopsingleInstancesingleTask IntentIntentFilterActivity之间的数据传递putExtra()方法传递数据Bundle类传递数据Activity之间的数据回传 练习总结 第四章&#xff…

Java虚拟机原理

Java是一种跨平台的语言,这意味着Java开发出来的程序经过编译后,可以在Linux上运行,也可以在Windows上运行;可以在PC、服务器上运行,也可以在手机上运行;可以在X86的CPU上运行,也可以在ARM的CPU…

chatgpt赋能python:Python引入Math库的使用方法

Python引入Math库的使用方法 Python作为一门强大的编程语言,有着广泛的应用场景。在计算领域中,Python也有很多优秀的库来进行相应的计算。其中一个广泛使用的库就是Math库。这个库包含了很多数学函数,如三角函数、幂函数、对数函数等等。在…

剑指offer21.调整数组顺序使奇数位于偶数前面

毫无难度。 class Solution {public int[] exchange(int[] nums) {int i 0;int size nums.length;int[] res new int[size];int jsize-1;for(int k 0; k<size;k){if(nums[k]%2 0){res[j]nums[k];j--;}else{res[i]nums[k];i;}}return res;} }

关于 Ceph 存储集群配置的一些笔记

写在前面 Ceph 考试整理笔记&#xff0c;老师总结基础上&#xff0c;略有补充博文内容涉及&#xff1a; ceph 集群的配置简单介绍永久和零时修改集群配置文件集群 Mon 的配置集群身份验证的配置集群多网络的配置 理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有…

Mysql 索引调优

前言 索引是帮助MySQL高效获取数据的数据结构 常用索引 1、普通索引 普通索引是最基本的索引&#xff0c;仅用于加速查询&#xff0c;没有任何限制&#xff1a;可以为空、可以重复 2、唯一索引 唯一索引与普通索引类似&#xff0c;但索引列的值必须唯一 3、主键索引 主…

chatgpt赋能python:Python怎么将界面和程序交互

Python怎么将界面和程序交互 随着互联网技术的不断发展和普及&#xff0c;越来越多的人开始关注于网站的设计和开发。在Web应用程序的开发过程中&#xff0c;与用户进行交互是至关重要的一个方面&#xff0c;而Python作为一种强大的开发语言&#xff0c;可以很好地帮助我们实现…

C++中防止头文件重复包含处理办法

首先给出可以拷贝的模板&#xff1a; #ifndef _ADDNUM_H_ #define _ADDNUM_H_这里加上相应的函数声明即可 #endif在小型项目中&#xff0c;如果将函数的定义写在main函数的后面&#xff0c;那么需要在main函数前面加上这个函数的声明才可以顺利运行成功。 #include <iostr…

python:基础知识—流程控制—函数与模块—数据结构—类与GUI和Turtle—异常处理与文件,概括全书(上万字最详细版)

这里是一张夜景&#xff0c;给大家放松一下。 !&#xff01;无锡南长街 文章目录 模块一&#xff1a;基础知识1、python语言2、常见数字类型3、字符串4、数字类型转换5、标识符命名6、常见关键字7、运算符与表达式&#xff08;1&#xff09;算术运算符&#xff08;2&#xff09…

web自动化框架playwright

参考&#xff1a;新兴爬虫利器 Playwright 的基本用法 | 静觅 (cuiqingcai.com) http://t.csdn.cn/S7260 官方文档&#xff1a;Trace viewer | Playwright 安装 pip3 install playwright playwright install 第一个demo from playwright.sync_api import sync_playwri…

python中的lambda表达式

目录 1.lambda函数的简介 2.为什么要用lambda函数 3.lambda函数的效率 4.lambda函数常用举例 4.1 多参数 4.2 与map函数进行使用 4.3 求两个列表元素的和 5.个人见解 1.lambda函数的简介 lambda函数是一种匿名函数&#xff0c;即没有名字的函数使用lambda保留字定…