在学习 MUSIC-like 算法之前需要理解四阶累积量、Kronecker 积和 Khatri-Rao 积,在这里只简单介绍四阶累积量的概念,Kronecker 积和 Khatri-Rao 积的概念需要读者自行查阅资料(如参考内容 1)。
假设接收数据
X
∈
C
M
×
T
\mathbf{X}\in\mathbb{C}^{M\times T}
X∈CM×T 代表的是零均值的复平稳随机信号,那么其二阶矩
μ
2
(
k
1
,
k
2
∗
)
\mu_2(k_1,k_2^*)
μ2(k1,k2∗) 及其估计值
μ
^
2
(
k
1
,
k
2
∗
)
\hat{\mu}_2(k_1,k_2^*)
μ^2(k1,k2∗) 定义如下:
μ
2
(
k
1
,
k
2
∗
)
=
E
{
x
[
k
1
,
t
]
x
[
k
2
,
t
]
∗
}
μ
^
2
(
k
1
,
k
2
∗
)
=
1
T
∑
t
=
1
T
x
[
k
1
,
t
]
x
[
k
2
,
t
]
∗
其中
x
[
k
1
,
t
]
x_{[k_1,t]}
x[k1,t] 表示
X
\mathbf{X}
X 的第
k
1
k_1
k1 行第
t
t
t 个元素。
四阶矩
μ
4
(
k
1
,
k
2
,
l
1
,
l
2
)
\mu_4(k_1,k_2,l_1,l_2)
μ4(k1,k2,l1,l2) 及其估计值
μ
^
4
(
k
1
,
k
2
,
l
1
,
l
2
)
\hat{\mu}_4(k_1,k_2,l_1,l_2)
μ^4(k1,k2,l1,l2) 的定义如下:
μ
4
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
=
E
{
x
[
k
1
,
t
]
x
[
k
2
,
t
]
x
[
l
1
,
t
]
∗
x
[
l
2
,
t
]
∗
}
μ
^
4
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
=
1
T
∑
t
=
1
T
x
[
k
1
,
t
]
x
[
k
2
,
t
]
x
[
l
1
,
t
]
∗
x
[
l
2
,
t
]
∗
四阶累积量
cum
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
\operatorname{cum}(k_1,k_2,l_1^*,l_2^*)
cum(k1,k2,l1∗,l2∗) 定义如下:
cum
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
=
μ
4
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
−
μ
2
(
k
1
,
k
2
)
μ
2
(
l
1
∗
,
l
2
∗
)
−
μ
2
(
k
1
,
l
1
∗
)
μ
2
(
k
2
,
l
2
∗
)
−
μ
2
(
k
1
,
l
2
∗
)
μ
2
(
k
2
,
l
1
∗
)
通常来说
μ
2
(
k
1
,
k
2
∗
)
=
0
\mu_2(k_1,k_2^*) = 0
μ2(k1,k2∗)=0,因此上式可以简化为:
cum
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
=
μ
4
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
−
μ
2
(
k
1
,
l
1
∗
)
μ
2
(
k
2
,
l
2
∗
)
−
μ
2
(
k
1
,
l
2
∗
)
μ
2
(
k
2
,
l
1
∗
)
MUSIC-like 算法在很多论文中也被称作 FOC(Forth Order Cumulant)MUSIC 算法,通常 HOC(Higher Order Cumulant)指的也是四阶累积量;参考内容 3 提出了偶数阶的高阶累积量 MUSIC 算法,称为
2
q
2\rm{q}
2q-MUSIC 算法。
传统的窄带阵列信号处理方法大多是基于二阶统计量(协方差矩阵)提出的。当接收信号为非高斯分布时,可以用基于高阶累积量的方法处理信号,因为高阶累积量对高斯信号不敏感,从而能有效地减小高斯噪声的影响,高阶累积量既可以抑制服从高斯分布的噪声,又可以比二阶统计量包含更多的信息。
MUSIC-like 算法假设将
K
K
K 个信号分成
G
G
G 组,每个组中有
K
g
K_g
Kg 个信号,自然地有
∑
g
=
1
G
K
g
=
K
\sum_{g=1}^G K_g = K
∑g=1GKg=K,而在第
g
g
g 组中,
K
g
K_g
Kg 个信号相互间是相关的(注意信号间是相关的,并非相干)。假若
K
K
K 个信号相互间均独立,则每组中只存在一个信号,即满足
G
=
K
G = K
G=K 和
K
g
=
1
K_g = 1
Kg=1。
在之前的讨论中,我们已经知道信号模型
x
(
t
)
∈
C
M
×
1
\mathbf{x}(t)\in\mathbb{C}^{M\times 1}
x(t)∈CM×1 如下:
x
(
t
)
=
∑
k
=
1
K
a
(
θ
k
)
s
k
(
t
)
+
n
(
t
)
令
a
k
=
a
(
θ
k
)
∈
C
M
×
1
\mathbf{a}_{k} = \mathbf{a}(\theta_k)\in\mathbb{C}^{M\times 1}
ak=a(θk)∈CM×1 和
x
k
(
t
)
=
a
k
s
k
(
t
)
∈
C
M
×
1
\mathbf{x}_k(t) = \mathbf{a}_ks_k(t)\in\mathbb{C}^{M\times 1}
xk(t)=aksk(t)∈CM×1,则可以获得(忽略噪声部分,方便后续推导):
x
(
t
)
=
∑
k
=
1
K
x
k
(
t
)
=
∑
k
=
1
K
a
k
s
k
(
t
)
其矩阵形式为:
X
=
∑
k
=
1
K
X
k
=
∑
k
=
1
K
a
k
s
k
∈
C
M
×
T
其中
s
k
=
[
s
k
(
1
)
,
s
k
(
2
)
,
⋯
,
s
k
(
T
)
]
\mathbf{s}_k = [s_k(1),s_k(2),\cdots,s_k(T)]
sk=[sk(1),sk(2),⋯,sk(T)]。
传统 MUSIC 算法中引入了协方差矩阵
R
\mathbf{R}
R,并将其分解成
R
=
A
R
S
A
\mathbf{R} = \mathbf{A}\mathbf{R}_S\mathbf{A}
R=ARSA 的形式,而协方差矩阵的每一个元素其实就是对应的二阶矩;而 MUSIC-like 算法就是考虑用四阶矩构造四阶累积量矩阵
C
\mathbf{C}
C,该矩阵可以进行类似的分解
C
=
B
C
S
B
\mathbf{C} = \mathbf{B}\mathbf{C}_S\mathbf{B}
C=BCSB,如此就可以进行后续的搜索步骤。接下来令:
C
k
=
E
{
[
x
k
(
t
)
⊗
x
k
∗
(
t
)
]
[
x
k
(
t
)
⊗
x
k
∗
(
t
)
]
H
}
−
E
{
x
k
(
t
)
x
k
H
(
t
)
}
⊗
E
{
[
x
k
(
t
)
x
k
H
(
t
)
]
∗
}
代入
x
k
(
t
)
=
a
k
s
k
(
t
)
\mathbf{x}_k(t) = \mathbf{a}_ks_k(t)
xk(t)=aksk(t) 可得:
C
k
=
E
{
[
a
k
s
k
(
t
)
⊗
a
k
∗
s
k
∗
(
t
)
]
[
a
k
s
k
(
t
)
⊗
a
k
∗
s
k
∗
(
t
)
]
H
}
−
E
{
a
k
s
k
(
t
)
s
k
H
(
t
)
a
k
H
}
⊗
E
{
a
k
∗
s
k
∗
(
t
)
s
k
T
(
t
)
a
k
T
}
=
(
a
k
⊗
a
k
∗
)
(
E
{
s
k
(
t
)
s
k
∗
(
t
)
s
k
(
t
)
s
k
∗
(
t
)
}
−
E
{
s
k
(
t
)
s
k
∗
(
t
)
}
E
{
s
k
(
t
)
s
k
∗
(
t
)
}
)
(
a
k
⊗
a
k
∗
)
H
将其转化为矩阵运算的形式,就可以得到如下式子:
C
k
=
1
T
(
X
k
⊙
X
k
∗
)
(
X
k
⊙
X
k
∗
)
H
−
1
T
2
(
X
k
X
k
∗
)
⊗
(
X
k
X
k
∗
)
∗
=
(
a
k
⊗
a
k
∗
)
[
1
T
(
s
k
⊙
s
k
∗
)
(
s
k
⊙
s
k
∗
)
H
−
1
T
2
(
s
k
s
k
∗
)
⊗
(
s
k
s
k
∗
)
∗
]
(
a
k
⊗
a
k
∗
)
H
令
T
2
c
k
=
T
(
s
k
⊙
s
k
∗
)
(
s
k
⊙
s
k
∗
)
H
−
(
s
k
s
k
∗
)
⊗
(
s
k
s
k
∗
)
∗
T^2c_k = T(\mathbf{s}_k\odot\mathbf{s}_k^*)(\mathbf{s}_k\odot\mathbf{s}_k^*)^H - (\mathbf{s}_k\mathbf{s}_k^*)\otimes(\mathbf{s}_k\mathbf{s}_k^*)^*
T2ck=T(sk⊙sk∗)(sk⊙sk∗)H−(sksk∗)⊗(sksk∗)∗,要注意
c
k
c_k
ck 是一个标量。由上式可以得到完整的四阶累积量矩阵
C
\mathbf{C}
C:
C
=
∑
k
=
1
K
C
k
=
(
A
⊙
A
∗
)
(
c
1
⋱
c
K
)
(
A
⊙
A
∗
)
H
=
B
C
s
B
H
如此我们获得了类似的分解,同时因为
B
=
A
⊙
A
∗
\mathbf{B} = \mathbf{A}\odot\mathbf{A}^*
B=A⊙A∗,则在搜索空间的时候需要将方向矢量
a
(
θ
)
\mathbf{a}(\theta)
a(θ) 更新如下:
a
(
θ
)
≜
b
(
θ
)
=
a
(
θ
)
⊗
a
∗
(
θ
)
现在网上可以找到的很多论文,均认为四阶累积量矩阵的构造如下:
C
=
E
{
(
X
⊗
X
∗
)
(
X
⊗
X
∗
)
H
}
−
E
{
(
X
⊗
X
∗
)
}
E
{
(
X
⊗
X
∗
)
H
}
−
E
{
(
X
X
∗
)
}
E
{
(
X
X
∗
)
H
}
参考内容 4 中给出了一种实现:
C
≜
1
T
(
X
⊗
X
∗
)
(
X
⊗
X
∗
)
H
−
1
T
2
(
X
⊗
X
∗
)
(
X
⊗
X
∗
)
H
−
1
T
2
(
X
X
∗
)
⊗
(
X
X
∗
)
∗
错误的地方很多:
现在我们重新来考量利用四阶累积量
cum
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
\operatorname{cum}(k_1,k_2,l_1^*,l_2^*)
cum(k1,k2,l1∗,l2∗) 来构造四阶累积量矩阵。可以认为传统 MUSIC 算法利用二阶矩
μ
2
(
k
1
,
k
2
∗
)
\mu_2(k_1,k_2^*)
μ2(k1,k2∗) 构造协方差矩阵
R
∈
C
M
×
M
\mathbf{R}\in\mathbb{C}^{M\times M}
R∈CM×M,其中
1
≤
m
,
n
≤
M
1\leq m,n\leq M
1≤m,n≤M;因为
1
≤
k
1
,
k
2
,
l
1
,
l
2
≤
M
1\leq k_1,k_2,l_1,l_2\leq M
1≤k1,k2,l1,l2≤M,所以存在
M
4
M^4
M4 个四阶累积量
cum
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
\operatorname{cum}(k_1,k_2,l_1^*,l_2^*)
cum(k1,k2,l1∗,l2∗),从而组成的四阶累积量矩阵为
C
k
∈
C
M
2
×
M
2
\mathbf{C}_k\in\mathbb{C}^{M^2 \times M^2}
Ck∈CM2×M2。
具体来说,
C
k
\mathbf{C}_k
Ck 的第
(
k
1
−
1
)
×
M
+
l
1
(k_1-1)\times M+l_1
(k1−1)×M+l1 行第
(
l
2
−
1
)
×
M
+
k
2
(l_2-1)\times M+k_2
(l2−1)×M+k2 列元素为
cum
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
\operatorname{cum}(k_1,k_2,l_1^*,l_2^*)
cum(k1,k2,l1∗,l2∗):
[
C
k
]
(
k
1
−
1
)
×
M
+
l
1
,
(
l
2
−
1
)
×
M
+
k
2
=
cum
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
=
μ
4
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
−
μ
2
(
k
1
,
l
1
∗
)
μ
2
(
k
2
,
l
2
∗
)
−
μ
2
(
k
1
,
l
2
∗
)
μ
2
(
k
2
,
l
1
∗
)
我们用符号
E
1234
\mathbf{E}_{1234}
E1234、
E
2
\mathbf{E}_{2}
E2 和
E
3
\mathbf{E}_{3}
E3 分别表示利用
μ
4
(
k
1
,
k
2
,
l
1
∗
,
l
2
∗
)
\mu_4(k_1,k_2,l_1^*,l_2^*)
μ4(k1,k2,l1∗,l2∗)、
μ
2
(
k
1
,
l
1
∗
)
μ
2
(
k
2
,
l
2
∗
)
\mu_2(k_1,l_1^*)\mu_2(k_2,l_2^*)
μ2(k1,l1∗)μ2(k2,l2∗) 和
μ
2
(
k
1
,
l
2
∗
)
μ
2
(
k
2
,
l
1
∗
)
\mu_2(k_1,l_2^*)\mu_2(k_2,l_1^*)
μ2(k1,l2∗)μ2(k2,l1∗) 得到的矩阵分量,即
C
k
≜
E
1234
−
E
2
−
E
3
{\mathbf{C}_k} \triangleq \mathbf{E}_{1234}- \mathbf{E}_{2} - \mathbf{E}_{3}
Ck≜E1234−E2−E3,根据参考内容 4 中的实现,不难看出所做的矩阵运算如下:
E
1234
=
1
T
(
X
⊗
X
∗
)
(
X
⊗
X
∗
)
H
E
2
=
1
T
2
(
X
⊗
X
∗
)
(
X
⊗
X
∗
)
H
E
3
=
1
T
2
(
X
X
∗
)
⊗
(
X
X
∗
)
∗
再次强调该实现是错误的,例如
E
1234
\mathbf{E}_{1234}
E1234 的两个相乘矩阵维度分别为
M
2
×
T
2
M^2\times T^2
M2×T2 和
T
2
×
M
2
T^2\times M^2
T2×M2,因此期间做了
M
4
M^4
M4 个
T
2
T^2
T2 次的逐点相乘,这和原来只需要做
M
4
M^4
M4 个
T
T
T 次的逐点相乘的意图相违背。
在上面的式子中,
E
1234
\mathbf{E}_{1234}
E1234 和
E
2
\mathbf{E}_{2}
E2 的实现是错误的,应该修正如下:
E
1234
=
1
T
(
X
⊙
X
∗
)
(
X
⊙
X
∗
)
H
v
=
mean
(
(
X
⊙
X
∗
)
,
2
)
E
2
=
v
v
H
其中
mean
(
A
,
2
)
\operatorname{mean}(\mathbf{A},2)
mean(A,2) 表示对矩阵
A
\mathbf{A}
A 的逐行进行求均值,即
v
\mathbf{v}
v 为矩阵逐行求均值后得到的列向量。
最后总结一下,逐元素创建
C
k
\mathbf{C}_k
Ck 是可行的,但是要注意索引,而利用矩阵运算构造
C
k
\mathbf{C}_k
Ck 自然也是可行,但是需要注意的是,在 matlab 中对该两种方法进行实现得到的矩阵会有精度上的差别,主要是由浮点数相乘顺序导致的,而四阶累积量的精度问题会导致后续奇异值分解的结果产生较大差异(尽量选择逐元素的方法创建四阶累积量矩阵)。
Q1:为什么根据四阶累积量构造矩阵的时候,索引是
(
k
1
−
1
)
×
M
+
l
1
(k_1-1)\times M+l_1
(k1−1)×M+l1 和
(
l
2
−
1
)
×
M
+
k
2
(l_2-1)\times M+k_2
(l2−1)×M+k2?
A1:注意看
(
X
⊙
X
∗
)
(
X
⊙
X
∗
)
H
=
(
X
⊙
X
∗
)
(
X
∗
⊙
X
)
T
(\mathbf{X}\odot\mathbf{X}^*)(\mathbf{X}\odot\mathbf{X}^*)^H = (\mathbf{X}\odot\mathbf{X}^*)(\mathbf{X}^*\odot\mathbf{X})^T
(X⊙X∗)(X⊙X∗)H=(X⊙X∗)(X∗⊙X)T。
Q2:为什么 7.1.1 中的实现
C
k
=
E
1234
−
E
2
−
E
3
\mathbf{C}_k = \mathbf{E}_{1234} - \mathbf{E}_{2} - \mathbf{E}_{3}
Ck=E1234−E2−E3 和 MUSIC-like 算法原文中
C
k
\mathbf{C}_k
Ck 的实现不同?
A2:MUSIC-like 算法原文(参考内容 2)中
C
k
\mathbf{C}_k
Ck 的实现其实就是
E
1234
−
E
3
\mathbf{E}_{1234} - \mathbf{E}_{3}
E1234−E3。
Q3:有噪声的情况下会有什么不同吗?
A3:结论不会有所不同,即使有噪声,四阶累积量的最终推导都是
C
=
B
C
S
B
\mathbf{C} = \mathbf{B}\mathbf{C}_S\mathbf{B}
C=BCSB 的形式,不带有噪声分量。
Q4:假若
G
≠
K
G\neq K
G=K,结果会有所不同吗?
A4:推导上稍有不同,最重要的不同是,构造噪声子空间时,应该选择
M
2
−
∑
g
=
1
G
K
g
2
M^2 - \sum_{g=1}^G K_g^2
M2−∑g=1GKg2 个小特征值对应的特征向量来构成。
Q5:MUSIC-like 算法的优点是什么?
A5:第一点,扩展阵列,该算法可以估计到
M
2
−
1
M^2-1
M2−1 个信源;第二点,消除噪声的影响,在推导上,服从高斯分布变量的四阶累积量等于
0
0
0,因此理论上来说四阶累积量模型可以消除噪声,但是在单次迭代中无法直接观察到该现象,所以在后续实现中本人并未给数据加上噪声,感兴趣的读者可以将数据加上噪声进行 MUSIC 算法和 MUSIC-like 算法的 RMSE verse SNR 对比。
MUSIC-like 算法步骤如下(输入为阵列接收矩阵 X \mathbf{X} X):
% music_like.m
clear all;
clc;
close all;
%% 参数设定
lambda = 1500; % 波长
d = lambda/2; % 阵元间距,可设 2*d = lambda
twpi = 2.0*pi; % 2pi
derad = pi/180; % 角度转弧度
theta = [-40,-30,0,30,60,70]*derad; % 待估计角度
idx = 0:1:4; idx = idx'; % 阵元位置索引
M = length(idx); % 阵元数
K = length(theta); % 信源数
T = 1000; % 快拍数
SNR = 10; % 信噪比
%% 信号模型建立-四阶累积量模型
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,直接忽略不写
% 四阶累积量矩阵初始化
C4 = zeros(M^2, M^2);
C5 = zeros(M^2, M^2);
% 构造四阶累积量矩阵
for k = 1:K
Ck = A(:,k)*S(k,:);
C4 = C4 + cum41(Ck, T); % 构造四阶累积量矩阵,利用矩阵运算(尽量不要选择该方法构造四阶累积量矩阵)
C5 = C5 + cum42(Ck, M); % 构造四阶累积量矩阵,逐元素构造
end
%% MUSIC-like 算法
% 特征值分解并取得噪声子空间
[U,D] = eig(C5); % 特征值分解
[D,I] = sort(diag(D)); % 将特征值排序从小到大
U = fliplr(U(:, I)); % 对应特征矢量排序,fliplr 之后,较大特征值对应的特征矢量在前面
Un = U(:, K+1:M^2); % 噪声子空间
Gn = Un*Un';
% 空间谱搜索
searchGrids = 0.1; % 搜索间隔
beginAng = -90;
endAng = 90;
ang = (beginAng:searchGrids:endAng)*derad;
Pmusic = zeros(1, length(ang)); % 空间谱
for i = 1:length(ang)
a = exp(-1j*pi*idx*sin(ang(i)));
b = kron(a, conj(a)); % 阵列扩展
Pmusic(:, i) = 1/(b'*Gn*b);
end
% 归一化处理,单位化为 db
Pmusic = abs(Pmusic);
Pmusic = 10*log10(Pmusic/max(Pmusic));
% 作图
figure;
plot(ang/derad, Pmusic, '-', 'LineWidth', 1.5);
set(gca, 'XTick',(beginAng:30:endAng));
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 - endAng;
Theta = sort(Theta);
disp('估计结果:');
disp(Theta);
function C4 = cum41(X, T)
R = X*X'/T;
a = kr(X, conj(X));
b = mean(a,2);
E1234 = (a*a')/T;
E2 = b*b';
E3 = kron(R, conj(R));
C4 = E1234 - E2 - E3;
end
function C4 = cum42(X, M)
C4 = zeros(M^2,M^2);
for m = 1:M
for n = 1:M
for k = 1:M
for l = 1:M
left = (m-1)*M+k;
right = (l-1)*M+n;
c1 = X(m,:);
c2 = X(n,:);
c3 = conj(X(k,:));
c4 = conj(X(l,:));
C4(left, right) = cum4(c1,c2,c3,c4);
end
end
end
end
end
function c4_ele = cum4(m,n,k,l)
E1234 = 1*mean(m.*n.*k.*l);
E1 = 0*mean(m.*n)*mean(k.*l); % 通常认为该项为 0
E2 = 1*mean(m.*k)*mean(n.*l);
E3 = 1*mean(m.*l)*mean(n.*k);
c4_ele = E1234 - E1 -E2 -E3;
end
function X = kr(U,varargin)
%KR Khatri-Rao product.
% kr(A,B) returns the Khatri-Rao product of two matrices A and B, of
% dimensions I-by-K and J-by-K respectively. The result is an I*J-by-K
% matrix formed by the matching columnwise Kronecker products, i.e.
% the k-th column of the Khatri-Rao product is defined as
% kron(A(:,k),B(:,k)).
%
% kr(A,B,C,...) and kr({A B C ...}) compute a string of Khatri-Rao
% products A o B o C o ..., where o denotes the Khatri-Rao product.
%
% See also kron.
% Version: 21/10/10
% Authors: Laurent Sorber (Laurent.Sorber@cs.kuleuven.be)
if ~iscell(U), U = [U varargin]; end
K = size(U{1},2);
if any(cellfun('size',U,2)-K)
error('kr:ColumnMismatch', ...
'Input matrices must have the same number of columns.');
end
J = size(U{end},1);
X = reshape(U{end},[J 1 K]);
for n = length(U)-1:-1:1
I = size(U{n},1);
A = reshape(U{n},[1 I K]);
X = reshape(bsxfun(@times,A,X),[I*J 1 K]);
J = I*J;
end
X = reshape(X,[size(X,1) K]);
end