波束成形的物理意义
如图, 是在各种教材中经常看到的天线方向图。 上图表示的是当前天线经过波束成形后在空间中 指向 30度方向 (一般考虑的方向是0-180度)。这里解释一下天线方向:
不失一般性的,一个MISO系统的接收信号(简洁起见,省略噪声)可以表示为:
y
=
h
v
x
(1)
\mathbf{y} = \mathbf{h}\mathbf{v}x \tag{1}
y=hvx(1)
那么, 如何把数学建模里的 代表 波束成形向量 的
v
\mathbf{v}
v 与 我们平常所说的 将 天线阵列对准某个方向发射的物理意义对应呢?
正如我们生活中使用手电筒一样, 把手电筒照向某个方向, 其实就对应于最后某个方向是亮的, 而其他方向是暗的。 波束成形也是如此。 让波束成形后的天线阵列所谓对准某一方向, 指的就是在该方向上的信噪比显著地高于其他方向。
由于噪声的功率是一定的, 信噪比其实就是(1)中
y
\mathbf{y}
y的能量。 也就是:
P
=
y
H
y
=
∣
x
∣
2
∣
v
H
h
H
h
v
P=\mathbf{y}^H\mathbf{y}=|x|^2|\mathbf{v}^H\mathbf{h}^H\mathbf{h}\mathbf{v}
P=yHy=∣x∣2∣vHhHhv
由于
∣
x
∣
2
|x|^2
∣x∣2也是相同的, 因此对于同一波束成形的天线阵列, 不同方向的信噪比就取决于
∣
h
v
∣
2
|\mathbf{h}\mathbf{v}|^2
∣hv∣2.
这里先类比一下, 方便大家理解物理意义:
手电筒 | 波束成形 |
---|---|
改变手电筒的方向 | 改变天线阵列的波束成形向量 |
将手电筒照向某个方向 | 通过波束成形后天线阵列对准某个方向发送信号 |
某个方向的亮度 | 当前波束成形下某个方向的信噪比 |
将有限的能量聚焦于想看的方向 | 将有限的发送功率对准用户所在的方向 |
明白了物理意义, 现在我们来看如何判断当前的某个
v
\mathbf{v}
v,对应于朝向哪个方向发射。
首先, 根据MISO信道的建模, 我们有, 对于某个方向
ϕ
\phi
ϕ,
其对应的归一化ULA阵列信道为:
h
U
L
A
(
ϕ
)
=
1
N
[
1
,
e
−
j
π
cos
(
ϕ
)
,
…
,
e
−
j
π
(
N
−
1
)
cos
(
ϕ
)
]
\mathbf{h}_{\mathrm{ULA}}(\phi)=\frac{1}{\sqrt{N}}\left[1, e^{-j \pi \cos(\phi)}, \ldots, e^{-j \pi(N-1) \cos (\phi)}\right]
hULA(ϕ)=N1[1,e−jπcos(ϕ),…,e−jπ(N−1)cos(ϕ)]
将不同方向的信道络成一个大矩阵
H
\mathbf{H}
H, 其每一行对应于一个方向的
h
U
L
A
(
ϕ
)
\mathbf{h}_{\mathrm{ULA}}(\phi)
hULA(ϕ)信道, 那么我们只需要计算
v
H
H
H
H
v
\mathbf{v}^H\mathbf{H}^H\mathbf{H}\mathbf{v}
vHHHHv, 就能得到一个列向量, 其每一项代表了当前波束成形向量
v
\mathbf{v}
v在这个方向上的能量大小。
通过天线方向图和Matlab实例说明
接下来通过实例来说明:
令
v
=
1
N
[
1
,
e
j
π
cos
(
θ
)
,
…
,
e
j
π
(
N
−
1
)
cos
(
θ
)
]
T
\mathbf{v}=\frac{1}{\sqrt{N}}\left[1, e^{j \pi \cos(\theta)}, \ldots, e^{j \pi(N-1) \cos (\theta)}\right]^T
v=N1[1,ejπcos(θ),…,ejπ(N−1)cos(θ)]T
这其实是将天线阵列对准
θ
\theta
θ 方向发送的波束成形向量。
我们来验证他就是对准了
θ
\theta
θ 方向, 比如我们令其为 空间30度方向。
N = 16;
idx = (0 : N-1)';
angle_set = (1 : 1 : 360) / 180 * pi;
Hset = exp(1j * pi * idx * cos(angle_set));
theta = 30;
x = exp(1j * pi * idx * cos(theta / 180 * pi));
r = Hset' * x;
polarplot(angle_set, abs(r))
运行后, 就能得到文章开头的那张图了。 这是一个极坐标图, 可以清楚的看到, 在30度方向上是能量最大的, 而在其他绝大部分方向上, 能量为0。这也就是我们一开始说的, 通过有效的波束成形, 可以将能量集中, 让天线阵列对准某个方向发送。
也可以根据自己的画图需求改变一下坐标,比如将上面代码第三行替换为
angle_set = (0 : 0.01 : 180) / 180 * pi;
就是画出0~180度的响应, 并且将分辨率提升至0.01度。
效果如图:
我们可以试着改变
N
N
N, 即天线数的大小。
如N = 64;
可以明显的看到,波束更窄了, 能量更集中了。 这也是为什么天线数越多,通信性能越好的原因, 指向性也越为精准。
UPA的方向图
UPA的话就涉及两个角度了 仰角
ϕ
\phi
ϕ 和 水平角
θ
\theta
θ。 因此很难用二维的图进行绘制。
这里给出代码, 细节不再赘述, 和ULA的方法类似:
效果图:
主函数main.m
clear
M = UPA_code3(16, 32);
phi = -1 : 0.01 : 1;
theta = -1 : 0.01 : 1;
[aa, bb] = meshgrid(phi, theta);
Aset = []';
G = zeros(512, 1);
G(256+11) = 1;
s = M * G;
for i = 1 : length(phi)
a = phi(i);
for j = 1 : length(theta)
tmp = acos(a);
b = theta(j) / sin(tmp);
ar = UPA_arrayresponse2(16,32, acos(b), acos(a));
C(j,i) = abs(s' * ar);
end
end
surf(aa, bb, C)
调用的两个函数文件:
- UPA_code3.m
function [Aset] = UPA_code3(P,Q)
% P, Q: rows and columns of UPA
% theta, phi: AODs
Aset = [];
for n = 0 : 1 / P * pi : (P-1)/P*pi
for m = 0 : 1 / Q * pi : (Q-1)/Q*pi
A = zeros(P, Q);
for p = 1 : P
for q = 1 : Q
A(p, q) = exp(1j*pi*(q-1)*cos(m) * sin(n)+1j*pi*(p-1)*cos(n));
end
end
a = A(:);
Aset = [Aset, a];
end
end
- UPA_arrayresponse2.m
function [A] = UPA_arrayresponse2(P,Q, theta, phi)
% P, Q: rows and columns of UPA
% theta, phi: AODs
A = zeros(P, Q);
for p = 1 : P
for q = 1 : Q
A(p, q) = exp(1j*pi*(q-1)*sin(phi)*cos(theta)+1j*pi*(p-1)*cos(phi));
end
end
A = A(:);