利用CVX工具箱实现单快拍的稀疏矩阵DOA估计

最近在学习压缩感知方面的知识,正好自己的研究方向是DOA估计,看到相关方法就拿来试一试,现在把过程记录下来吧,作为一个小菜鸡,成功的那一秒钟真想给自己鼓鼓掌。

参考文献:D. Malioutov, M. Cetin and A. S. Willsky, "A sparse signal reconstruction perspective for source localization with sensor arrays," in IEEE Transactions on Signal Processing


写在之前:

论文里的这段话,写明了稀疏矩阵的估计方法不需要繁杂的统计数值以设置初始变量(ML方法的不足),克服低信噪比,快拍数小,相干信号源的情况下算法性能下降甚至失效的缺点(MUSIC等算法)。


其实个人感觉稀疏矩阵的重构算法还是有相当一部分内容与MUSIC算法相似的。


其中的约束条件为


MATLAB仿真思路就是根据这一部分完成的。


首先完成这次仿真需要用到CVX工具箱,我是在CVX的网站申请了academic license,具体的安装步骤在论坛其他博客下搜索,在这里就不赘述了。

CVX的使用比较简单,用户手册写的比较清楚,代码的可读性也比较高。


开始:

1.首先声明相关变量,这里仿真的是均匀线阵,先从最简单的做起。


2.构造信号


阵列流型部分跟MUSIC算法仿真过程中的一致。

3.构造观测矩阵,也就是论文里的A,论文里说明了A包含了所有可能位置的信息,因此A是已知的。

.

4.利用CVX工具箱找到符合条件的x的值,也就是在一个有(n_theta)*1表示n个可能位置的矢量中,其中和真实波达方向位置相同的点与第二部分构造的信号值相同,其余不是波达方向的位置的点为0,这里有很重要的一点就是x是未知数,是我们要求解的值,上述说明仅供理解,最开始以为x已知,绕了很多弯子浪费了好多时间。

.

最后

两个很尖锐的峰值所对应就坐标值就是波达方向了。试了一下,两个角度间隔越大,峰越尖锐,但是已经比MUSIC算法和Beamforming好多了,至少不会混成一个峰,还是可以有效检测的。

clc 
clear all
close all

M = 8;                                                         %阵元数
K = 2;                                                         %信源数
L= 1;                                                          %快拍数
d_lamda =0.5;                                                  %阵元间距半波长
w = [pi/4 pi/3]';                                              %信号频率
theta1 = [0 15];                                               %信号来向
snr=20;                                                        %信噪比

for k=1:K
    s=sqrt(10.^(snr/10))*exp(1j*w*[0:L-1]);                    %信号(信源数*快拍数)
    for kk=1:M
         A(kk,k)=exp(-1j*2*pi*(kk-1)*d_lamda*sin(theta1(k)*pi/180)); %阵列流型(阵元数*信源数)
    end
end
X=A*s;
X=awgn(X,snr);                                                 %加入高白噪声
AA=[];                                                         %构造过完备基
theta=-90:90;
for kkk= 1:length(theta) 
    g=exp(-1j*2*pi*[0:M-1]'*d_lamda*sin(theta(kkk)/180*pi)); 
    AA=[AA,g]; 
end 
cvx_begin
    variable x(181);
    minimize(square_pos(norm(X-AA*x,2))+2*norm(x,1));
cvx_end
searching_doa=-90:90;
plot(searching_doa,20*log10(x),'r');
xlabel('DOA/degree');
ylabel('PowerdB');


写在最后:做仿真不难,难的是理解,论文真的要多看几遍才知道个中真理,写博客也是为了以后写论文练手,锻炼下自己的语言表达能力,这种我知道什么意思但是我说不清楚的感觉很难受。嗯。今天就到这里了,可能有写的不对的地方,欢迎交流。

猜你喜欢

转载自blog.csdn.net/weixin_38452468/article/details/72835781
今日推荐