root MUSIC 算法补充说明

2024-02-17 09:12
文章标签 算法 说明 补充 music

本文主要是介绍root MUSIC 算法补充说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


  这篇笔记是上一篇关于 root MUSIC 笔记的补充。

多项式求根

  要理解 root MUSIC 算法,需要理解多项式求根的相关知识。给定多项式 P ( x ) P(x) P(x)
P ( x ) = a 0 + a 1 x + ⋯ + a n x n P(x) = a_0 + a_1 x + \cdots + a_n x^n P(x)=a0+a1x++anxn
容易看出 P ( x ) P(x) P(x) 中只有一个未知数 x x x,且未知数的最高次数为 n n n,因此称 P ( x ) P(x) P(x) 为一元 n n n 次多项式,同时系数 { a i ∈ C : i = 0 , ⋯ , n } \{a_i\in\mathbb{C}:i = 0,\cdots, n\} {aiC:i=0,,n}。而多项式求根就是求得一元 n n n 次方程式 P ( x ) = 0 P(x)=0 P(x)=0 的解,这个解被称作根或者零点。
  在进行后续的讨论前,还需要清楚,根据代数基本定理, n n n 次复系数多项式方程在复数域内有且只有 n n n 个根(这里的重根按重数计算)。

root MUSIC 算法原理

  root MUSIC 算法是 MUSIC 算法的一种多项式求根形式。回忆一下,传统 MUSIC 算法利用了噪声子空间矩阵 U n \mathbf{U}_n Un 和搜索方向矢量 a ( θ ) \mathbf{a}(\theta) a(θ) 来构造空间谱:
P ( θ ) = 1 a H ( θ ) U n U n H a ( θ ) a ( θ ) = [ 1 , e − j 2 π d sin ⁡ θ / λ , ⋯ , e − j 2 π ( M − 1 ) d sin ⁡ θ / λ ] T P(\theta) = \frac{1}{\mathbf{a}^H(\theta)\mathbf{U}_n\mathbf{U}^H_n\mathbf{a}(\theta)} \\ \mathbf{a}(\theta) = \left[1,e^{-\mathrm{j}2\pi d \sin \theta/\lambda},\cdots,e^{-\mathrm{j}2\pi(M-1) d \sin \theta/\lambda}\right]^T P(θ)=aH(θ)UnUnHa(θ)1a(θ)=[1,ej2πdsinθ/λ,,ej2π(M1)dsinθ/λ]T
{ θ = θ k : k = 1 , ⋯ , K } \{\theta = \theta_k:k = 1,\cdots,K\} {θ=θk:k=1,,K} P ( θ ) P(\theta) P(θ) 将产生峰值,换句话说此时 P − 1 ( θ ) = 0 P^{-1}(\theta)=0 P1(θ)=0
  在接下来的讨论中,我们令 P − 1 ( θ ) = a H ( θ ) G a ( θ ) P^{-1}(\theta) = \mathbf{a}^H(\theta)\mathbf{G}\mathbf{a}(\theta) P1(θ)=aH(θ)Ga(θ),此时我们可以知道,MUSIC 算法满足 G ≜ U n U n H \mathbf{G} \triangleq \mathbf{U}_n\mathbf{U}^H_n GUnUnH,而 Capon 算法满足 G ≜ R − 1 \mathbf{G} \triangleq \mathbf{R}^{-1} GR1。需要注意的是无论是 MUSIC 算法还是 Capon 算法, G \mathbf{G} G 均是 Hermitian 矩阵。
  令 ω = − 2 π d sin ⁡ θ / λ \omega = -2\pi d \sin\theta/\lambda ω=2πdsinθ/λ 以及 z = e j ω z = e^{\mathrm{j}\omega} z=ejω,我们将会得到:
a ( z ) = [ 1 , z , z 2 , ⋯ , z M − 1 ] T = a ( θ ) P − 1 ( z ) = a H ( z ) G a ( z ) = P − 1 ( θ ) \begin{aligned} \mathbf{a}(z) &= [1,z,z^{2},\cdots,z^{M-1}]^T = \mathbf{a}(\theta) \\ P^{-1}(z) &= \mathbf{a}^H(z)\mathbf{G}\mathbf{a}(z) = P^{-1}(\theta) \end{aligned} a(z)P1(z)=[1,z,z2,,zM1]T=a(θ)=aH(z)Ga(z)=P1(θ)
接下来我们展开 P − 1 ( z ) P^{-1}(z) P1(z)
P − 1 ( z ) = a H ( z ) G a ( z ) = [ 1 , z ∗ , ( z ∗ ) 2 , ⋯ , ( z ∗ ) M − 1 ] G [ 1 , z , z 2 , ⋯ , z M − 1 ] T = [ 1 , z − 1 , z − 2 , ⋯ , z − M + 1 ] G [ 1 , z , z 2 , ⋯ , z M − 1 ] T = ∑ m = 0 M − 1 ∑ n = 0 M − 1 z − m G [ m , n ] z n = ∑ m = 0 M − 1 ∑ n = 0 M − 1 z n − m G [ m , n ] = ∑ p = − M + 1 M − 1 a p z − p \begin{aligned} P^{-1}(z) &= \mathbf{a}^H(z)\mathbf{G}\mathbf{a}(z) \\ &= [1,z^{*},(z^{*})^2,\cdots,(z^*)^{M-1}] \mathbf{G} [1,z,z^{2},\cdots,z^{M-1}]^T \\ &= [1,z^{-1},z^{-2},\cdots,z^{-M+1}] \mathbf{G} [1,z,z^{2},\cdots,z^{M-1}]^T \\ &= \sum_{m = 0}^{M-1} \sum_{n=0}^{M-1} z^{-m} \mathbf{G}_{[m,n]} z^{n} \\ &= \sum_{m = 0}^{M-1} \sum_{n=0}^{M-1} z^{n-m} \mathbf{G}_{[m,n]} \\ &=\sum_{p=-M+1}^{M-1}a_p z^{-p} \end{aligned} P1(z)=aH(z)Ga(z)=[1,z,(z)2,,(z)M1]G[1,z,z2,,zM1]T=[1,z1,z2,,zM+1]G[1,z,z2,,zM1]T=m=0M1n=0M1zmG[m,n]zn=m=0M1n=0M1znmG[m,n]=p=M+1M1apzp
其中 G [ m , n ] \mathbf{G}_{[m,n]} G[m,n] 表示矩阵 G \mathbf{G} G 的第 m m m 行第 n n n 列元素, a p a_p ap 表示矩阵 G \mathbf{G} G 的第 p p p 条对角线的求和:
a p ≜ ∑ m − n = p G [ m , n ] a_p \triangleq \sum_{m-n = p} \mathbf{G}_{[m,n]} apmn=pG[m,n]
  到这里我们已经可以看出,传统 MUSIC 算法对 P ( θ ) P(\theta) P(θ) 求峰值,其实等价于对 P − 1 ( z ) P^{-1}(z) P1(z) 求根,为了方便大家的理解,我们令 M = 3 M=3 M=3,此时会得到一条简单的式子:
P − 1 ( z ) = a 2 z − 2 + a 1 z − 1 + a 0 z 0 + a − 1 z 1 + a − 2 z 2 P^{-1}(z) = a_{2}z^{-2}+a_{1}z^{-1} + a_{0}z^{0} + a_{-1}z^{1} + a_{-2}z^{2} P1(z)=a2z2+a1z1+a0z0+a1z1+a2z2
可以看出,其实 P − 1 ( θ ) P^{-1}(\theta) P1(θ) 是一个 2 M − 1 = 5 2M-1 = 5 2M1=5 项的多项式,但还存在一个问题, P − 1 ( θ ) P^{-1}(\theta) P1(θ) 中存在负整数次数,我们令 P − 1 ( z ) z M − 1 P^{-1}(z)z^{M-1} P1(z)zM1 将负整数次数消除即可,操作前后,求根的结果是一样的,因此我们可以说 P − 1 ( z ) z M − 1 P^{-1}(z)z^{M-1} P1(z)zM1 是一个一元的 2 M − 1 2M-1 2M1 项的 2 M − 2 2M-2 2M2 次的多项式。更进一步地,我们可以说求解 P − 1 ( z ) z M − 1 = 0 P^{-1}(z)z^{M-1}=0 P1(z)zM1=0 将会得到 2 M − 2 2M-2 2M2 个根,从已知条件我们知道,其中 K K K 个根必定是 e j ω k e^{\mathrm{j}\omega_k} ejωk e j ω k e^{\mathrm{j}\omega_k} ejωk 的幅值是 1 1 1,因此该 K K K 点在单位圆上),在这里 ω k = − 2 π d sin ⁡ θ k / λ \omega_k = -2\pi d \sin\theta_k/\lambda ωk=2πdsinθk/λ
  总结一下,MUSIC 算法的谱峰搜索操作等价于对方程式 P − 1 ( z ) z M − 1 = 0 P^{-1}(z)z^{M-1}=0 P1(z)zM1=0 求根,root MUSIC 算法所做的,就是利用 G \mathbf{G} G 的多条对角线求和得到对应的多项式系数,从而求解得 2 M − 2 2M-2 2M2 个根,接着筛选得到合适的 K K K 个根 z k z_k zk,再通过 z k z_k zk 推导得到原先的 θ k \theta_k θk

如何从 2 M − 2 2M-2 2M2 个根中确定 K K K 个根

  那么如何从 2 M − 2 2M-2 2M2 个根中确定 K K K 个根?这个问题大部分的论文和博客都一笔带过了。从前面的讨论可知,多项式系数是由 G \mathbf{G} G 的多条对角线求和得到,同时 G \mathbf{G} G 是 Hermitian 矩阵,因此以下式子可以得到:
a p = a − p ∗ a_p = a_{-p}^* ap=ap
这个等式意味着在 2 M − 1 2M-1 2M1 个系数 { a p : p = − M + 1 , ⋯ , M − 1 } \{a_p:p=-M+1,\cdots,M-1\} {ap:p=M+1,,M1} 中,前 M − 1 M-1 M1 个和后 M − 1 M-1 M1 个系数是前后共轭对称,同时正中间的系数是实数。
  我们继续假设 M = 3 M=3 M=3 P − 1 ( z ) = 0 P^{-1}(z)=0 P1(z)=0 可以进一步表示如下:
P − 1 ( z ) = a 2 z − 2 + a 1 z − 1 + a 0 + a 1 ∗ z 1 + a 2 ∗ z 2 = 0 P^{-1}(z) = a_{2}z^{-2}+a_{1}z^{-1} + a_{0} + a_{1}^*z^{1} + a_{2}^*z^{2}=0 P1(z)=a2z2+a1z1+a0+a1z1+a2z2=0
  如此我们分析 P − 1 ( 1 / z ∗ ) P^{-1}(1/z^*) P1(1/z),可得:
P − 1 ( 1 / z ∗ ) = a 2 ( z ∗ ) 2 + a 1 ( z ∗ ) 1 + a 0 + a 1 ∗ ( z ∗ ) − 1 + a 2 ∗ ( z ∗ ) − 2 = [ P − 1 ( z ) ] ∗ = P − 1 ( z ) = 0 \begin{aligned} P^{-1}(1/z^*) &= a_{2}(z^*)^{2}+a_{1}(z^*)^{1} + a_{0} + a_{1}^*(z^*)^{-1} + a_{2}^*(z^*)^{-2} \\ &=[P^{-1}(z)]^* = P^{-1}(z) = 0 \end{aligned} P1(1/z)=a2(z)2+a1(z)1+a0+a1(z)1+a2(z)2=[P1(z)]=P1(z)=0
这意味着假若 z 1 = ρ e j φ z_1 = \rho e^{\mathrm{j}\varphi} z1=ρejφ P − 1 ( z ) = 0 P^{-1}(z)=0 P1(z)=0 的根,那么 z 2 = 1 / z 1 ∗ = 1 / ρ e j φ z_2 = 1/z_1^* = 1/\rho e^{\mathrm{j}\varphi} z2=1/z1=1/ρejφ 同样是 P − 1 ( z ) = 0 P^{-1}(z)=0 P1(z)=0 的根。观察 z 1 z_1 z1 z 2 z_2 z2 在复平面的位置,将会观察得到 z 1 z_1 z1 z 2 z_2 z2 是关于单位圆有一个类似对称的关系;简单来说,这个现象是因为 z 1 z_1 z1 z 2 z_2 z2 是幅值互为倒数而相位相等的关系,因此它们就像是关于 e j φ e^{\mathrm{j}\varphi} ejφ 对称一样( e j φ e^{\mathrm{j}\varphi} ejφ 的幅值是 1 1 1,因此该点在单位圆上)。
  综上所述,通过 P − 1 ( z ) P^{-1}(z) P1(z) 得到 2 M − 2 2M-2 2M2 个根,它们是关于单位圆对称的 M − 1 M-1 M1 对根,因此一定有 K K K 对根在单位圆附近,所以我们只需要从 2 M − 2 2M-2 2M2 个根中找 M − 1 M-1 M1 个处于单位圆内的根(找 M − 1 M-1 M1 个处于单位圆外的根同样是可以的,因为角度信息其实只存在于 z k z_k zk 的相位中,与幅值无关),最后确定最接近单位圆的 K K K 个根就可以确定 z k z_k zk

从复数域上观察 2 M − 2 2M-2 2M2 个根的分布

  我们从实验中进一步观察 2 M − 2 2M-2 2M2 个根的分布,matlab 代码实现如下:

clear; close all; clc;%% Parameters
lambda     = 3e8/1e9;         % wavelength, c/f
d          = lambda/4;        % distance between sensors
theta      = [10,20];         % true DoAs, 1 times K vector
theta      = sort(theta);
M          = 16;              % # of sensors
T          = 500;             % # of snapshots
K          = length(theta);   % # of signals
noise_flag = 1;
SNR        = 0;               % signal-to-noise ratio%% Signals
S = exp(1j*2*pi*randn(K,T)); % signal matrix
A = exp(-1j*(0:M-1)'*2*pi*d/lambda*sind(theta)); % steering vector matrix
N = noise_flag.*sqrt(10.^(-SNR/10))*(1/sqrt(2))*(randn(M,T)+1j*randn(M,T)); % noise matrix
X = A*S+N; % received matrix
R = X*X'/T; % covariance matrix%% DoA:root-MUSIC
[U,~] = svd(R); % SVD
Un = U(:, K+1:end); % noise subspace matrix
Gn = Un*Un';
coe = arrayfun(@(i) sum(diag(Gn, M-i)),(1:2*M-1));
r = roots(coe); % 2M-2 roots%% plot
dis = sort(abs(r)-1);
disp(dis);
cnt = sum(dis<0);
disp(cnt); % 记录单位圆内的根个数% 提取实部和虚部
realPart = real(r);
imaginaryPart = imag(r);% 绘制复平面
figure;
scatter(realPart, imaginaryPart, 'filled');
hold on;% 绘制单位圆
theta = linspace(0, 2*pi, 100);
unitCircleReal = cos(theta);
unitCircleImag = sin(theta);
plot(unitCircleReal, unitCircleImag, 'r--', 'LineWidth', 1);xlabel('实部');
ylabel('虚部');
title('复平面上的复数点和单位圆');
grid on;
box on;%% find K roots
r = r(abs(r)<1);
[~, idx] = sort(abs(abs(r)-1));
z = angle(r(idx));
theta = sort(asin(-z(1:K)/2/pi/d*lambda)/pi*180).';

  设 M = 16 M=16 M=16 K = 2 K=2 K=2,根的分布如下图所示,可以看到 2 M − 2 = 30 2M-2 = 30 2M2=30 个根,其中 2 K = 4 2K=4 2K=4 个接近单位圆的根对应着估计角度:
复平面上的复数点和单位圆

这篇关于root MUSIC 算法补充说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717328

相关文章

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

在Dockerfile中copy和add的区别及说明

《在Dockerfile中copy和add的区别及说明》COPY和ADD都是Dockerfile中用于文件复制的命令,但COPY仅用于本地文件或目录的复制,不支持自动解压缩;而ADD除了复制本地文件或... 目录在dockerfile中,copy 和 add有什么区别?COPY 命令ADD 命令总结在Doc

解读Pandas和Polars的区别及说明

《解读Pandas和Polars的区别及说明》Pandas和Polars是Python中用于数据处理的两个库,Pandas适用于中小规模数据的快速原型开发和复杂数据操作,而Polars则专注于高效数据... 目录Pandas vs Polars 对比表使用场景对比Pandas 的使用场景Polars 的使用