利用CVX工具箱实现多快拍采样的稀疏矩阵DOA估计(多快拍视为独立的若干个单快拍,结果求均值)

参考文献:同上篇

方法:


论文中给出的仿真结果:


实验条件:入射角度:60°,70°,108°。


贴代码:

%date:2017.6.2
%author:Lola
%处理多点采样,将多点采样中的每一点看成是独立的单点采样,从而进行稀疏矩阵的DOA估计
clc 
clear all
close all

M = 8;                                                         %阵元数
K = 3;                                                         %信源数     
L1=1;
L11=1:40;                                                      %快拍数
d_lamda =0.5;                                                  %阵元间距半波长
w = [pi/4 pi/3 pi/2]';                                         %信号频率
theta1 = [15 20 55];                                           %信号来向
snr=20;                                                        %信噪比
p=length(L11);
q=length(theta1);                            


for LL=1:p
    L=L11(LL);                                                 %L为当前快拍数
for mc=1:L                                                     %将多次采样看成是很多个单次采样
for k=1:K
%     s=sqrt(10.^(snr/10))*exp(1j*w*[0:L1-1]);                        
s=sqrt(10.^(snr/10))*[1+1j*w];                         %信号(信源数*快拍数)
    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=10:0.3:61;
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(171) complex;
    minimize(square_pos(norm(X-AA*x,2))+2*norm(x,1));
cvx_end
Y=[];
m=1;
x1=conj(x);                                                       
power=x1.*x;                                              %求信号能量
xx=[(20*log10(power))].';                                 %转化成功率
[v,I]=findpeaks(xx);                                      %峰值搜索
[vv,II]=sort(v,'descend');
for ii=1:q
    m=II(ii);
    Y(ii)=I(m)*0.3;
end
YY(mc,:)=Y;
YY(mc,:)=sort(YY(mc,:));
end
YYY(LL,:)=[sum(YY(:,1)) sum(YY(:,2)) sum(YY(:,3))]/L;           %记录多次实验数值
YYY=roundn(YYY,-2);
end
plot(1:40,YYY(1:40,:),'-.');
xlabel('time sample');
ylabel('DOA/degree');
title('multiple time samples processing');
我的仿真结果:


仿真结果还是比较理想的。


说一下仿真中遇到的困难

1.峰值搜索部分,最开始是一个一个点搜索的,比较它与左右两点的值,但是这样的结果是错误的,因为还会有很多小伪峰出现,虽然小伪峰峰值的出现在视觉上不会让我们出现误解,但是计算机会把伪峰值对应的坐标值也误记为入射角度。所以采用了findpeaks()函数,这个也是今天学到的,后期我们可以通过截断的方式选取有限个峰值点。

2.因为论文里这种方法是进行多次重复试验取平均,最后的数值记录部分遇到了一点麻烦,想了很久怎么才能把每次实验的数值都以此计入我们需要的矩阵里。最后解决的办法就是国外某大学常跳楼的地方贴的标语:Think about low dimension.嗯,最后自己就是从2*2的数据试验了一下方法,拓展到40*3的就不难了。

这块记录一下吧,当时实验的是

I=[]
J=[]
for j=1:2;
    for i=1:2
        I(1,i)=i+j;
    end
    J(j,:)=I;
end
在命令窗口试一下就是

>> I


I =


     3     4


>> J


J =


     2     3
     3     4
以此类推得出的多次试验记录数据的方法。

3.画图部分,不知道怎么讲一个横坐标值对应多个纵坐标值,因为一个快拍数对应了3个估计角度。

依然"THINK ABOUT LOW DIMENSION",准备把这句话奉为真理,真的可以解决很多问题!

猜你喜欢

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