目录
一、引言
内容简介: 本文主要讲解了均匀面阵中基于PARAFAC分解的二维DOA估计算法。详细推导了均匀面阵的阵列流型的构成。然后介绍了PAFARAC模型,通过切片示意图说明分解的方式。接着又分析了如何利用PARAFAC分解获得的阵列流型进行二维的DOA估计,顺便提及与PAFARAC相关的张量分解的部分内容。最后逐段给出该模型的仿真代码,搭建出与前文公式推导相匹配的基于PARAFAC分解的大体框架,对代码估计的效果进行了验证,并指出其中可以优化的方向。
二、均匀面阵模型
如图1所示的均匀面阵,该面阵共有
M
×
N
M \times N
M×N 个阵元,阵元均匀分布,相邻阵元的间距是
d
d
d,
d
⩽
λ
/
2
d \leqslant \lambda/2
d⩽λ/2。
图1 二维均匀面阵模型
假设空间中有 K K K 个信号入射到此均匀面阵上,其二维DOA为 ( θ k , ϕ k ) (\theta_k, \phi_k) (θk,ϕk), k = 1 , 2 , ⋯ , K k = 1,2,\cdots,K k=1,2,⋯,K,其中 θ k \theta_k θk 和 ϕ k \phi_k ϕk 分别代表第 k k k 个信源的仰角和方位角。定义 u k = sin θ k sin ϕ k u_k = \sin\theta_k \sin\phi_k uk=sinθksinϕk, v k = sin θ k cos ϕ k v_k = \sin\theta_k \cos\phi_k vk=sinθkcosϕk,示意图如图2所示。
图2 二维均匀面阵角度对应关系
x x x 轴和 y y y 轴上阵元的方向向量分别为:
a x ( θ k , ϕ k ) = [ 1 e j 2 π d sin θ k cos ϕ k / λ ⋮ e j 2 π ( M − 1 ) d sin θ k cos ϕ k / λ ] , a y ( θ k , ϕ k ) = [ 1 e j 2 π d sin θ k sin ϕ k / λ ⋮ e j 2 π ( N − 1 ) d sin θ k sin ϕ k / λ ] (1) \begin{aligned} \boldsymbol{a}_x\left( \theta _k,\phi _k \right) &=\left[ \begin{array}{c} 1\\ {e}^{\text{j}2\pi d\sin \theta _k\cos \phi _k/\lambda}\\ \vdots\\ {e}^{\text{j}2\pi \left( M-1 \right) d\sin \theta _k\cos \phi _k/\lambda}\\ \end{array} \right] ,\ \boldsymbol{a}_y\left( \theta _k,\phi _k \right) =\left[ \begin{array}{c} 1\\ {e}^{\text{j}2\pi d\sin \theta _k\sin \phi _k/\lambda}\\ \vdots\\ {e}^{\text{j}2\pi \left( N-1 \right) d\sin \theta _k\sin \phi _k/\lambda}\\ \end{array} \right]\\ \end{aligned} \tag{1} ax(θk,ϕk)= 1ej2πdsinθkcosϕk/λ⋮ej2π(M−1)dsinθkcosϕk/λ , ay(θk,ϕk)= 1ej2πdsinθksinϕk/λ⋮ej2π(N−1)dsinθksinϕk/λ (1)
子阵 1 的接收信号可表示为:
x
1
(
t
)
=
A
x
s
(
t
)
+
n
1
(
t
)
\boldsymbol{x}_1(t) = \boldsymbol{A}_x \boldsymbol{s}(t) + \boldsymbol{n}_1(t)
x1(t)=Axs(t)+n1(t)
式中,
A
x
=
[
a
x
(
θ
1
,
ϕ
1
)
,
a
x
(
θ
2
,
ϕ
2
)
,
⋯
,
a
x
(
θ
K
,
ϕ
K
)
]
\boldsymbol{A}_x = [\boldsymbol{a}_x(\theta_1, \phi_1), \boldsymbol{a}_x(\theta_2, \phi_2), \cdots, \boldsymbol{a}_x(\theta_K, \phi_K)]
Ax=[ax(θ1,ϕ1),ax(θ2,ϕ2),⋯,ax(θK,ϕK)] 为子阵 1 的方向矩阵;
n
1
(
t
)
\boldsymbol{n}_1(t)
n1(t) 为子阵 1 的加性高斯白噪声;
s
(
t
)
∈
C
K
×
1
\boldsymbol{s}(t) \in \mathbb{C}^{K \times 1}
s(t)∈CK×1 为信源向量,这与一维均匀线阵的标准形式相同。
接下来,子阵 2 的接收信号为:
x
2
(
t
)
=
A
x
Φ
y
1
s
(
t
)
+
n
2
(
t
)
\boldsymbol{x}_2(t) = \boldsymbol{A}_x \boldsymbol{\varPhi}_y^{1} \boldsymbol{s}(t) + \boldsymbol{n}_2(t)
x2(t)=AxΦy1s(t)+n2(t)
式中,
A
x
Φ
y
1
\boldsymbol{A}_x \boldsymbol{\varPhi}_y^{1}
AxΦy1 为子阵 2 的方向矩阵,
Φ
y
=
d
i
a
g
(
e
j
2
π
d
sin
θ
1
sin
ϕ
1
/
λ
,
⋯
,
e
j
2
π
d
sin
θ
K
sin
ϕ
K
/
λ
)
\boldsymbol{\varPhi}_y = \mathrm{diag}(\mathrm{e}^{\mathrm{j}2\pi d \sin\theta_1 \sin\phi_1 / \lambda}, \cdots, \mathrm{e}^{\mathrm{j}2\pi d \sin\theta_K \sin\phi_K / \lambda})
Φy=diag(ej2πdsinθ1sinϕ1/λ,⋯,ej2πdsinθKsinϕK/λ);
n
2
(
t
)
\boldsymbol{n}_2(t)
n2(t) 为子阵 2 的加性高斯白噪声。
解释 : 为何 A x Φ y 1 \boldsymbol{A}_x \boldsymbol{\varPhi}_y^{1} AxΦy1 是子阵2的方向矩阵?
- 对于同一直线上的两个阵元,如图(a),信源入射的波程差为: Δ x = d c o s α \Delta x=dcos\alpha Δx=dcosα
- 将这两个阵元在平面上并排放置,如图(b),波程差为: Δ x = d y c o s α \Delta x=d_y cos \alpha Δx=dycosα
- 再将这两个阵元在平面中任意放置,如图(c)和(d),波程差为: Δ x = Δ x 1 + Δ x 2 = d x c o s β + d y c o s α \Delta x=\Delta x_1+\Delta x_2=d_x cos\beta +d_y cos \alpha Δx=Δx1+Δx2=dxcosβ+dycosα
- 由于子阵2相对于子阵1,在 y y y 轴方向上只相差1个阵元间距 d d d,因此 A x \boldsymbol{A}_x Ax 每个列向量将分别乘以指数因子 e j 2 π d sin θ k sin ϕ k / λ \mathrm{e}^{\mathrm{j}2\pi \textcolor{red}{d} \sin\theta_k \sin\phi_k / \lambda} ej2πdsinθksinϕk/λ , k = 1 , 2 , ⋯ , K k = 1,2,\cdots,K k=1,2,⋯,K ,同理,子阵3的每个列向量将分别乘以指数因子 e j 2 π 2 d sin θ k sin ϕ k / λ \mathrm{e}^{\mathrm{j}2\pi \textcolor{red}{2d} \sin\theta_k \sin\phi_k / \lambda} ej2π2dsinθksinϕk/λ。
所以推广至子阵
n
n
n 时的接收信号为:
x
n
(
t
)
=
A
x
Φ
y
n
−
1
s
(
t
)
+
n
n
(
t
)
(2)
\boldsymbol{x}_n(t) = \boldsymbol{A}_x \boldsymbol{\varPhi}_y^{n - 1} \boldsymbol{s}(t) + \boldsymbol{n}_n(t) \tag{2}
xn(t)=AxΦyn−1s(t)+nn(t)(2)
由此可得,整个均匀面阵的接收信号为:
x
(
t
)
=
[
x
1
(
t
)
x
2
(
t
)
⋮
x
N
(
t
)
]
=
[
A
x
A
x
Φ
y
⋮
A
x
Φ
y
N
−
1
]
s
(
t
)
+
[
n
1
(
t
)
n
2
(
t
)
⋮
n
N
(
t
)
]
(3)
\boldsymbol{x}(t) = \begin{bmatrix} \boldsymbol{x}_1(t) \\ \boldsymbol{x}_2(t) \\ \vdots \\ \boldsymbol{x}_N(t) \end{bmatrix} = \begin{bmatrix} \boldsymbol{A}_x \\ \boldsymbol{A}_x \boldsymbol{\varPhi}_y \\ \vdots \\ \boldsymbol{A}_x \boldsymbol{\varPhi}_y^{N - 1} \end{bmatrix} \boldsymbol{s}(t) + \begin{bmatrix} \boldsymbol{n}_1(t) \\ \boldsymbol{n}_2(t) \\ \vdots \\ \boldsymbol{n}_N(t) \end{bmatrix} \tag{3}
x(t)=
x1(t)x2(t)⋮xN(t)
=
AxAxΦy⋮AxΦyN−1
s(t)+
n1(t)n2(t)⋮nN(t)
(3)
由于
y
y
y 轴上
N
N
N 个阵元对应的方向矩阵为
A
y
=
[
a
y
(
θ
1
,
ϕ
1
)
,
a
y
(
θ
2
,
ϕ
2
)
,
⋯
,
a
y
(
θ
K
,
ϕ
K
)
]
\boldsymbol{A}_y = [\boldsymbol{a}_y(\theta_1, \phi_1), \boldsymbol{a}_y(\theta_2, \phi_2), \cdots, \boldsymbol{a}_y(\theta_K, \phi_K)]
Ay=[ay(θ1,ϕ1),ay(θ2,ϕ2),⋯,ay(θK,ϕK)],具体表示为:
A
y
=
[
1
1
⋯
1
e
j
2
π
d
sin
θ
1
sin
ϕ
1
/
λ
e
j
2
π
d
sin
θ
2
sin
ϕ
2
/
λ
⋯
e
j
2
π
d
sin
θ
K
sin
ϕ
K
/
λ
⋮
⋮
⋮
e
j
2
π
(
N
−
1
)
d
sin
θ
1
sin
ϕ
1
/
λ
e
j
2
π
(
N
−
1
)
d
sin
θ
2
sin
ϕ
2
/
λ
⋯
e
j
2
π
(
N
−
1
)
d
sin
θ
K
sin
ϕ
K
/
λ
]
(4)
\boldsymbol{A}_y = \begin{bmatrix} 1 & 1 & \cdots & 1 \\ \mathrm{e}^{\mathrm{j}2\pi d \sin\theta_1 \sin\phi_1 / \lambda} & \mathrm{e}^{\mathrm{j}2\pi d \sin\theta_2 \sin\phi_2 / \lambda} & \cdots & \mathrm{e}^{\mathrm{j}2\pi d \sin\theta_K \sin\phi_K / \lambda} \\ \vdots & \vdots & & \vdots \\ \mathrm{e}^{\mathrm{j}2\pi (N - 1)d \sin\theta_1 \sin\phi_1 / \lambda} & \mathrm{e}^{\mathrm{j}2\pi (N - 1)d \sin\theta_2 \sin\phi_2 / \lambda} & \cdots & \mathrm{e}^{\mathrm{j}2\pi (N - 1)d \sin\theta_K \sin\phi_K / \lambda} \end{bmatrix} \tag{4}
Ay=
1ej2πdsinθ1sinϕ1/λ⋮ej2π(N−1)dsinθ1sinϕ1/λ1ej2πdsinθ2sinϕ2/λ⋮ej2π(N−1)dsinθ2sinϕ2/λ⋯⋯⋯1ej2πdsinθKsinϕK/λ⋮ej2π(N−1)dsinθKsinϕK/λ
(4)
对比可见 Φ y N − 1 \boldsymbol{\varPhi}_y^{N - 1} ΦyN−1 实际上就是 A y \boldsymbol{A}_y Ay 的第 N N N行的元素组成的对角矩阵,因此上式也可表示为:
x ( t ) = [ A y ⊙ A x ] s ( t ) + n ( t ) (5) \boldsymbol{x}(t) = [\boldsymbol{A}_y \odot \boldsymbol{A}_x] \boldsymbol{s}(t) + \boldsymbol{n}(t) \tag{5} x(t)=[Ay⊙Ax]s(t)+n(t)(5)
式中,
x
\boldsymbol{x}
x 是
M
N
×
1
MN\times1
MN×1维度的矩阵,
⊙
\odot
⊙ 表示的Khatri-Rao积(解释的链接)。根据 Khatri-Rao 积的定义,接收信号可以写为:
x
(
t
)
=
[
a
y
(
θ
1
,
ϕ
1
)
⊗
a
x
(
θ
1
,
ϕ
1
)
,
⋯
,
a
y
(
θ
K
,
ϕ
K
)
⊗
a
x
(
θ
K
,
ϕ
K
)
]
s
(
t
)
+
n
(
t
)
\boldsymbol{x}(t) = [\boldsymbol{a}_y(\theta_1, \phi_1) \otimes \boldsymbol{a}_x(\theta_1, \phi_1), \cdots, \boldsymbol{a}_y(\theta_K, \phi_K) \otimes \boldsymbol{a}_x(\theta_K, \phi_K)] \boldsymbol{s}(t) + \boldsymbol{n}(t)
x(t)=[ay(θ1,ϕ1)⊗ax(θ1,ϕ1),⋯,ay(θK,ϕK)⊗ax(θK,ϕK)]s(t)+n(t)
式中,
⊗
\otimes
⊗ 代表 Kronecker 积。假设对于
L
L
L 次采样,
a
x
(
θ
k
,
ϕ
k
)
\boldsymbol{a}_x(\theta_k, \phi_k)
ax(θk,ϕk) 和
a
y
(
θ
k
,
ϕ
k
)
\boldsymbol{a}_y(\theta_k, \phi_k)
ay(θk,ϕk) 不变,定义
X
=
[
x
(
1
)
,
x
(
2
)
,
⋯
,
x
(
L
)
]
∈
C
M
N
×
L
\boldsymbol{X} = [\boldsymbol{x}(1), \boldsymbol{x}(2), \cdots, \boldsymbol{x}(L)] \in \mathbb{C}^{MN \times L}
X=[x(1),x(2),⋯,x(L)]∈CMN×L,均匀面阵的接收信号可表示为:
X
=
[
A
y
⊙
A
x
]
S
T
+
N
=
[
X
1
X
2
⋮
X
N
]
=
[
A
x
D
1
(
A
y
)
A
x
D
2
(
A
y
)
⋮
A
x
D
N
(
A
y
)
]
S
T
+
[
N
1
N
2
⋮
N
N
]
(6)
\boldsymbol{X} = [\boldsymbol{A}_y \odot \boldsymbol{A}_x] \boldsymbol{S}^{\mathrm{T}} + \boldsymbol{N} = \begin{bmatrix} \boldsymbol{X}_1 \\ \boldsymbol{X}_2 \\ \vdots \\ \boldsymbol{X}_N \end{bmatrix} = \begin{bmatrix} \boldsymbol{A}_x \boldsymbol{D}_1(\boldsymbol{A}_y) \\ \boldsymbol{A}_x \boldsymbol{D}_2(\boldsymbol{A}_y) \\ \vdots \\ \boldsymbol{A}_x \boldsymbol{D}_N(\boldsymbol{A}_y) \end{bmatrix} \boldsymbol{S}^{\mathrm{T}} + \begin{bmatrix} \boldsymbol{N}_1 \\ \boldsymbol{N}_2 \\ \vdots \\ \boldsymbol{N}_N \end{bmatrix} \tag{6}
X=[Ay⊙Ax]ST+N=
X1X2⋮XN
=
AxD1(Ay)AxD2(Ay)⋮AxDN(Ay)
ST+
N1N2⋮NN
(6)
式中,
S
=
[
s
(
1
)
,
s
(
2
)
,
⋯
,
s
(
L
)
]
T
∈
C
L
×
K
\boldsymbol{S} = [\boldsymbol{s}(1), \boldsymbol{s}(2), \cdots, \boldsymbol{s}(L)]^{\mathrm{T}} \in \mathbb{C}^{L \times K}
S=[s(1),s(2),⋯,s(L)]T∈CL×K 由
L
L
L 次采样的信号向量组成;
D
m
(
⋅
)
\boldsymbol{D}_m(\cdot)
Dm(⋅) 为由矩阵第
m
m
m 行构造的对角矩阵;
N
=
[
n
(
1
)
,
n
(
2
)
,
⋯
,
n
(
L
)
]
\boldsymbol{N} = [\boldsymbol{n}(1), \boldsymbol{n}(2), \cdots, \boldsymbol{n}(L)]
N=[n(1),n(2),⋯,n(L)] 为加性高斯白噪声矩阵。
X
\boldsymbol{X}
X矩阵的示意图如图3所示,它可以视为是将一个3维的立方体数据铺展成一系列的2维的平面数据。
图3 矩阵X的切片示意图
三、PAFARAC模型及分解
3.1 数据模型
如果不将图3中的三维立方体展开,则其中的元素可按照如下方式描述:
x
m
,
n
,
l
=
∑
k
=
1
K
A
x
(
m
,
k
)
A
y
(
n
,
k
)
S
(
l
,
k
)
,
m
=
1
,
2
,
⋯
,
M
,
n
=
1
,
2
,
⋯
,
N
,
l
=
1
,
2
,
⋯
,
L
(7)
x_{m,n,l} = \sum_{k=1}^{K} \boldsymbol{A}_x(m,k) \boldsymbol{A}_y(n,k) \boldsymbol{S}(l,k), \ m = 1,2,\cdots,M, \ n = 1,2,\cdots,N, \ l = 1,2,\cdots,L \tag{7}
xm,n,l=k=1∑KAx(m,k)Ay(n,k)S(l,k), m=1,2,⋯,M, n=1,2,⋯,N, l=1,2,⋯,L(7)
该形式称为阵列接收信号的PARAFAC模型, 式中,
A
x
(
m
,
k
)
\boldsymbol{A}_x(m,k)
Ax(m,k)、
A
y
(
n
,
k
)
\boldsymbol{A}_y(n,k)
Ay(n,k) 和
S
(
l
,
k
)
\boldsymbol{S}(l,k)
S(l,k)分别为
x
x
x 轴方向矩阵
A
x
\boldsymbol{A}_x
Ax 的第
(
m
,
k
)
(m,k)
(m,k) 个元素、
y
y
y 轴方向矩阵
A
y
\boldsymbol{A}_y
Ay 的第
(
n
,
k
)
(n,k)
(n,k) 个元素和信源矩阵
S
\boldsymbol{S}
S 的第
(
l
,
k
)
(l,k)
(l,k) 个元素。
上一节中得到的
X
n
(
n
=
1
,
2
,
⋯
,
N
)
\boldsymbol{X}_n \ (n = 1,2,\cdots,N)
Xn (n=1,2,⋯,N) 可以看作沿三个空间维度中Y轴的维度对三维矩阵切片得到的,每个矩阵可用如下形式表示:
X
n
=
A
x
D
n
(
A
y
)
S
T
+
N
n
,
n
=
1
,
2
,
⋯
,
N
(8.1)
\boldsymbol{X}_n = \boldsymbol{A}_x \boldsymbol{D}_n(\boldsymbol{A}_y) \boldsymbol{S}^{\mathrm{T}} + \boldsymbol{N}_n, \ n = 1,2,\cdots,N \tag{8.1}
Xn=AxDn(Ay)ST+Nn, n=1,2,⋯,N(8.1)
由PARAFAC模型的对称性可以得到三维矩阵沿另外两个维度的切片形式,如图4和图5,公式如下:
Y m = S D m ( A x ) A y T + N , m = 1 , 2 , ⋯ , M (8.2) \boldsymbol{Y}_m = \boldsymbol{S} \boldsymbol{D}_m(\boldsymbol{A}_x) \boldsymbol{A}_y^{\mathrm{T}} + \boldsymbol{N}, \ m = 1,2,\cdots,M \tag{8.2} Ym=SDm(Ax)AyT+N, m=1,2,⋯,M(8.2)
Z
l
=
A
y
D
l
(
S
)
A
x
T
+
N
t
,
l
=
1
,
2
,
⋯
,
L
(8.3)
\boldsymbol{Z}_l = \boldsymbol{A}_y \boldsymbol{D}_l(\boldsymbol{S}) \boldsymbol{A}_x^{\mathrm{T}} + \boldsymbol{N}_t, \ l = 1,2,\cdots,L \tag{8.3}
Zl=AyDl(S)AxT+Nt, l=1,2,⋯,L(8.3)
图4 矩阵Y的切片示意图
图5 矩阵Z的切片示意图
- 注:上图中,矩阵 X \boldsymbol{X} X沿 y y y轴切片,矩阵 Y \boldsymbol{Y} Y沿着 x x x轴切片,矩阵 Z \boldsymbol{Z} Z沿着时域切片。这里可能疑惑为什么矩阵 X \boldsymbol{X} X不沿 x x x轴切片。实际上 X \boldsymbol{X} X代表样本值,与 x x x并无直接关系, Y \boldsymbol{Y} Y和 Z \boldsymbol{Z} Z只是顺着 X \boldsymbol{X} X向后选了两个字母,因此 X , Y , Z \boldsymbol{X,Y,Z} X,Y,Z三个矩阵与 x , y , z x,y,z x,y,z轴无直接关系。如果非要大小写字母对应,可以选择 Y \boldsymbol{Y} Y作为信号接收阵列,另外两者可逐一对应即可。
- 原始的数学模型可见硕士论文
《基于平行因子分析的阵列参数估计》
的 3.3.1 小节,这其中是使用 A , B , C \boldsymbol{A,B,C} A,B,C三个矩阵进行的解释。
按照公式(6)对 X \boldsymbol{X} X 的处理,矩阵 X \boldsymbol{X} X、 Y \boldsymbol{Y} Y和 Z \boldsymbol{Z} Z可以表示为:
X = [ X 1 X 2 … X N ] T = [ A y ⊙ A x ] S T + N x (9.1) \boldsymbol{X} = [\boldsymbol{X}_1 \boldsymbol{X}_2 \dots \boldsymbol{X}_N]^\mathrm{T} = [\boldsymbol{A}_y \odot \boldsymbol{A}_x] \boldsymbol{S}^{\mathrm{T}} + \boldsymbol{N}_x \tag{9.1} X=[X1X2…XN]T=[Ay⊙Ax]ST+Nx(9.1)
Y = [ Y 1 Y 2 … Y M ] = [ A x ⊙ S ] A y T + N y (9.2) \boldsymbol{Y} = [\boldsymbol{Y}_1 \boldsymbol{Y}_2 \dots \boldsymbol{Y}_M] = [\boldsymbol{A}_x \odot \boldsymbol{S}] \boldsymbol{A}_y^{\mathrm{T}} + \boldsymbol{N}_y \tag{9.2} Y=[Y1Y2…YM]=[Ax⊙S]AyT+Ny(9.2)
Z = [ Z 1 Z 2 … Z L ] = [ S ⊙ A y ] A x T + N z (9.3) \boldsymbol{Z} = [\boldsymbol{Z}_1 \boldsymbol{Z}_2 \dots \boldsymbol{Z}_L] = [\boldsymbol{S} \odot \boldsymbol{A}_y] \boldsymbol{A}_x^{\mathrm{T}} + \boldsymbol{N}_z \tag{9.3} Z=[Z1Z2…ZL]=[S⊙Ay]AxT+Nz(9.3)
3.2 PARAFAC 分解
交替最小二乘法(Alternating Least Squares , ALS)是常用于 PARAFAC 模型的一种方法。ALS 通过交替固定其他因子矩阵,仅对某一个因子矩阵进行最小二乘优化,逐步逼近最优解。运行时首先进行初始化,为各因子矩阵(如信源矩阵、阵列流型)赋予初始值,然后根据式(9.1)计算
S
\boldsymbol{S}
S 的LS解。式中
[
⋅
]
†
[\cdot]^{\dagger}
[⋅]† 表示广义逆运算。
S
T
=
[
A
y
⊙
A
x
]
†
X
(10.1)
\boldsymbol{S}^{\mathrm{T}} = [\boldsymbol{A}_y \odot \boldsymbol{A}_x]^{\dagger} \boldsymbol{X} \tag{10.1}
ST=[Ay⊙Ax]†X(10.1)
接着由式(9.2)得到
y
y
y 轴的阵列流型
A
y
T
=
[
A
x
⊙
S
]
†
Y
(10.2)
\boldsymbol{A}_y^{\mathrm{T}} = [\boldsymbol{A}_x \odot \boldsymbol{S}]^{\dagger} \boldsymbol{Y} \tag{10.2}
AyT=[Ax⊙S]†Y(10.2)
接着由式(9.3)得到
x
x
x 轴的阵列流型
A
x
T
=
[
S
⊙
A
y
]
†
Z
(10.3)
\boldsymbol{A}_x^{\mathrm{T}} = [\boldsymbol{S} \odot \boldsymbol{A}_y]^{\dagger} \boldsymbol{Z} \tag{10.3}
AxT=[S⊙Ay]†Z(10.3)
重复交替上述优化步骤,直至因子矩阵收敛(比如迭代前后变化量小于设定阈值)。
四、二维DOA估计
利用 PARAFAC 分解估计出 A x \boldsymbol{A}_x Ax、 A y \boldsymbol{A}_y Ay 后,设 A x \boldsymbol{A}_x Ax 的某一列为 a x \boldsymbol{a}_x ax,取 angle ( a x ) \text{angle}(\boldsymbol{a}_x) angle(ax),因其范围为 [ − π , π ] [-\pi, \pi] [−π,π],通过对某些项加上 2 k π 2k\pi 2kπ 使其成为递增的序列。按以上方法对 A x \boldsymbol{A}_x Ax 的每一列进行调整后,利用阵列之间的相位差可以估计其 DOA。具体过程如下:
a
x
(
θ
k
,
ϕ
k
)
=
[
1
e
j
2
π
d
sin
θ
k
cos
ϕ
k
/
λ
…
e
j
2
π
(
M
−
1
)
d
sin
θ
k
cos
ϕ
k
/
λ
]
T
\boldsymbol{a}_x(\theta_k, \phi_k) = [1 \ \mathrm{e}^{\mathrm{j}2\pi d \sin\theta_k \cos\phi_k / \lambda} \ \dots \ \mathrm{e}^{\mathrm{j}2\pi (M - 1)d \sin\theta_k \cos\phi_k / \lambda} ]^{T}
ax(θk,ϕk)=[1 ej2πdsinθkcosϕk/λ … ej2π(M−1)dsinθkcosϕk/λ]T
使用
angle
\text{angle}
angle 函数获得向量的角度值
h
\boldsymbol{h}
h ,
h
=
angle
(
a
x
(
θ
k
,
ϕ
k
)
)
=
[
0
,
2
π
d
sin
θ
k
cos
ϕ
k
/
λ
,
⋯
,
2
π
(
M
−
1
)
d
sin
θ
k
cos
ϕ
k
/
λ
]
T
(11)
\begin{aligned} \boldsymbol{h} &= \text{angle}(\boldsymbol{a}_x(\theta_k, \phi_k)) \\ &= \left[0, 2\pi d \sin\theta_k \cos\phi_k / \lambda, \cdots, 2\pi (M - 1)d \sin\theta_k \cos\phi_k / \lambda\right]^{\mathrm{T}} \end{aligned} \tag{11}
h=angle(ax(θk,ϕk))=[0,2πdsinθkcosϕk/λ,⋯,2π(M−1)dsinθkcosϕk/λ]T(11)
由于
h
\boldsymbol{h}
h的每个元素之间的差值相同,所以通过自相减可得
sin
θ
k
cos
ϕ
k
\sin\theta_k \cos\phi_k
sinθkcosϕk 的值,然后取平均以减小误差。
v
k
=
sin
θ
k
cos
ϕ
k
=
m
e
a
n
[
(
h
[
2
:
e
n
d
]
−
h
[
1
:
M
−
1
]
)
2
π
d
/
λ
]
(12)
v_k = \sin\theta_k \cos\phi_k = mean\left[\frac{(\boldsymbol{h}[2:end] - \boldsymbol{h}[1:M-1]) }{2\pi d / \lambda}\right] \tag{12}
vk=sinθkcosϕk=mean[2πd/λ(h[2:end]−h[1:M−1])](12)
同理,依据
A
y
\boldsymbol{A}_y
Ay可计算出
u
k
u_k
uk。综合两者可得目标方向的二维DOA估计为:
θ
^
k
=
sin
−
1
(
u
^
k
2
+
v
^
k
2
)
ϕ
^
k
=
tan
−
1
(
u
^
k
/
v
^
k
)
(13)
\begin{aligned} \hat{\theta}_k &= \sin^{-1}(\sqrt{\hat{u}_k^2 + \hat{v}_k^2}) \\ \hat{\phi}_k &= \tan^{-1}(\hat{u}_k / \hat{v}_k) \end{aligned} \tag{13}
θ^kϕ^k=sin−1(u^k2+v^k2)=tan−1(u^k/v^k)(13)
至此,均匀面阵中基于PARAFAC模型的二维DOA估计算法描述完毕。
五、引申-张量分解
前文中的立方体数据,在数学上有专用名称:张量。简单理解,一维数据构成向量,二维数据构成矩阵,三维及更高维数据则称为张量。维数的增高意味着处理的复杂度随之升高,为简化运算,出现许多张量分解算法。CP分解是张量分解的算法之一,它将张量分解为一系列的秩一张量之和,其中秩一张量是由三个向量张成的。CP分解的示意图如图6,它类似于矩阵的SVD分解,将矩阵分解为许多因子矩阵之和。从图6这个角度来看,CP分解中最小的单元是不同的向量,向量的外积组成了不同的张量,因子张量之和就是原始张量。
图6 CP分解示意图
x i j k ≈ ∑ r = 1 R a i r b j r c k r for i = 1 , … , I , j = 1 , … , J , k = 1 , … , K . (14) x_{ijk} \approx \sum_{r=1}^{R} a_{ir} b_{jr} c_{kr} \quad \text{for } i = 1, \ldots, I, \ j = 1, \ldots, J, \ k = 1, \ldots, K. \tag{14} xijk≈r=1∑Rairbjrckrfor i=1,…,I, j=1,…,J, k=1,…,K.(14)
CP分解不止一种表示形式,它还可以以矩阵为最小单元,按照如下方式分解:
X
(
1
)
≈
A
(
C
⊙
B
)
T
,
X
(
2
)
≈
B
(
C
⊙
A
)
T
,
X
(
3
)
≈
C
(
B
⊙
A
)
T
.
(15)
\begin{aligned} \boldsymbol{X}_{(1)} &\approx \boldsymbol{A}(\boldsymbol{C} \odot \boldsymbol{B})^{\mathrm{T}}, \\ \boldsymbol{X}_{(2)} &\approx \boldsymbol{B}(\boldsymbol{C} \odot \boldsymbol{A})^{\mathrm{T}}, \\ \boldsymbol{X}_{(3)} &\approx \boldsymbol{C}(\boldsymbol{B} \odot \boldsymbol{A})^{\mathrm{T}}. \end{aligned} \tag{15}
X(1)X(2)X(3)≈A(C⊙B)T,≈B(C⊙A)T,≈C(B⊙A)T.(15)
可以发现,这种分解方式与PARAFAC的分解是相同的,所以PARAFAC的分解实际属于CP分解的类型之一。从更大的范围讲,CP分解又属于Tucker分解的特殊类型,BTD分解则兼具CP分解和Tucker分解两者的特点…太多了写不完 附上链接。
六、代码解析
以下是代码,运行环境是MATLAB R2020b,由于涉及张量分解的cp_als函数
等,需提前安装Tensor Toolbox工具包。
6.1 参数配置
%% 参数设置
M = 6; % x轴阵元个数
N = 5; % y轴阵元个数
K = 512; % 快拍数
fc = 100e6; % 载波频率
fs = 300e6; % 采样频率
Pn = 1; % 噪声功率
fines = [20, 40]; % 方位角(度)
thetas = [5, 60]; % 俯仰角(度)
signal_SNR = [30, 30]; % 信噪比(dB)
signal_f = [15e6, 30e6]; % 信号频率
m = (0:M-1)'; % x轴阵元索引
n = (0:N-1)'; % y轴阵元索引
c = 3e8; % 光速
lambda = c / fc; % 波长
dx = lambda / 2; % x轴阵元间距
dy = lambda / 2; % y轴阵元间距
num_signals = length(fines); % 信号数目
6.2 生成信号
两路信号分别进行载波调制;
%% 生成信号
t = (0:K-1)/fs; % 时间向量
S = zeros(num_signals, K);
for k = 1:num_signals
A_k = sqrt(Pn)*10^(signal_SNR(k)/20); % 信号幅度
S(k,:) = A_k * exp(1j*2*pi*signal_f(k)*t); % 载波调制
end
6.3 构造阵列流型
按照第一节中公式(1)进行构造;
%% 构造阵列流型
A = zeros(M, num_signals);
B = zeros(N, num_signals);
for k = 1:num_signals
phi = deg2rad(fines(k));
theta = deg2rad(thetas(k));
% 空间频率计算
u = (dx/lambda)*sin(theta)*cos(phi);
v = (dy/lambda)*sin(theta)*sin(phi);
A(:,k) = exp(-1j*2*pi*m*u); % x方向导向矢量
B(:,k) = exp(-1j*2*pi*n*v); % y方向导向矢量
end
6.4 构造接收张量
使用ktensor函数
创建秩为 1 的 Kruskal对象 component,其内容为
A
\boldsymbol{A}
A的列向量、
B
\boldsymbol{B}
B的列向量、
S
\boldsymbol{S}
S的行向量张成的张量,循环遍历每个信号,最终叠加在一起形成张量
X
\boldsymbol{X}
X,参考图6理解。
%% 构造接收张量
X = tensor(zeros(M,N,K));
noise = (randn(M,N,K) + 1j*randn(M,N,K)) * sqrt(Pn/2);
for k = 1:num_signals
component = ktensor(1, A(:,k), B(:,k), S(k,:).');
X = X + tensor(component);
end
X = X + tensor(noise);
X_normalized = X / norm(X); % 张量归一化
6.5 ALS分解
结构体struct
存储 PARAFAC 分解的相关参数。初始化方法为nvecs
,这是种较为稳定的初始化方法(也选random
);printitn
置为1在分解过程中会输出每次迭代的相关信息;tol
设置收敛容差,当相邻两次迭代的误差变化小于这个容差时,就认为分解已经收敛,迭代过程会停止;maxiters
设置最大迭代次数为 150。若迭代次数达到这个上限,即便还未满足收敛条件,分解过程也会停止。
待优化:迭代次数与收敛容差的平衡
- 当收敛容差设置较大时,迭代会提前停止;设置较小时,迭代次数过多,出现过拟合;
- 当迭代次数设置较小时,迭代会提前停止;设置较大时,迭代次数过多,出现过拟合;
- 两者都会导致出现误差,感兴趣的朋友可自行优化。
%% ALS分解
R = num_signals; % 分解秩
options = struct;
options.init = 'nvecs'; % 使用nvecs初始化
options.printitn = 1; % 显示迭代过程
options.tol = 1e-4; % 设置收敛容差
options.maxiters = 150; % 增加最大迭代次数
[Factors, ~] = cp_als(X_normalized, R, options);
A_est = Factors{1};
B_est = Factors{2};
6.6 参数估计
此处按照公式(11-13)编写代码,可从估计得到的A_est
和B_est
中获得角度
(
θ
k
,
ϕ
k
)
(\theta_k, \phi_k)
(θk,ϕk)。unwrap函数
对应第四节提到的“通过对某些项加上
2
k
π
2k\pi
2kπ 使其成为递增的序列”。需要说明的是,这段代码有个小问题:计算phi_est
的atan2d函数
前添加了负号-
。这与公式(13)是相悖的,但是不添加的话,估计的角度则刚好是真实值的相反数,我还没想明白 TT,欢迎评论区讨论。
%% 参数估计
estimated_angles = zeros(num_signals, 2);
for d = 1:R
% x方向估计
a = A_est(:,d);
phase_x = unwrap(angle(a));
u_est = -(phase_x(2:end) - phase_x(1:end-1))/(2*pi*(dx/lambda));
u_est_avg = mean(u_est);
% y方向估计
b = B_est(:,d);
phase_y = unwrap(angle(b));
v_est = -(phase_y(2:end) - phase_y(1:end-1))/(2*pi*(dy/lambda));
v_est_avg = mean(v_est);
% 角度解算
phi_est = -atan2d(v_est_avg , u_est_avg);
theta_est = asind(sqrt(u_est_avg.^2 + v_est_avg.^2));
estimated_angles(d,:) = [phi_est, theta_est];
end
6.7 结果展示
%% 二维可视化
figure(10);
% 真实位置三维散点图
scatter(fines, thetas, 'r', 'filled');hold on;
% 估计位置三维散点图
scatter(estimated_angles(:,1), estimated_angles(:,2), 'b', 'd');
xlabel('方位角 (度)'); ylabel('俯仰角 (度)'); zlabel('幅度');
title('信号分布');
axis([0,90,0,90]);
grid on;
% 性能评估
RMSE_phi = sqrt(mean((fines - estimated_angles(:,1)').^2));
RMSE_theta = sqrt(mean((thetas - estimated_angles(:,2)').^2));
disp(['方位角RMSE: ', num2str(RMSE_phi), ' 度']);
disp(['俯仰角RMSE: ', num2str(RMSE_theta), ' 度']);
估计结果如图7所示,设定估计的两个方向分别为
(
20
°
,
5
°
)
(20°,5°)
(20°,5°) 、
(
40
°
,
60
°
)
(40°,60°)
(40°,60°),RMSE的误差也展示在图中。如果你更改了方位角和俯仰角,重新估计的话,大概率会出现图8所示情况,这说明出现了欠拟合和过拟合,如果想让代码稳定,可以去6.5小节优化分解过程,OK,暂时就写到这里。。。
图7 正常估计结果
图8 异常估计结果
更新中…
参考文献
- 学位论文 基于平行因子分析的阵列参数估计
- 知乎 张量基础| 张量的秩与秩一张量
- 知乎 深入理解 | CP、Tucker分解
- Github 二维DOA估计算法
- 图书 阵列信号处理及MATLAB实现 第三版
- 工具 DeepSeek & 豆包