2 MUSIC 算法
2.1 算法原理
根据信号模型,可以得到接收信号的协方差矩阵,理想协方差矩阵如下:
R=E{x(t)xH(t)}=AE{s(t)sH(t)}AH+E{n(t)nH(t)}=ARsAH+σ2nIR=E{x(t)xH(t)}=AE{s(t)sH(t)}AH+E{n(t)nH(t)}=ARsAH+σ2nI其中 RsRs 和 σ2nIσ2nI 分别代表信号协方差矩阵和噪声协方差矩阵,σ2nσ2n 为噪声方差, II 为单位矩阵。需要注意到的是,由于信号源之间是独立的,RsRs 是对角非奇异矩阵;RR 是非奇异的,同时 R=RHR=RH,因此 RR 是 Hermitian 矩阵且是正定矩阵。
但因为采样数 TT 有限,理想协方差矩阵无法直接获得,此时通常用样本的协方差矩阵 ˆR^R 来代替:
对 R 进行特征值分解,可得到:
R=UΣUH=M∑i=1λiuiuHi=[UsUn][ΣsOOΣn][UHsUHn]=UsΣsUHs+UnΣnUHn其中 λi 和 ui 分别为特征值和对应的特征向量,O 为全零矩阵,Σ 为由 M 个特征值 λ1,⋯,λM 组成的对角矩阵:
Σ=diag{λ1,⋯,λM}且假设:
λ1>⋯>λK>λK+1=⋯=λM=σ2nΣs 为由 K 个较大特征值 λ1,⋯,λK 组成的对角矩阵, Σn 为由 M−K 个较小特征值 λK+1,⋯,λM 组成的对角矩阵:
Σs=diag{λ1,⋯,λK},Σn=diag{λK+1,⋯,λM}Us 表示由 K 个较大特征值 λ1,⋯,λK 对应的特征矢量张成的信号子空间,Un 表示由 M−K 个较小特征值 λK+1,⋯,λM 对应的特征矢量张成的噪声子空间。注意,U 为酉矩阵。
将 R=ARsAH+σ2nI 左右两边乘以 Un 可得:
同时将 R=UsΣsUHs+UnΣnUHn 左右两边乘以 Un 可得:
RUn=UsΣsUHsUn+UnΣnUHnUn=O+σ2nUn=σ2nUn联立上面两式子可得:
ARsAHUn=O由于 Rs 和 AHA 均满秩,所以均可逆,因此上式两边同时乘以 R−1s(AHA)−1AH 可得:
R−1s(AHA)−1AHARsAHUn=R−1s(AHA)−1AHO化简得:
AHUn=O或者可以写成如下形式:
AHui=0,i=K+1,⋯,M其中 0 为全零向量。上式表明:噪声特征值所对应的特征向量 ui 与方向矢量矩阵 A 的列向量正交,而 A 的各列与信号源的方向相对应的,因此可以利用噪声子空间求解信号源方向。
2.2 算法步骤
MUSIC 算法步骤如下(输入为阵列接收矩阵 X):
- 计算协方差矩阵 R=1TXXH。
- 对 R 进行特征值分解,并对特征值进行排序,然后取得 M−K 个较小特征值对应的特征向量来组成噪声子空间 Un。
以下式遍历 θ∈[−90∘,90∘]:
P(θ)=1aH(θ)UnUHna(θ)此时得到一组 P(θ),K 个最大值对应的 θ 就是需要返回的结果。
2.3 代码实现
% 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'); % 添加噪声 %% 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'; % 空间谱搜索 searchGrids = 0.1; % 搜索间隔 ang = (-90:searchGrids:90)*derad; Pmusic = zeros(1, length(ang)); % 空间谱 for i = 1:length(ang) a = exp(-1j*pi*idx*sin(ang(i))); Pmusic(:, i) = 1/(a'*Gn*a); end % 归一化处理,单位化为 db Pmusic = abs(Pmusic); Pmusic = 10*log10(Pmusic/max(Pmusic)); % 作图 figure; plot(ang/derad, Pmusic, '-', 'LineWidth', 1.5); set(gca, 'XTick',(-90:30:90)); xlabel('\theta(\circ)', 'FontSize', 12, 'FontName', '微软雅黑'); ylabel('空间谱(dB)', 'FontSize', 12, 'FontName', '微软雅黑'); % 找出空间谱Pmusic中的峰值并得到其对应角度 [pks, locs] = findpeaks(Pmusic); % 找极大值 [pks, id] = sort(pks); locs = locs(id(end-K+1:end))-1; Theta = locs*searchGrids - 90; Theta = sort(Theta); disp('估计结果:'); disp(Theta);
2.4 参考内容
- 【博客园】子空间分析方法
- 【博客园】空间谱专题10:MUSIC算法
- 【CSDN】子空间方法——MUSIC算法
- 【CSDN】Traditional Comm笔记【5】:基于MUSIC Algorithm的DoA/AoA估计以及MATLAB实现
- 【知乎】DoA 估计:多重信号分类 MUSIC 算法(附 MATLAB 代码)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com