基于空间平滑MUSIC算法的相干信号DOA估计(1)

2023-11-06

空间平滑MUSIC算法(1)

1. 前言

在上一篇博客中有提到,当多个入射信号相干时,传统MUSIC算法的效果就会不理想。具体原因是多个入射信号相干时,有部分能量就会散发到噪声子空间,使得MUSIC算法不能对其进行有效估计。
针对这种情况,解相干方法被提出。本文主要讲解通过降维处理解相干,之所以叫降维处理是因为这种方法将原阵列拆分成很多个子阵列,通过子阵列的协方差矩阵重构接收数据协方差矩阵,阵列的自由度DOF会随之降低,即可分辨的相干信号数降低。
先看看传统MUSIC算法对相干信号进行DOA估计的效果。

MATLAB代码

% fss.m
% Code For Music Algorithm
% The Signals Are All Coherent
% Author:痒羊羊
% Date:2020/10/29

clc; clear all; close all;
%% -------------------------initialization-------------------------
f = 500;                                        % frequency
c = 1500;                                       % speed sound
lambda = c/f;                                   % wavelength
d = lambda/2;                                   % array element spacing
M = 20;                                         % number of array elements
N = 100;                                        % number of snapshot
K = 6;                                          % number of sources
coef = [1; exp(1i*pi/6);... 
        exp(1i*pi/3); exp(1i*pi/2);... 
        exp(2i*pi/3); exp(1i*2*pi)];            % coherence coefficient, K*1
doa_phi = [-30, 0, 20, 40, 60, 75];             % direction of arrivals

%% generate signal
dd = (0:M-1)'*d;                                % distance between array elements and reference element
A = exp(-1i*2*pi*dd*sind(doa_phi)/lambda);      % manifold array, M*K
S = sqrt(2)\(randn(1,N)+1i*randn(1,N));         % vector of random signal, 1*N
X = A*(coef*S);                                 % received data without noise, M*N
X = awgn(X,10,'measured');                      % received data with SNR 10dB

%% calculate the covariance matrix of received data and do eigenvalue decomposition
Rxx = X*X'/N;                                   % covariance matrix
[U,V] = eig(Rxx);                               % eigenvalue decomposition
V = diag(V);                                    % vectorize eigenvalue matrix
[V,idx] = sort(V,'descend');                    % sort the eigenvalues in descending order
U = U(:,idx);                                   % reset the eigenvector
P = sum(V);                                     % power of received data
P_cum = cumsum(V);                              % cumsum of V

%% define the noise space
J = find(P_cum/P>=0.95);                        % or the coefficient is 0.9
J = J(1);                                       % number of principal component
Un = U(:,J+1:end);

%% music for doa; seek the peek
theta = -90:0.1:90;                             % steer theta
doa_a = exp(-1i*2*pi*dd*sind(theta)/lambda);    % manifold array for seeking peak
music = abs(diag(1./(doa_a'*(Un*Un')*doa_a)));  % the result of each theta
music = 10*log10(music/max(music));             % normalize the result and convert it to dB

%% plot
figure;
plot(theta, music, 'linewidth', 2);
title('Music Algorithm For Doa', 'fontsize', 16);
xlabel('Theta(°)', 'fontsize', 16);
ylabel('Spatial Spectrum(dB)', 'fontsize', 16);
grid on;

在这里插入图片描述
可以看到,对于相干信号,传统MUSIC算法DOA估计效果很差。

2. 空间平滑算法

降维处理解相干方法主要包括空间平滑类处理算法,而空间平滑类处理算法可以分成前向空间平滑算法(FSS)、后向平滑算法(BSS)、前后向平滑算法(FBSS),正如上面所说,这些算法的估计效果很好,但是损失了阵列孔径,导致可分辨的相干信号数降低。

2.1 线性阵列信号模型

线阵模型
关于这个线性阵列中符号的具体说明可以参考上一篇博文。子空间方法——MUSIC算法

2.2 前向空间平滑算法

前向空间平滑算法将阵列分成多个互相重叠的子阵列,然后对子阵接收数据的协方差矩阵作平均。当子阵阵元数目大于等于相干信号数时,可以有效解相干。
前向空间平滑
如上图所示,我们把M元阵列均匀分成L个子阵列,每个子阵列有N=M-L+1个阵元。以最左边的子阵列为参考阵列,定义第J个子阵的接收数据为:
X J f = [ x J , x J + 1 , ⋯   , x J + N − 1 ] X_{J}^{f}=\left[x_{J}, x_{J+1}, \cdots, x_{J+N-1}\right] XJf=[xJ,xJ+1,,xJ+N1]那么第J个子阵接收数据的协方差矩阵(也称作空间平滑矩阵)可以表示为
R N j j = A 1 D j − 1 R s ( D j − 1 ) H A 1 H + σ 2 I N j = 1 , 2 , ⋯   , L R_{N}^{j j}=A_{1} D^{j-1} R_{s}\left(D^{j-1}\right)^{H} A_{1}^{H}+\sigma^{2} I_{N} \quad j=1,2, \cdots, L RNjj=A1Dj1Rs(Dj1)HA1H+σ2INj=1,2,,L其中, D = diag ⁡ [ e − j − 2 π d λ sin ⁡ θ 1 , e − j 2 π d λ sin ⁡ θ 2 , ⋯ e − j 2 π d λ sin ⁡ θ R ] D=\operatorname{diag}\left[\mathrm{e}^{-j\frac{-2 \pi d}{\lambda} \sin \theta_{1}}, \mathrm{e}^{-j\frac{2 \pi d}{\lambda} \sin \theta_{2}}, \cdots \mathrm{e}^{-j\frac{2 \pi d}{\lambda} \sin \theta_{R}}\right] D=diag[ejλ2πdsinθ1,ejλ2πdsinθ2,ejλ2πdsinθR],A1为第一个子阵即参考阵列的流型矩阵。
因此,前向空间平滑后的协方差矩阵可以由各个子阵的协方差矩阵求平均得到。
R ~ f = 1 L ∑ j = 1 L R N j j \tilde{R}^{f}=\frac{1}{L} \sum_{j=1}^{L} R_{N}^{j j} R~f=L1j=1LRNjj利用前向空间平滑协方差矩阵和MUSIC算法就可以分辨出多个相干信号的方位。可以证明,该方法最大可以检测M/2个相干的信号。

MATLAB代码

% Code For Music Algorithm
% The Signals Are All Coherent
% Author:痒羊羊
% Date:2020/10/29

clc; clear all; close all;
%% -------------------------initialization-------------------------
f = 500;                                        % frequency
c = 1500;                                       % speed sound
lambda = c/f;                                   % wavelength
d = lambda/2;                                   % array element spacing
M = 20;                                         % number of array elements
N = 100;                                        % number of snapshot
K = 6;                                          % number of sources
L = 10;                                         % number of subarray
L_N = M-L+1;                                    % number of array elements in each subarray
coef = [1; exp(1i*pi/6);... 
        exp(1i*pi/3); exp(1i*pi/2);... 
        exp(2i*pi/3); exp(1i*2*pi)];            % coherence coefficient, K*1
doa_phi = [-30, 0, 20, 40, 60, 75];             % direction of arrivals

%% generate signal
dd = (0:M-1)'*d;                                % distance between array elements and reference element
A = exp(-1i*2*pi*dd*sind(doa_phi)/lambda);      % manifold array, M*K
S = sqrt(2)\(randn(1,N)+1i*randn(1,N));         % vector of random signal, 1*N
X = A*(coef*S);                                 % received data without noise, M*N
X = awgn(X,10,'measured');                      % received data with SNR 10dB

%% reconstruct convariance matrix
%% calculate the covariance matrix of received data and do eigenvalue decomposition
Rxx = X*X'/N;                                   % origin covariance matrix
Rf = zeros(L_N, L_N);                           % reconstructed covariance matrix
for i = 1:L
    Rf = Rf+Rxx(i:i+L_N-1,i:i+L_N-1);
end
Rf = Rf/L;
[U,V] = eig(Rf);                                % eigenvalue decomposition
V = diag(V);                                    % vectorize eigenvalue matrix
[V,idx] = sort(V,'descend');                    % sort the eigenvalues in descending order
U = U(:,idx);                                   % reset the eigenvector
P = sum(V);                                     % power of received data
P_cum = cumsum(V);                              % cumsum of V

%% define the noise space
J = find(P_cum/P>=0.95);                        % or the coefficient is 0.9
J = J(1);                                       % number of principal component
Un = U(:,J+1:end);

%% music for doa; seek the peek
dd1 = (0:L_N-1)'*d;
theta = -90:0.1:90;                             % steer theta
doa_a = exp(-1i*2*pi*dd1*sind(theta)/lambda);   % manifold array for seeking peak
music = abs(diag(1./(doa_a'*(Un*Un')*doa_a)));  % the result of each theta
music = 10*log10(music/max(music));             % normalize the result and convert it to dB

%% plot
figure;
plot(theta, music, 'linewidth', 2);
title('Music Algorithm For Doa', 'fontsize', 16);
xlabel('Theta(°)', 'fontsize', 16);
ylabel('Spatial Spectrum(dB)', 'fontsize', 16);
grid on;

前向空间平滑MUSIC
可以看到,在6个入射信号均相干的情况下,基于前向平滑的MUSIC算法能较好地对其进行DOA估计,但仍存在估计精度的问题,比如真实入射角度为75°的信号的方位被估计成了74.2°。
后向空间平滑MUSIC算法和前/后向空间平滑MUSIC算法在下一篇博客中讲解。
基于空间平滑MUSIC算法的相干信号DOA估计(2)

参考论文:《基于空间平滑MUSIC算法的相干信号DOA估计,陈文锋,吴桂清》
代码Code均为原创。
欢迎转载,表明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于空间平滑MUSIC算法的相干信号DOA估计(1) 的相关文章

  • 帮助我理解FFT函数(Matlab)

    1 除了负频率之外 FFT 函数提供的最小频率是多少 是零吗 2 如果它为零 我们如何在对数刻度上绘制零 3 结果总是对称的 或者只是看起来是对称的 4 如果我使用abs fft y 来比较2个信号 我是否会失去一些准确性 1 除了负频率之
  • Matlab:2行10列的子图

    如何在 matlab 中绘制 20 幅图像 2 行 10 列 我知道我必须使用 子图 功能 但我对给出的参数感到困惑 我尝试给予 子图 2 10 行索引 列索引 但它似乎不起作用 请帮忙 的前两个参数subplot函数分别给出图中子图的总行
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • 绘制布朗运动 matlab

    首先 我只想说我不太习惯使用matlab 但我需要一个作业 我应该创建一个 布朗运动 我的代码目前如下所示 clf hold on prompt Ge ett input size input prompt numParticles inp
  • 使用不同的背景颜色保存 MATLAB 图窗

    我想打印一个带有深色背景和白色标签的 MATLAB 图 如果我使用print or saveas命令我不知何故失去了颜色 绘图符号再次变暗 背景变为白色 points rand 100 3 plot3 points 1 points 2 p
  • 霍夫变换检测和删除线

    我想使用霍夫变换检测图像中的线条 但是我不想绘制线条 而是想删除原始图像中检测到的每条线条 image imread image jpg image im2bw image BW edge image canny imshow BW fig
  • 在 MATLAB 图中用值标记点

    以下命令确实用正方形标记了点 但没有在其中放入值 例如 21 0 X 21 8 2 1 0 Y 0 1 2 3 4 plot X Y k s 我应该添加哪个参数以便全部5点值出现在图上吗 这些值不能一一键入 因为它们是随机数 因此它们可能会
  • matlab中优先级队列的实现方法

    matlab中有没有提供minpriorityqueue功能的库 import java util PriorityQueue import java util public class MyQueue Comparator
  • 计算给出数组中最小标准差的子集

    让我们有一个大小的向量N 例如 x rand N 1 我想计算长度子集的最小标准差K在向量中 When N and K很小 很容易找到最好的子集 因为我可以使用nchoosek N K 枚举所有可能的子集 但是当值N and K比我们说的要
  • 如何从 Matlab 运行 R 脚本 [重复]

    这个问题在这里已经有答案了 我有 m 文件 我想用它来运行 R 脚本 我怎样才能做到这一点 Matlab文件 caller m some matlab code need to call a R script some matlab cod
  • 在 MATLAB 中验证输入的最佳实践

    在验证 MATLAB 函数中的输入时 什么时候使用 inputParser 比使用断言更好 或者还有其他更好的工具可用吗 我个人发现使用 inputParser 不必要地复杂 对于 Matlab 始终需要检查 3 项内容 存在 类型和范围
  • 在 Matlab/Java 中将手部运动建模为 3D 曲线

    我只需要一些关于我遇到的问题 在哪里查看等的指导 我在我的一个项目中使用了运动跟踪手套 它返回每个手指和手掌的 X Y 和 Z 值 我想做的是首先根据这些坐标创建每个手指运动的表示 然后将它们每个附加到手掌的运动 以获得手的表示 一旦我完成
  • Python 中 Matlab 'fscanf' 的等价物是什么?

    Matlab函数fscanf 似乎很强大 python 或numpy 中是否有相同的等效项 具体来说 我想从文件中读取矩阵 但我不想迭代每一行来读取矩阵 类似的东西 来自 matlab 用于读取 2D 1000x1000 矩阵 matrix
  • 如何调整x轴和y轴的大小

    如何调整 x 轴和 y 轴的大小 我想要什么 更具体 3900 60 30 0 60 120 180 3600 我做了什么 a 0 0 1 10000 plot a 我应该写什么才能按预期调整 x 和 y 轴的大小 EDIT 我不想 390
  • OpenCV功能类似于matlab的“查找”

    我正在寻找 openCV 中的一个函数来帮助我制作图像蒙版 例如在 MATLAB 中 B A or B 零 大小 A B A 10 c 有些功能可以让你通过mask向他们提出论据 按照您描述的方式创建面具 我认为您正在追求Cmp 或 Cmp
  • MATLAB:MEX 矩阵除法给出的结果与 m 文件不同

    我使用 MATLAB 的编码器工具创建了矩阵指数函数的 MEX 版本 以在另一组函数中使用 问题是 MEX 版本给出的结果与原始 m 文件不同 经过调试 我认为这是因为MEX文件和m文件没有做相同的矩阵除法 或者 MEX 文件首先就有问题
  • 如何在 MATLAB 的 for 循环中读取多个图像?

    我已将结果分段放在一个文件夹中 这些需要在 for 循环中读取并在循环中进一步处理 我尝试阅读如下 for i 1 10 file name dir strcat C Users adminp Desktop dinosaurs im im
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 一次分配多个字段的聪明方法?

    由于遗留函数调用 我有时被迫编写像这样的丑陋的包装器 function return someWrapper someField a someField a b someField b and so on realistically it
  • Matlab-如何在曲线上绘制切线

    我在 matlab 中绘制了一个图表 plot x y 我的图表有不同的斜率 我如何在每个斜率上绘制切线并计算斜率的系数 如果您没有用于绘制点的显式函数 您可以使用有限差分 http en wikipedia org wiki Finite

随机推荐

  • 终极秘密---------windows里藏着9.11的惊天大密码

    终极秘密 windows里藏着9 11的惊天大密码 神秘连锁 密码 泄漏恐怖分子袭美玄机 方法 用WORD 编辑文档输入Q33NY 必须大写 这是9 11撞击世界贸易中心的沙特勇士们乘坐的航班号 第三 将字体大小改到72 最后 将字体转成
  • JS实现简单的购物车

    以下是一个基本的 JS 购物车实现 由于是实现基本的功能 就不弄得多复杂了 代码可以直接Ctrl c v 大家可以试一试 HTML div h2 产品列表 h2 ul li h3 商品1 h3 p 价格 10元 p li ul div
  • SVN 报错:does not support the HTTP/DAV protocol

    原因 我是直接粘贴了上面的网址 而正确做法应该是 点击checkout 复制这个里面的url
  • 图像色彩编码YUV(YCbCr)的基本知识

    参考地址 https www cnblogs com lifan3a articles 4930182 html YUV与YCbCr的定义 YCbCr是DVD 摄像机 数字电视等消费类视频产品中 常用的色彩编码方案 YCbCr 有时会称为
  • No Such Property: Scope For Class: Com.android.build.gradle.internal.variant.ApplicationVariantData

    No Such Property Scope For Class Com android build gradle internal variant ApplicationVariantData 集成360开源的Replugin出现了这个问
  • 软件测试-测试用例的经典例子

    一 等价类划分问 某程序规定 输入三个整数 a b c分别作为三边的边长构成三角形 通过程序判定所构成的三角形的类型 当此三角形为一般三角形 等腰三角形及等边三角形时 分别作计算 用等价类划分方法为该程序进行测试用例设计 三角形问题的复杂之
  • python os模块示例讲解

    os模块包含普遍的操作系统功能 提供了丰富的方法用来处理文件和目录以及一些系统相关的信息的获取 利用这个模块可以写出与平台无关的程序 比如就是使用os sep可以取代操作系统特定的路径分割符 本模块提供一种可移植的方式来使用依赖于操作系统的
  • Ubuntu上安装Boost C++以及Boost.Python的过程和经验

    由于实验的需要 想运行一下这个项目 https github com luckiezhou DynamicTriad 和所有科研相关类的repo一样 要真正用起来还得填很多坑 不得不说 这个repo的作者已经足够认真负责 但是要跑起来还是不
  • C++——const、指针和引用,深度理解

    const修饰符 const修饰符可以定义常量 相比define const修饰的常量的类型更为确定 而不是文本替换 在 C 中 const 也可以修饰对象 且一旦将对象定义为常对象之后 就只能调用类的 const 成员 包括 const
  • 感谢有你

    践行开源共创的精神 FISCO BCOS开源社区致力打造开放多元的开源联盟链生态 目前 社区已汇聚了超70000名社区用户 大家聚集于此碰撞观点 交流技术 围绕FISCO BCOS开发各类实用的应用组件 持续优化项目 并自发输出技术解析 使
  • 网络教育进入新里程碑?斯坦福大学教授创立的免费在线课程教育项目Coursera

    原文地址 http www 36kr com p 201273 html 近两年来 网络教育在国外可谓是非常的热门 无论是课程质量还是其模式都在不断走向成熟 由斯坦福大学两位教授创立的免费在线课程项目Coursera今天宣称 旗下有 5 门
  • request.getScheme() 使用方法

    今天在看代码时 发现程序使用了 request getScheme 不明白是什么意思 查了一下 结果整理如下 1 request getScheme 返回当前链接使用的协议 一般应用返回http SSL返回https 2 在程序中的应用如下
  • 电脑文件误删除恢复的解决办法

    有时候我们常常会头脑发热 把电脑中的一些重要文件不小心删除了 比如一些重要的图片或者文档 甚至还把回收站给清空了 怎么才能将误删除的文件找回来呢 可能大家会马上百度 会看到乱七八糟的找回误删除文件的方法 这些方法无非几种情况 1 软件下载下
  • 电脑ftp服务器信息,电脑上的ftp信息服务器地址

    电脑上的ftp信息服务器地址 内容精选 换一换 通常园区视频功能主要集中在存储和查看 视频分析和态势感知能力较弱 通过使用智能边缘平台与视频分析服务 提升视频分析和感知能力 实现智慧园区人脸识别检测功能 本实践需要使用到视频分析服务的边缘人
  • EXCEL中TEXTJOIN 函数的使用*

    EXCEL中TEXTJOIN 函数的使用 函数说明 textjoin 文本合并函数 函数组成 textjoin 分隔符 忽略空白单元格 字符串1 字符串2 字符串253 示例 需要将需要将左边的表格样式转换成右边的样式 操作步骤 1 将A列
  • Tensorflow2.x模型搭建的几种代码形式

    相信很多新手小白在才开始初学时就想要搭建自己的深度学习模型 但在看到每个风格不同的算法时 又会把前向传播 反向传播 和模型的搭建过程混淆 我总结了一下几种基于Tensorflow2 x搭建模型的代码 1 学习过程中最常见的数据切片 载入并预
  • cpu温度过高 ubuntu_联想拯救者Y7000P温度过高?Fn+Q配合XTU做温度和功耗测试

    Y7000P温度过高 Fn Q配合XTU做温度和功耗测试 国庆节入手Y7000P 机子很稳定 但是打大型游戏温度动辄90 以上 经常撞到95 温度墙 为了降低游戏中的温度 做了以下测试 Y7000P的i5 9300H功耗墙60W 78W 温
  • ecology9 系统文件常用说明

    这里写目录标题 数据库文件 操作异构系统数据库 白名单文件 日志框架的使用 数据库文件 D WEAVER ecology WEB INF prop weaver properties 操作数据库 public static void mai
  • golang - 函数的使用

    核心化编程 为什么需要函数 代码冗余问题 不利于代码维护 函数可以解决这个问题 函数 函数 为完成某一功能的程序指令 语句 的集合 称为函数 在 Go 中 函数分为 自定义函数 自己写的 系统函数 系统提供的 函数的定义 基本语法 func
  • 基于空间平滑MUSIC算法的相干信号DOA估计(1)

    空间平滑MUSIC算法 1 1 前言 在上一篇博客中有提到 当多个入射信号相干时 传统MUSIC算法的效果就会不理想 具体原因是多个入射信号相干时 有部分能量就会散发到噪声子空间 使得MUSIC算法不能对其进行有效估计 针对这种情况 解相干