root-MUSIC 算法是 MUSIC 算法的一种多项式求根形式,其基本思想是 Pisarenko 分解。相比于 MUSIC 算法,root-MUSIC 算法无须谱峰搜索,降低了复杂度。
由前面可知,ULA 的方向矢量 a ( θ ) \mathbf{a}(\theta) a(θ) 如下:
a ( θ ) = [ exp ( − j 2 π d 1 sin θ / λ ) ⋮ exp ( − j 2 π d m sin θ / λ ) ⋮ exp ( − j 2 π d M sin θ / λ ) ] \begin{equation*} \mathbf{a}(\mathbf{\theta}) = \begin{bmatrix} \exp(-j2\pi d_1\sin\theta/\lambda) \\ \vdots \\ \exp(-j2\pi d_m\sin\theta/\lambda) \\ \vdots \\ \exp(-j2\pi d_M\sin\theta/\lambda) \end{bmatrix} \end{equation*} a(θ)= exp(−j2πd1sinθ/λ)⋮exp(−j2πdmsinθ/λ)⋮exp(−j2πdMsinθ/λ)
根据 d m = ( m − 1 ) d d_m = (m-1)d dm=(m−1)d,此时令 ω = − 2 π d sin θ / λ \omega = -2\pi d \sin\theta/\lambda ω=−2πdsinθ/λ,则有:
a ( ω ) = [ 1 exp ( j ω ) ⋮ exp [ j ( M − 1 ) ω ] ] \begin{equation*} \mathbf{a}(\mathbf{\omega}) = \begin{bmatrix} 1 \\ \exp(j\omega) \\ \vdots \\ \exp\left[j(M-1)\omega\right] \end{bmatrix} \end{equation*} a(ω)= 1exp(jω)⋮exp[j(M−1)ω]
令 z = e j ω z = e^{j\omega} z=ejω,则有:
p ( z ) = [ 1 , z , ⋯ , z M − 1 ] T \begin{equation*} \mathbf{p}(z) = [1, z, \cdots, z^{M-1}]^T \end{equation*} p(z)=[1,z,⋯,zM−1]T
而根据 a ( θ ) H u i = 0 , i = K + 1 , ⋯ , M \mathbf{a}(\theta)^H\mathbf{u}_i = 0, i = K+1, \cdots, M a(θ)Hui=0,i=K+1,⋯,M,可以得到:
p i ( z ) = u i H p ( z ) = 0 , i = K + 1 , ⋯ , M \begin{equation*} p_i(z) = \mathbf{u}_i^H\mathbf{p}(z) = 0, i = K+1, \cdots, M \end{equation*} pi(z)=uiHp(z)=0,i=K+1,⋯,M
综合以上,可得到:
f ( z ) = p H ( z ) U N U N H p ( z ) \begin{equation*} f(z) = \mathbf{p}^H(z)\mathbf{U}_N\mathbf{U}_N^H \mathbf{p}(z) \end{equation*} f(z)=pH(z)UNUNHp(z)
求得 f ( z ) f(z) f(z) 的根即可得到估计角的信息。然而,上式并不是 z z z 的多项式,因为它还包含了 z ∗ z^* z∗ 的幂次项。由于我们只对单位圆上的 z z z 值感兴趣,所以可以用 p T ( z − 1 ) \mathbf{p}^{T}(z^{-1}) pT(z−1) 代替 p H ( z ) \mathbf{p}^{H}(z) pH(z),这就给出了求根 MUSIC 的多项式:
f ( z ) = z M − 1 p T ( z − 1 ) U N U N H p ( z ) \begin{equation*} f(z) = z^{M-1}\mathbf{p}^{T}(z^{-1})\mathbf{U}_N\mathbf{U}_N^H \mathbf{p}(z) \end{equation*} f(z)=zM−1pT(z−1)UNUNHp(z)
令 G N = U N U N H \mathbf{G}_N = \mathbf{U}_N\mathbf{U}_N^H GN=UNUNH,则有:
z M − 1 p T ( z − 1 ) G N = [ g [ 1 , 1 ] z M − 1 + ⋯ + g [ M − 1 , 1 ] z + g [ M , 1 ] ⋮ g [ 1 , M ] z M − 1 + ⋯ + g [ M − 1 , M ] z + g [ M , M ] ] T \begin{equation*} z^{M-1}\mathbf{p}^{T}(z^{-1})\mathbf{G}_N = \begin{bmatrix} g_{[1,1]}z^{M-1} + \cdots + g_{[M-1,1]} z + g_{[M,1]} \\ \vdots \\ g_{[1,M]}z^{M-1} + \cdots + g_{[M-1,M]} z + g_{[M,M]} \end{bmatrix}^T \end{equation*} zM−1pT(z−1)GN= g[1,1]zM−1+⋯+g[M−1,1]z+g[M,1]⋮g[1,M]zM−1+⋯+g[M−1,M]z+g[M,M] T
其中 g [ i , j ] g_{[i,j]} g[i,j] 表示矩阵 G N \mathbf{G}_N GN 的第 ( i , j ) (i,j) (i,j) 元素。此时易得:
f ( z ) = g [ 1 , 1 ] z M − 1 + g [ 2 , 1 ] z M − 2 + ⋯ + g [ M − 1 , 1 ] z + g [ M , 1 ] + g [ 1 , 2 ] z M + g [ 2 , 2 ] z M − 1 + ⋯ + g [ M − 1 , 2 ] z 2 + g [ M , 2 ] z ⋮ + g [ 1 , M ] z 2 M − 2 + g [ 2 , M ] z 2 M − 3 ⋯ + g [ M − 1 , M ] z M + g [ M , M ] z M − 1 \begin{equation*} \begin{aligned} f(z) &= g_{[1,1]}z^{M-1} + g_{[2,1]}z^{M-2} + \cdots + g_{[M-1,1]} z + g_{[M,1]} \\ &+ g_{[1,2]}z^{M} + g_{[2,2]}z^{M-1} + \cdots + g_{[M-1,2]} z^2 + g_{[M,2]} z \\ &\qquad \vdots \\ &+ g_{[1,M]}z^{2M-2} + g_{[2,M]}z^{2M-3}\cdots + g_{[M-1,M]} z^{M} + g_{[M,M]}z^{M-1} \end{aligned} \end{equation*} f(z)=g[1,1]zM−1+g[2,1]zM−2+⋯+g[M−1,1]z+g[M,1]+g[1,2]zM+g[2,2]zM−1+⋯+g[M−1,2]z2+g[M,2]z⋮+g[1,M]z2M−2+g[2,M]z2M−3⋯+g[M−1,M]zM+g[M,M]zM−1
由此可以看出 f ( z ) f(z) f(z) 中的阶数为 2 M − 2 2M-2 2M−2,因此存在 M − 1 M-1 M−1 对根,且每对根是相互共轭的关系。在理想情况下有 K K K 个根 z 1 , ⋯ , z K z_1, \cdots, z_K z1,⋯,zK 分布在单位圆上,因此在现实情况中只需要求得上式的 K K K 个接近于单位圆上的根即可。对于 ULA,有:
θ i = arcsin ( − λ 2 π d arg { z i } ) , i = 1 , ⋯ , K \begin{equation*} \theta_i = \arcsin\left(-\frac{\lambda}{2\pi d} \arg \{ z_i \} \right), i = 1, \cdots, K \end{equation*} θi=arcsin(−2πdλarg{zi}),i=1,⋯,K
在 matlab 代码实现中,需要利用前面步骤求解得到噪声子空间 U N \mathbf{U}_N UN 来构造 G N \mathbf{G}_N GN,然后通过 G N \mathbf{G}_N GN 中的元素来得到多项式 f ( x ) f(x) f(x) 的系数,最后利用 roots 函数对多项式求根,部分代码实现如下:
Gn = Un*Un';
% 提取多项式系数并对多项式求根
coe = zeros(1, 2*M-1);
for i = -(M-1):(M-1)
coe(-i+M) = sum(diag(Gn,i));
end
r = roots(coe); % 利用roots函数求多项式的根
补充说明:root-MUSIC 算法与谱搜索方式的 MUSIC 算法原理是一样的,只不过是用关于 z z z 的矢量来代替导向矢量,从而用求根过程代替搜索过程。
root-MUSIC 算法步骤如下(输入为阵列接收矩阵 X \mathbf{X} X):
% root_music.m
clear;
clc;
close all;
%% 参数设定
c = 3e8; % 光速
fc = 500e6; % 载波频率
lambda = c/fc; % 波长
d = lambda/2; % 阵元间距,可设 2*d = lambda
twpi = 2.0*pi; % 2pi
derad = pi/180; % 角度转弧度
theta = [-20, 30]*derad; % 待估计角度
idx = 0:1:7; idx = idx'; % 阵元位置索引
M = length(idx); % 阵元数
K = length(theta); % 信源数
T = 512; % 快拍数
SNR = 0; % 信噪比
%% 信号模型建立
S = randn(K,T) + 1j*randn(K,T); % 复信号矩阵S,维度为K*T
% A = exp(-1j*twpi*d*idx*sin(theta)/lambda); % 方向矢量矩阵A,维度为M*K
A = exp(-1j*pi*idx*sin(theta)); % 2d = lambda,直接忽略不写
X = A*S; % 接收矩阵X,维度为M*T
X = awgn(X,SNR,'measured'); % 添加噪声
%% root-MUSIC 算法
% 计算协方差矩阵
R = X*X'/T;
% 特征值分解并取得噪声子空间
[U,D] = eig(R); % 特征值分解
[D,I] = sort(diag(D)); % 将特征值排序从小到大
U = fliplr(U(:, I)); % 对应特征矢量排序,fliplr 之后,较大特征值对应的特征矢量在前面
Un = U(:, K+1:M); % 噪声子空间
Gn = Un*Un';
% 提取多项式系数并对多项式求根
coe = zeros(1, 2*M-1);
for i = -(M-1):(M-1)
coe(-i+M) = sum(diag(Gn,i));
end
r = roots(coe); % 利用roots函数求多项式的根
r = r(abs(r)<1); % 找出在单位圆里的根
[lamda,I] = sort(abs(abs(r)-1)); % 挑选出最接近单位圆的K个根
Theta = r(I(1:K));
Theta = asin(-angle(Theta)/pi)/derad; % 计算信号到达方向角
Theta = sort(Theta).';
disp('估计结果:');
disp(Theta);