MUSIC 与 ESPRIT 算法对比:阵列信号DOA估计的两种经典方法(含MATLAB代码)

一、引言

在现代雷达、无线通信、声学定位等领域中,阵列信号处理扮演着至关重要的角色。其中,来波方向估计(Direction of Arrival, DOA) 问题是核心任务之一。通过估计信号源的入射角度,系统可以实现目标定位、波束形成、干扰抑制等关键功能。

传统的波束形成方法(如 Capon、CBF)在分辨率和稳健性上存在一定局限。为突破这一瓶颈,研究者提出了基于子空间分解的高分辨率 DOA 估计算法,其中最具代表性的就是 MUSIC(Multiple Signal Classification)ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)

  • MUSIC 算法 通过利用信号子空间与噪声子空间的正交性,构造空间谱函数,从而在真实来向角处获得清晰的谱峰,具有极高的分辨率。
  • ESPRIT 算法 则依赖于阵列的旋转不变特性,通过特征值分解直接估计来向角,避免了谱峰搜索,计算效率更高。

二、阵列信号接收模型

在讨论 MUSIC 与 ESPRIT 之前,我们首先需要明确 阵列接收模型。本文以均匀线阵(Uniform Linear Array, ULA)为例,建立其数学描述。

2.1 阵列接收信号模型

假设阵列共有 MMM 个阵元,阵元间距为 ddd,有 PPP 个窄带平面波从方向 {θ1,θ2,…,θP}\{\theta_1, \theta_2, \dots, \theta_P\}{θ1,θ2,,θP} 入射,接收信号可表示为:

x(t)=A(θ)s(t)+n(t) \mathbf{x}(t) = \mathbf{A}(\theta)\mathbf{s}(t) + \mathbf{n}(t) x(t)=A(θ)s(t)+n(t)

其中:

  • x(t)∈CM×1\mathbf{x}(t) \in \mathbb{C}^{M\times 1}x(t)CM×1:阵列接收信号向量
  • A(θ)=[a(θ1),a(θ2),…,a(θP)]\mathbf{A}(\theta) = [\mathbf{a}(\theta_1), \mathbf{a}(\theta_2), \dots, \mathbf{a}(\theta_P)]A(θ)=[a(θ1),a(θ2),,a(θP)]:阵列流形矩阵
  • s(t)∈CP×1\mathbf{s}(t) \in \mathbb{C}^{P\times 1}s(t)CP×1:入射信号向量
  • n(t)∈CM×1\mathbf{n}(t) \in \mathbb{C}^{M\times 1}n(t)CM×1:加性白噪声向量

2.2 阵列流形向量

对于均匀线阵(ULA),阵列流形向量为:

a(θ)=[1e−j2πdλsin⁡θe−j2πdλ2sin⁡θ⋮e−j2πdλ(M−1)sin⁡θ] \mathbf{a}(\theta) = \begin{bmatrix} 1 \\ e^{-j \frac{2\pi d}{\lambda}\sin\theta} \\ e^{-j \frac{2\pi d}{\lambda}2\sin\theta} \\ \vdots \\ e^{-j \frac{2\pi d}{\lambda}(M-1)\sin\theta} \end{bmatrix} a(θ)= 1ejλ2πdsinθejλ2πd2sinθejλ2πd(M1)sinθ

其中 λ=c/f0\lambda = c/f_0λ=c/f0 为载波波长。

2.3 协方差矩阵

在快拍数为 LLL 的情况下,阵列接收信号的协方差矩阵可表示为:

Rx=E[x(t)xH(t)]=A(θ)RsAH(θ)+σn2IM \mathbf{R}_x = E[\mathbf{x}(t)\mathbf{x}^H(t)] = \mathbf{A}(\theta)\mathbf{R}_s \mathbf{A}^H(\theta) + \sigma_n^2\mathbf{I}_M Rx=E[x(t)xH(t)]=A(θ)RsAH(θ)+σn2IM

其中:

  • Rs=E[s(t)sH(t)]\mathbf{R}_s = E[\mathbf{s}(t)\mathbf{s}^H(t)]Rs=E[s(t)sH(t)] 为信号协方差矩阵
  • σn2\sigma_n^2σn2 为噪声方差
  • IM\mathbf{I}_MIMMMM 阶单位阵

在实际仿真中,通常通过样本协方差来估计:

R^x=1L∑t=1Lx(t)xH(t) \hat{\mathbf{R}}_x = \frac{1}{L}\sum_{t=1}^L \mathbf{x}(t)\mathbf{x}^H(t) R^x=L1t=1Lx(t)xH(t)

三、MUSIC 算法原理

3.1 基本思想

MUSIC(Multiple Signal Classification,多重信号分类)是基于子空间分解的高分辨率 DOA 估计算法。其核心思想是:

  • 信号协方差矩阵 Rx\mathbf{R}_xRx 可通过特征分解分为 信号子空间噪声子空间
  • 当扫描方向角 θ\thetaθ 等于真实来向角时,阵列流形向量 a(θ)\mathbf{a}(\theta)a(θ) 落在信号子空间内,因此与噪声子空间正交:
    aH(θ)Un≈0 \mathbf{a}^H(\theta) \mathbf{U}_n \approx 0 aH(θ)Un0
  • 基于这一正交性,可以构造空间谱函数,利用谱峰位置估计 DOA。

3.2 数学公式

设协方差矩阵特征分解为:

Rx=UsΛsUsH  +  UnΛnUnH \mathbf{R}_x = \mathbf{U}_s \mathbf{\Lambda}_s \mathbf{U}_s^H \;+\; \mathbf{U}_n \mathbf{\Lambda}_n \mathbf{U}_n^H Rx=UsΛsUsH+UnΛnUnH

其中:

  • Us∈CM×P\mathbf{U}_s \in \mathbb{C}^{M \times P}UsCM×P:信号子空间
  • Un∈CM×(M−P)\mathbf{U}_n \in \mathbb{C}^{M \times (M-P)}UnCM×(MP):噪声子空间

MUSIC 空间谱定义为:

PMUSIC(θ)=1aH(θ)UnUnHa(θ) P_{MUSIC}(\theta) = \frac{1}{\mathbf{a}^H(\theta)\mathbf{U}_n\mathbf{U}_n^H\mathbf{a}(\theta)} PMUSIC(θ)=aH(θ)UnUnHa(θ)1

在真实来向角 θk\theta_kθk 处,分母最小,从而在谱函数中出现峰值。

3.3 算法流程

  1. 计算样本协方差矩阵 R^x\hat{\mathbf{R}}_xR^x
  2. R^x\hat{\mathbf{R}}_xR^x 进行特征分解,得到信号子空间与噪声子空间。
  3. 构造 MUSIC 空间谱 PMUSIC(θ)P_{MUSIC}(\theta)PMUSIC(θ)
  4. 在扫描角度网格中搜索谱峰,获得 DOA 估计。

四、ESPRIT 算法原理

4.1 基本思想

ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques,旋转不变子空间法)是一种经典的高分辨率 DOA 估计算法。与 MUSIC 依赖谱峰搜索不同,ESPRIT 通过 阵列结构的旋转不变性(Shift-Invariance) 直接估计信号来向角,因而具有计算效率高、无需扫描的优势。

对于均匀线阵(ULA),如果将其划分为两个高度相关的子阵列,则信号子空间在这两个子阵之间存在如下关系:

Us2=Us1Φ \mathbf{U}_{s2} = \mathbf{U}_{s1} \mathbf{\Phi} Us2=Us1Φ

其中:

  • Us1,Us2\mathbf{U}_{s1}, \mathbf{U}_{s2}Us1,Us2 分别为信号子空间在两个子阵中的投影
  • Φ\mathbf{\Phi}Φ 为一个对角矩阵,其特征值与来向角直接相关

4.2 数学公式推导

Φ\mathbf{\Phi}Φ 做特征分解:

ψk=e−j2πdλsin⁡θk \psi_k = e^{-j \frac{2\pi d}{\lambda} \sin\theta_k} ψk=ejλ2πdsinθk

由此可得 DOA 估计公式:

θk=arcsin⁡ ⁣(−λ2πdarg⁡(ψk)) \theta_k = \arcsin\!\left(-\frac{\lambda}{2\pi d}\arg(\psi_k)\right) θk=arcsin(2πdλarg(ψk))

ESPRIT 主要有两种实现方式:

  • LS-ESPRIT(最小二乘)
    ΦLS=(Us1†)Us2 \mathbf{\Phi}_{LS} = (\mathbf{U}_{s1}^\dagger)\mathbf{U}_{s2} ΦLS=(Us1)Us2

  • TLS-ESPRIT(总最小二乘)
    通过对 [Us1,Us2][\mathbf{U}_{s1}, \mathbf{U}_{s2}][Us1,Us2] 做奇异值分解 (SVD),得到更加稳健的估计。

4.3 算法流程

  1. 构造两个相邻子阵的接收数据 X1,X2X_1, X_2X1,X2
  2. 通过 SVD 提取信号子空间 Us\mathbf{U}_sUs
  3. 拆分为 Us1,Us2\mathbf{U}_{s1}, \mathbf{U}_{s2}Us1,Us2
  4. 构造旋转矩阵 Φ\mathbf{\Phi}Φ(LS 或 TLS)
  5. ψk\psi_kψk 的相位直接计算 θk\theta_kθk

五、代码

在这里插入图片描述

close all; clear; clc;
rng(2);
%% ---------------- 参数定义 ----------------
c = physconst('LightSpeed'); % 光速
f0 = 10e9; % 载波频率 Hz
fg = 50e9; % 采样率(未显式用到)
BW = 1e8; % 带宽(未显式用到)
src_angle = deg2rad([-10, -20]); % 信源DOA (rad)
M = 32; % 阵元数
L = 128; % 快拍数
snr = 20; % 信噪比 dB
scan_angle = deg2rad(-60:0.1:60); % 扫描角度

%% ---------------- 参数计算 ----------------
lambda = c / f0; % 波长
d = lambda/2; % 阵元间距
P = numel(src_angle); % 信源数

%% ---------------- 回波生成 ----------------
% 阵列流形
i = (0:M-1).';
A = zeros(M,P);

for k = 1:P
A(:,k) = exp(-1j*2*pi*d/lambda*i*sin(src_angle(k)));
end

% 信号矩阵
S = (randn(P,L)+1j*randn(P,L))/sqrt(2);

% 噪声
sig_pow = mean(abs(S(:)).^2);
snr_lin = 10^(snr/10);
noise_pow = sig_pow/snr_lin;
N = sqrt(noise_pow/2)*(randn(M,L)+1j*randn(M,L));

% 接收信号
X = A*S + N;

% 协方差矩阵
Rxx = (X*X')/L;

%% ---------------- MUSIC 算法 ----------------
% 特征分解
[V,D] = eig((Rxx+Rxx')/2);
[~,idx] = sort(diag(D),'descend');
V = V(:,idx);
Un = V(:,P+1:end); % 噪声子空间

% 计算谱函数
P_music = zeros(1,numel(scan_angle));
for g = 1:numel(scan_angle)
a = exp(-1j*2*pi*d/lambda*i*sin(scan_angle(g)));
P_music(g) = 1/(a'*(Un*Un')*a);
end

P_music = abs(P_music)/max(abs(P_music));

%% ---------------- ESPRIT 算法 ----------------
% 子阵划分
X1 = X(1:M-1,:);
X2 = X(2:M,:);
[U,Sv,~] = svd([X1;X2]/sqrt(L),'econ');
Us = U(:,1:P);
Us1 = Us(1:M-1,:);
Us2 = Us(M:end,:);

% LS-ESPRIT
Phi_ls = pinv(Us1)*Us2;
psi_ls = eig(Phi_ls);
doa_ls = asin(-real(angle(psi_ls))*lambda/(2*pi*d)); 
doa_ls_deg = sort(rad2deg(doa_ls));

% TLS-ESPRIT
[~,~,Vt] = svd([Us1,Us2],'econ');
V12 = Vt(1:P,P+1:end);
V22 = Vt(P+1:end,P+1:end);
Phi_tls = -V12/V22;
psi_tls = eig(Phi_tls);
doa_tls = asin(-real(angle(psi_tls))*lambda/(2*pi*d)); 
doa_tls_deg = sort(rad2deg(doa_tls));

%% ---------------- 绘图:MUSIC谱 ----------------
figure('Color','w'); hold on; grid on; box on;
plot(rad2deg(scan_angle), P_music,'b','LineWidth',1.5);
xlabel('扫描角度 (°)'); ylabel('归一化MUSIC空间谱');
title(sprintf('MUSIC vs ESPRIT (M=%d, L=%d, SNR=%ddB)',M,L,snr));

% 标注真实DOA (竖虚线)
for k = 1:P
xline(rad2deg(src_angle(k)),'--k',...
sprintf('真实 %d°',round(rad2deg(src_angle(k)))),...
'LineWidth',1.2);
end

% 标注 ESPRIT-LS 结果 (红色星号)
plot(doa_ls_deg, ones(size(doa_ls_deg)), 'r*', 'MarkerSize',10,...
'DisplayName','ESPRIT-LS');

% 标注 ESPRIT-TLS 结果 (绿色圆点)
plot(doa_tls_deg, ones(size(doa_tls_deg))*0.95, 'go', 'MarkerSize',8,...
'LineWidth',1.5,'DisplayName','ESPRIT-TLS');
legend('MUSIC谱','真实DOA','ESPRIT-LS','ESPRIT-TLS','Location','best');

%% ---------------- 结果打印 ----------------
fprintf('\n=== DOA估计结果 (单位:度) ===\n');
fprintf('真实 DOA : %s\n',num2str(rad2deg(src_angle)));
fprintf('ESPRIT-LS估计 : %s\n',num2str(doa_ls_deg(:).'));
fprintf('ESPRIT-TLS估计: %s\n',num2str(doa_tls_deg(:).'));

六、总结

本文围绕 MUSICESPRIT 两种经典 DOA 估计算法展开了系统介绍与对比。首先,我们从阵列信号接收模型出发,推导了子空间分解与旋转不变性两种基本原理。随后,分别阐述了 MUSIC 的空间谱构造方法以及 ESPRIT 的直接特征值估计方法,并通过 MATLAB 仿真进行了对比实验。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐