DOA 常用算法包括 Capon、MUSIC、ESPRIT 算法等。
Capon 算法本质上是一个优化问题:
$$
\min\limits_{w} w^HR_xw \
s.t.\quad w^Ha(\theta)=1
$$
具体求解过程略过,最后求解结果为:
$$
\hat{w}=\frac{R_x^{-1}a(\theta)}{a^H(\theta)R_x^{-1}a(\theta)}
$$
代入求解得功率随
相比于直接使用观测数据的协方差阵
首先对
经过推导,得到 MUSIC 算法下的功率
ESPRIT 算法与前二者都不同,该算法并不通过搜索功率谱来得到
具体算法流程如下:
对观测数据的协方差阵
Us = U(:, 1: src_num);
Usx = Us(1: M - 1,:);
Usy = Us(2: M,:);
由于
$$
U_{sy} = \Psi U_{sx}
$$
这样就可以解出
由于理论上
生成导向矢量对应的矩阵
dist = 0.3;
M = 10;
lambda = c / f0;
A = exp([0: 1: M - 1]' * 2 * pi * dist / lambda * sin(theta) * -1j);
生成信号
f = [1, 3, 5, 6, 7] * 1e6;
s = exp(2 * pi * f' * 1j * t);
生成复高斯白噪声
snr = 12;
gm = gmdistribution(0, 1 / db2pow(snr));
gwn = zeros(M, N);
for i = 1: 1: M
gwn(i, :) = random(gm, N)' + 1j * random(gm, N)';
end
根据公式
$$
x=As+n
$$
可以生成出接收信号
分别运行 Capon 算法、MUSIC 算法、ESPRIT 算法,放在一张图上观察,结果如下:
Capon 算法和 MUSIC 算法都是通过搜索功率谱找峰值点进行估计,ESPRIT 算法则是直接给出源角度估计。
可以看到,Capon 算法无法很好的区分 70° 和 80° 的波束方向,其具体结果如下:
MUSIC 算法成功将所有角度都识别出来了,其具体结果如下:
非常接近真值,误差较小。
ESPRIT 算法在提前预知有 5 个源波方向的前提下,也能够很好地将角度预测出来,具体结果如下:
调整
第三幅图为 0.5 时的情况。
可以看到,当
但当
因此,MUSIC 算法
在我的实现中,Capon 算法只用
改变先验的信源数目为 3,重新进行估计,结果如下:
只有 ESPRIT 算法受到影响,只能识别出三个角度,具体值如下:
检测结果并不好。可见 ESPRIT 算法极其依赖预估的信源数目。
所有代码文件位于 src/
下,其中 Problem1.m, Problem2.m, Problem3.m
分别对应大作业说明书中的第 3, 4, 5 题。