参考文献:同上篇
方法:
论文中给出的仿真结果:
实验条件:入射角度: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",准备把这句话奉为真理,真的可以解决很多问题!