部分来自于网络教程,如有侵权请联系本人删除
教程链接:MUSIC算法的直观解释:1,MUSIC算法的背景和基础知识_哔哩哔哩_bilibili
MUSIC算法的直观解释:2,我对于MUSIC算法的理解_哔哩哔哩_bilibili
https://blog.csdn.net/zhangziju/article/details/100730081
一、MUSIC算法作用
MUSIC(Multiple Signal Classification),多重信号分类,是一类空间谱估计算法。其思想是利用接收数据的协方差矩阵(Rx)进行特征分解,分离出信号子空间和噪声子空间,利用信号方向向量与噪声子空间的正交性来构成空间扫描谱,进行全域搜索谱峰,从而实现信号的参数估计。
MUSIC算法通常被用来使用麦克风阵列进行声源定位。
例如当麦克风阵列放在一个房间中,房间中存在一个声源。当声源发声时,阵列会接收到来自目标方向的信号,但是也会接受到不同方向的反射信号。MUSIC算法可以剔除掉其余的反射信号,选出来自目标方向的那个信号,从而得到目标的方向。
声波是机械波,通常利用麦克风阵列接受后转换为电信号进行处理。当信号是电磁波时,例如wifi信号,我们拿天线阵列进行接收,此时仍然可以利用MUSIC算法把不同方向信号的角度计算出来。
二、MUSIC算法原理
MUSIC算法适用于来波为平行波,即目标与麦克风阵列的距离L远大于阵元之间间距d。此时来自目标的信号相对于每个阵元的方位角基本可视为相同。具体如下图所示:
图1
1.时延、相位差和目标方位角关系
假设信号源发射信号为
当信号从声源目标S传播到阵元1时,信号传播了
这样便会导致阵元1接受信号
那么阵元1最终接收信号为:
阵元2相对于阵元1多走了
其中
阵元3相对于阵元1多走了
则阵元3接收信号为:
PS:如果还不好理解因为多走了一段距离导致的相位差怎么计算,可以这样理解(以阵元1和2为例):
假设阵元1接收信号为
因为信号到达阵元2多走了一段距离,那么信号到达阵元2的时间总会相比阵元1延迟
那么阵元2接收信号则为
很明显,
由数字信号处理知识可以知道
那么就可以得到相位差
2.MUSIC算法核心原理(思路来源)
MUSIC算法的最终目的:计算
从以上推导可以知道
那么在理想条件,也就是没有任何的反射和折射,且只有一个声源,这时直接用两阵元接收信号相除
但是实际上会有很多反射折射信号被麦克风阵列所接收,而且声源可能不止一个,此时该怎么办呢?这就是MUSIC算法需要解决的问题。
好,那么我们假设一共有两个声源A,B,发射信号分别为
那么在某时刻t,三个阵元接收信号分别为:
那么某段时间内,麦克风阵列所接收信号为:
对应可以写成:
其中
能不能通过处理
怎么处理呢???
如果能找到三个复数
或用矩阵表示:
把
即:
MUSIC算法在此时进行了一个假设,即假设信号
那么此时上面公式中
上式中系数
那么现在问题就转换为了,如何找到这一组复数
要能找到这一组复数,必须满足:阵元个数 > 声源信号的个数(MUSIC算法的假设条件2)
其实最终就是解:
即
3.MUSIC算法步骤总结
窄带远场信号的DOA数学模型为:
其中X为阵列接收到的信号矩阵,两个维度分别代表:阵元个数(number of array elements)、采样点数(snapshots);A为阵列方向矩阵,两个维度分别代表:阵元个数、信号方向的方向向量;s为信号源发射信号矩阵,两个维度分别代表:信号源个数、采样点数;N为噪声矩阵,两个维度分别为阵元个数、采样点数。
那么阵列接收数据的协方差矩阵为:
由于信号和噪声互相独立,数据协方差矩阵可以分解为信号、噪声相关的两部分,其中Rs是信号的协方差矩阵,ARsA^H是信号部分。
对R进行特征分解有:
式中,Us是由R的所有特征值中较大的(信号源个数)个特征向量组成的子空间,称为信号子空间;Un是由R的所有特征值中娇小的(阵元个数-信号源个数)个特征向量组成的子空间,称为噪声子空间。
根据之前我们所推导的MUSIC算法的条件,要求理想情况下信号子空间和噪声子空间正交,也就是信号子空间中的方向向量a(theta)和噪声子空间正交:
由于噪声的存在,实际上a(theta)和Un并不能完全正交。因此实际上是通过进行最小优化搜索来实现的:
和我们上文所说一样,MUSIC实际上是通过谱峰搜索来求最优解theta:
PS:由于实际中阵列接受数据是有限的,所以通常由协方差矩阵的最大似然估计来代替协方差矩阵:
总结以上算法原理,MUSIC算法的步骤为:
1.根据N个接收信号矢量得到下面协方差矩阵的估计值:
2.对第1步得到的协方差矩阵进行特征分解
3.矩阵
其中D(D=信号源个数)个较大的特征值对应信号,将其对应的特征向量看做信号部分空间。
M-D(M=阵元个数)个较小的特征值对应噪声,将其对应的特征向量看做信号部分空间,得到噪声矩阵
4.使
4.Matlab代码实现
clear all
close all
clc
%----------------均匀线列阵实现MUSIC算法------------------%
ang2rad = pi/180; % 角度转弧度系数
N = 10; % 阵元个数
M = 3; % 信源个数
theta = [-65,0,45]; % 来波方向(角度)
snr = 10; % 信号信噪比dB
K = 512; % 总采样点
delta_d = 0.05; % 阵元间距
f = 2400; % 信号源频率
c = 340; % 声速
d = 0:delta_d:(N-1)*delta_d;
A = exp(-1i*2*pi*(f/c)*d.'*sin(theta*ang2rad)); % 接收信号方向向量
S = randn(M,K); % 阵列接收到来自声源的信号
X = A*S; % 最终接收信号,是带有方向向量的信号
X1 = awgn(X,snr,'measured'); % 在信号中添加高斯噪声
Rx = X1*X1'/K; % 协方差矩阵
[Ev,D] = eig(Rx); % 特征值分解
% [V,D] = eig(A) 返回特征值的对角矩阵 D 和矩阵 V
% 其列是对应的右特征向量,使得 AV = VD
EVA = diag(D)'; % 将特征值提取为1行
[EVA,I] = sort(EVA); % 对特征值排序,从小到大。其中I为index:1,2,...,10
EV = fliplr(Ev(:,I)); % 对应特征矢量排序
En = EV(:,M+1:N); % 取特征向量矩阵的第M+1到N列特征向量组成噪声子空间
% 遍历所有角度,计算空间谱
for i = 1:361
angle(i) = (i-181)/2; % 映射到-90度到90度
theta_m = angle(i)*ang2rad;
a = exp(-1i*2*pi*(f/c)*d*sin(theta_m)).';
p_music(i) = abs(1/(a'*En*En'*a));
end
p_max = max(p_music);
p_music = 10*log10(p_music/p_max); % 归一化处理
figure()
plot(angle,p_music,'b-')
grid on
xlabel('入射角/度')
ylabel('空间谱/dB')
文章出处登录后可见!