├── 2D_DOA ├── L_array_2D_music_DOA.m ├── README.md ├── Two_dimensional_angle_face_arrays_unitary_esprit │ ├── main.m │ └── qq.m ├── Uniform_circle_array_2D_DOA_uca_esprit │ ├── VV.m │ ├── WW.m │ └── main.m └── Widening_Matrix_Beam_L_array_2D_DOA │ ├── R_hankel.m │ └── main.m ├── DOA estimation ├── esprit │ ├── esprit_main.m │ ├── readme.md │ └── tls_esprit.m ├── music.m ├── propagate_operator.m ├── readme.md ├── root_music.m └── ss_music │ ├── main.m │ ├── mssp.m │ └── ssp.m ├── README.md ├── basicmathfunction.m ├── beamforming ├── LCMV.m ├── LMS.m └── readme.md ├── info_source_estimation.m ├── mutual_prime_array_musicDOA.m ├── nested_array_visual_ssmusic_doa.m └── wideband_signal_DOA_ISM.m /2D_DOA/L_array_2D_music_DOA.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | clc 4 | twpi = 2*pi; 5 | rad = pi/180; 6 | deg = 180/pi; 7 | kelm = 8; %x轴、y轴各自的阵列数量 8 | snr = 10; %信噪比 9 | iwave = 3; %目标数 10 | theta = [10 30 50]; 11 | fe = [15 25 35]; 12 | n = 100; %快拍数 13 | dd = 0.5; %均匀阵列阵元间距 14 | d = 0:dd:(kelm-1)*dd; %x轴阵元分布 15 | d1 = dd:dd:(kelm-1)*dd; %y轴阵元分布 16 | Ax = exp(-j*twpi*d.'*(sin(theta*rad).*cos(fe*rad))); %x轴上阵元对应的方向矩阵 17 | Ay = exp(-j*twpi*d1.'*(sin(theta*rad).*sin(fe*rad))); %y轴上阵元对应的方向矩阵 18 | A = [Ax;Ay]; 19 | S = randn(iwave,n); 20 | X = A*S; %接收信号 21 | X1 = awgn(X,snr,'measured')%加入高斯白噪声 22 | Rxx = X1*X1'/n; %自相关函数 23 | [EV,D]=eig(Rxx); %求矩阵的特征向量和特征值 24 | [EVA,I]=sort(diag(D).'); %特征值按升序排列 25 | EV=fliplr(EV(:,I)); %左右翻转,特征值按降序排序 26 | Un=EV(:,iwave+1,end); %噪声子空间 27 | %按照方位角,仰角在0~89°范围内(取步长为1)构造空间谱函数 28 | for ang1=1:90 29 | for ang2 = 1:90 30 | thet(ang1)=ang1-1; 31 | phim1=thet(ang1)*rad; 32 | f(ang2)=ang2-1; 33 | phim2=f(ang2)*rad; 34 | a1=exp(-j*twpi*d.'*sin(phim1)*cos(phim2)); 35 | a2=exp(-j*twpi*d1.'*sin(phim1)*sin(phim2)); 36 | a=[a1;a2]; 37 | SP(ang1,ang2)=1/(a'*Un*Un'*a); 38 | end 39 | end 40 | SP=abs(SP); 41 | SPmax=max(max(SP)); 42 | SP = SP/SPmax; 43 | h=mesh(thet,f,SP); %绘制空间谱图 44 | set(h,'Linewidth',2) 45 | xlabel('elevation/degree') 46 | ylabel('azimath/degree') 47 | zlabel('magnitude/dB') 48 | -------------------------------------------------------------------------------- /2D_DOA/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /2D_DOA/Two_dimensional_angle_face_arrays_unitary_esprit/main.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | derad = pi/180; 4 | radeg = 180/pi; 5 | twpi = 2*pi; 6 | kelm = 8; %阵元间距 7 | dd = 0.5; %阵元分布 8 | d =-(kelm-1)/2*dd:dd:(kelm-1)/2*dd; %目标数 9 | iwave = 3; 10 | theta1 = [10 20 30]; 11 | theta2 = [20 25 15]; 12 | snr = 20; %信噪比(dB) 13 | n = 200; %快拍数 14 | A0 = exp(j*twpi*d.'*(sin(theta1*derad).*cos(theta2*derad)))/sqrt(kelm); %方向矩阵 15 | A1 = exp(j*twpi*d.'*(sin(theta1*derad).*sin(theta2*derad)))/sqrt(kelm); %方向矩阵 16 | S = randn(iwave,n) 17 | X0 =[]; 18 | for im=1:kelm 19 | X0=[X0;A0*diag(A1(im,:))*S]; 20 | end 21 | X=awgn(X0,snr,'measured'); 22 | L=iwave; 23 | J1=eye(kelm-1,kelm); 24 | J2=flipud(fliplr(J1)); 25 | Q=qq(kelm); 26 | Y=kron(Q',Q')*X; 27 | Q0=qq(kelm-1); 28 | K1=real(Q0'*J2*Q); 29 | K2=imag(Q0'*J2*Q); 30 | I=eye(kelm); 31 | Ku1=kron(I,K1); 32 | Ku2=kron(I,K2); 33 | Kv1=kron(K1,I); 34 | Kv2=kron(K2,I); 35 | E=[real(Y),imag(Y)]; 36 | Ey=E*E'/n; 37 | [V,D]=eig(Ey); 38 | EVAs=diag(D).'; 39 | [EVAs,I0]=sort(EVAs); 40 | EVAs=fliplr(EVAs); 41 | EVs=fliplr(V(:,I0)); 42 | Es=EVs(:,1:L); 43 | fiu=pinv(Ku1*Es)*Ku2*Es; 44 | fiv=pinv(Kv1*Es)*Kv2*Es; 45 | F=fiu+j*fiv; 46 | [VV,DD]=eig(F); 47 | EVA=diag(DD).'; 48 | u=2*atan(real(EVA))/pi; %估计出u 49 | v=2*atan(imag(EVA))/pi; %估计出v 50 | %估计出DOA 51 | theta10=asin(sqrt(u.^2+v.^2))*radeg 52 | theta20=atan(v./u)*radeg 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /2D_DOA/Two_dimensional_angle_face_arrays_unitary_esprit/qq.m: -------------------------------------------------------------------------------- 1 | %构造Q矩阵 2 | function p=qq(N) 3 | k=fix(N/2); 4 | I=eye(k); 5 | II=fliplr(I); 6 | if mod(N,2)==0 7 | p=[I,j*I;II,-j*II]/sqrt(2); 8 | else 9 | p=[I,zeros(k,1),j*I;zeros(1,k),sqrt(2),zeros(1,k);II,zeros(k,1),-j*II]/sqrt(2); 10 | end -------------------------------------------------------------------------------- /2D_DOA/Uniform_circle_array_2D_DOA_uca_esprit/VV.m: -------------------------------------------------------------------------------- 1 | function v=VV(b) 2 | m=-4:1:4; 3 | v=exp(j*m*b); -------------------------------------------------------------------------------- /2D_DOA/Uniform_circle_array_2D_DOA_uca_esprit/WW.m: -------------------------------------------------------------------------------- 1 | function w=WW(a,n) 2 | for i=0:1:n-1 3 | w(i+1)=(1/16)*exp(j*2*pi*a*i/n); 4 | end -------------------------------------------------------------------------------- /2D_DOA/Uniform_circle_array_2D_DOA_uca_esprit/main.m: -------------------------------------------------------------------------------- 1 | clc; 2 | close all; 3 | clear all; 4 | N=16; 5 | M=floor(N/4); 6 | m=-M:1:M;m1=-1:-1:-M; 7 | cv=diag([(j).^(m(1:M+1)),(j).^(m1(1:M))]); 8 | v=[]; 9 | for in=1:2*M+1 10 | v=[v,WW(in-5,N)']; 11 | end 12 | v=4*v; 13 | fe=v*cv'; 14 | a1=2*pi*m/(2*M+1); 15 | W1=[]; 16 | for in=1:2*M+1 17 | W1=[W1,VV(a1(in)).']; 18 | end 19 | W1=(1/3)*W1; 20 | Fr=fe*W1; 21 | x=[1,-1,1,-1,1,1,1,1,1]; 22 | c0=diag(x); 23 | x2=c0*W1; 24 | %%%%%%%%%%构造信号%%%%%%%%%%%%%% 25 | snap=500; %快拍数 26 | fs=1000; %采样频率 27 | t=[0:snap-1]/fs; 28 | M1=16; %阵元数 29 | N1=2; %目标数 30 | f=30e3; 31 | R=1/(4*sin(pi/M1)); 32 | snr=10; 33 | alpha=[10,20]; %波达方向 34 | theta=[15,35]; %波达方向 35 | uu=sin(alpha*pi/180).*exp(j*theta*pi/180); 36 | a1=[0:(M1-1)]'; 37 | for ii=1:N1 38 | rand('state',ii) 39 | s(ii,:)=exp(j*2*pi*(f*t+0.5*5*2^(ii-1)*t.^2)); 40 | end 41 | for in=1:N1 42 | A11(:,in)=exp(j*2*pi*cos(2*pi*a1/M1-theta(in)*pi/180)*sin(alpha(in)*pi/180)); 43 | end 44 | %%%%%%%%%%%%%%%%%%%%%% 45 | S=s; 46 | X0=A11*S; 47 | Y=awgn(X0,snr,'measured'); 48 | RR=Y*Y'/snap; 49 | RRR=Fr'*RR*Fr; 50 | [EV,D]=eig(real(RRR)); 51 | EVA=diag(D)'; 52 | [EVA,I]=sort(EVA); %升序排列 53 | EVA=fliplr(EVA); %左右翻转 54 | EV=fliplr(EV(:,I)); 55 | E=EV(:,1:N1); 56 | C0=[1,-1,1,-1,1,1,1,1,1]; 57 | C00=diag(C0); 58 | Z1=C00*W1*E; 59 | Z11=Z1(1:7,:); 60 | Z12=Z1(2:8,:); 61 | Z13=Z1(3:9,:); 62 | E1=[Z11,Z13]; 63 | T1=[-3,-2,-1,0,1,2,3]; 64 | T=1/pi*diag(T1); 65 | B=pinv(E1)*T*Z12; 66 | B1=B(1:2,:); 67 | [p,w]=eig(B1); 68 | asin(abs(diag(w)))*180/pi 69 | angle(diag(w))*180/pi -------------------------------------------------------------------------------- /2D_DOA/Widening_Matrix_Beam_L_array_2D_DOA/R_hankel.m: -------------------------------------------------------------------------------- 1 | function R=R_hankel(m,Rxy,N,Q) 2 | R1=[]; 3 | R2=[]; 4 | for mm=1:Q 5 | R1=[R1;Rxy(m,mm)]; 6 | end 7 | for i=1:N-Q+1 8 | R2=[R2,Rxy(m,i+Q-1)]; 9 | end 10 | R=hankel(R1,R2); -------------------------------------------------------------------------------- /2D_DOA/Widening_Matrix_Beam_L_array_2D_DOA/main.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | derad = pi/180; 4 | radeg = 180/pi; 5 | twpi = 2*pi; 6 | kelmx = 8; 7 | kelmy = 10; 8 | dd = 0.5; %阵元间距 9 | dx=0:dd:(kelmx-1)*dd; %x轴阵元分布 10 | dy=0:dd:(kelmy-1)*dd; %y轴阵元分布 11 | iwave = 3; %目标数 12 | L=iwave; 13 | theta1 = [10 30 50]; %波达方向 14 | theta2 = [15 35 55]; %波达方向 15 | snr = 20; %信噪比(dB) 16 | n = 200; %快拍数 17 | Ax = exp(-i*twpi*dx.'*(sin(theta1*derad).*cos(theta2*derad))); %x轴上阵元对应的方向矩阵 18 | Ay = exp(-i*twpi*dy.'*(sin(theta1*derad).*cos(theta2*derad))); %y轴上阵元对应的方向矩阵 19 | S=randn(iwave,n); 20 | X0 = Ax*S; %接收信号 21 | X = awgn(X0,snr,'measured');%加入高斯白噪声 22 | Y0 = Ay*S; 23 | Y = awgn(Y0,snr,'measured'); 24 | Rxy=X*Y'; %协方差矩阵 25 | P=5; 26 | Q=6; 27 | %---------------构造增广矩阵-------------------------- 28 | Re=[]; 29 | for kk=1:kelmx-P+1 30 | Rx=[]; 31 | for k=1:P 32 | Rx=[Rx;R_hankel(k+kk-1,Rxy,kelmy,Q)]; 33 | end 34 | Re=[Re,Rx]; 35 | end 36 | %---------------估计出uk和vk--------------------------- 37 | [Ue,Se,Ve] = svd(Re); 38 | Uesx=Ue(:,1:L); 39 | Uesx1=Uesx(1:(P-1)*Q,:); 40 | Uesx2=Uesx(Q+1:P*Q,:); 41 | Fx=pinv(Uesx1)*Uesx2; 42 | [EVx,Dx]=eig(Fx); 43 | EVAx=diag(Dx).'; 44 | for im=1:Q 45 | Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:); 46 | end 47 | Uesy1=Uesy(1:(Q-1)*P,:); 48 | Uesy2=Uesy(P+1:P*Q,:); 49 | Fy=pinv(Uesy1)*Uesy2; 50 | [EVy,Dy]=eig(Fy); 51 | EVAy=diag(Dy)'; 52 | F=0.5*Fx+0.5*Fy; 53 | [EV,D]=eig(F); 54 | P1=EV\EVx; 55 | P2=EV\EVy; 56 | P1=abs(P1); 57 | P2=abs(P2); 58 | P11=P1'; 59 | P21=P2'; 60 | [c,Px]=max(P11); 61 | [cc,Py]=max(P21); 62 | EVAx=EVAx(:,Px); %估计出uk 63 | EVAy=EVAy(:,Py); %估计出vk 64 | %---------------估计出DOA%--------------------------- 65 | theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg 66 | theta20=atan(angle(EVAy)./angle(EVAx))*radeg 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /DOA estimation/esprit/esprit_main.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | derad = pi/180; %角度——>弧度 4 | radeg = 180/pi; %弧度——>角度 5 | twpi = 2*pi; 6 | kelm = 8; %阵元数 7 | dd = 0.5; %阵元间距 8 | d=0:dd:(kelm-1)*dd; 9 | iwave = 3; %信源数 10 | theta = [10 20 30]; %波达方向 11 | snr = 10; %信噪比 12 | n = 500; %采样数 13 | A = exp(-j*twpi*d.'*sin(theta*derad)); %方向向量 14 | S = randn(iwave,n); %信源信号 15 | snr0=0:3:100; %信噪比 16 | 17 | for isnr=1:10 18 | X0=A*S; %接收信号 19 | X1=awgn(X0,snr0(isnr),'measured'); %添加噪声 20 | Rxx=X1*X1'/n; %计算协方差矩阵 21 | [EV,D]=eig(Rxx); %特征值分解 22 | EVA=diag(D)' 23 | [EVA,I]=sort(EVA); %特征值从小到大排序 24 | EVA=fliplr(EVA); %左右翻转,从大到小排序 25 | EV=fliplr(EV(:,I)); %对应特征向量排序 26 | estimates=(tls_esprit(dd,Rxx,iwave)); %调用子程序 27 | doaes(isnr,:)=sort(estimates(1,:)); 28 | end 29 | -------------------------------------------------------------------------------- /DOA estimation/esprit/readme.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /DOA estimation/esprit/tls_esprit.m: -------------------------------------------------------------------------------- 1 | function estimate = tls_esprit(dd,cr,Le) 2 | twpi = 2.0*pi; 3 | derad = pi / 180.0; 4 | radeg = 180.0 / pi; 5 | 6 | %对接收信号协方差矩阵进行特征值分解 7 | [K,KK]=size(cr); 8 | [V,D]=eig(cr); 9 | EVA=real(diag(D)'); 10 | [EVA,I]=sort(EVA); 11 | EVA=fliplr(EVA); 12 | EV=fliplr(V(:,I)); 13 | 14 | %构造E_{xy}和E_{xyz}=E_{xy}^H E_{xy} 15 | Exy=[EV(1:K-1,1:Le) EV(2:K,1:Le)]; 16 | E_xys = Exy'*Exy; 17 | 18 | %对E_xyz进行特征值分解 19 | [V,D]=eig(E_xys); 20 | EVA_xys = real(diag(D)'); 21 | [EVA_xys,I]=sort(EVA_xys); 22 | EVA_xys = fliplr(EVA_xys); 23 | EV_xys=fliplr(V(:,I)); 24 | 25 | %将EV_xys分解 26 | Gx=EV_xys(1:Le,Le+1:Le*2); 27 | Gy=EV_xys(Le+1:Le*2,Le+1:Le*2); 28 | 29 | %计算Psi=-Gx [Gy]^{-1} 30 | Psi = -Gx/Gy; 31 | %对Psi进行特征值分解 32 | [V,D]=eig(Psi); 33 | EGS = diag(D).'; 34 | [EGS,I]=sort(EGS); 35 | EGS = fliplr(EGS); 36 | EVS = fliplr(V(:,I)); 37 | 38 | %估计DOA 39 | ephi=atan2(imag(EGS),real(EGS)); 40 | ange=-asin(ephi/twpi/dd)*radeg; 41 | estimate(1,:)=ange; 42 | 43 | %功率估计 44 | T=inv(EVS); 45 | powe = T*diag(EVA(1:Le)-EVA(K))*T'; 46 | powe = abs(diag(powe).')/K; 47 | estimate(2,:)=powe; 48 | -------------------------------------------------------------------------------- /DOA estimation/music.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | derad = pi/180; %角度——>弧度 4 | radeg = 180/pi; %弧度——>角度 5 | twpi = 2*pi; 6 | kelm = 8; %阵元数 7 | dd = 0.5; %阵元间距 8 | d=0:dd:(kelm-1)*dd; 9 | iwave = 3; %信源数 10 | theta = [10 30 60]; %波达方向 11 | snr = 10; %信噪比 12 | n = 500; %采样数 13 | A = exp(-j*twpi*d.'*sin(theta*derad)); %方向向量 14 | S = randn(iwave,n); %信源信号 15 | X = A * S; %接收信号 16 | X1 = awgn(X,snr,'measured'); %添加噪声 17 | Rxx = X1*X1'/n; %计算协方差矩阵 18 | InvS=inv(Rxx); 19 | [EV,D]=eig(Rxx); %特征值分解 20 | EVA=diag(D)' 21 | [EVA,I]=sort(EVA); %特征值从小到大排序 22 | EVA=fliplr(EVA); %左右翻转,从大到小排序 23 | EV=fliplr(EV(:,I)); %对应特征向量排序 24 | 25 | %构造MUSIC空间谱函数 26 | for iang = 1:361 27 | angle(iang)=(iang-181)/2; 28 | phim=derad*angle(iang); 29 | a=exp(-j*twpi*d*sin(phim)).'; 30 | L=iwave; 31 | En=EV(:,L+1:kelm); %得到噪声子空间 32 | SP(iang)=(a'*a)/(a'*En*En'*a); 33 | end 34 | 35 | 36 | %作图 37 | SP=abs(SP); 38 | SPmax=max(SP); 39 | SP=10*log10(SP/SPmax); 40 | h=plot(angle,SP); 41 | set(h,'Linewidth',2) 42 | xlabel('angle/degree') 43 | ylabel('magnitude/dB') 44 | axis([-90 90 -60 0]) 45 | set(gca,'XTick',[-90:30:90]) 46 | grid on 47 | -------------------------------------------------------------------------------- /DOA estimation/propagate_operator.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | derad = pi/180; 4 | radeg = 180/pi; 5 | twpi=2*pi; 6 | kelm=16; %阵元数 7 | dd=0.5; %阵元间距 8 | d=0:dd:(kelm-1)*dd; 9 | iwave=3; %信源数 10 | theta=[10 20 30]; %DOA 11 | pw =[1 0.8 0.7]'; %信号功率 12 | nv =ones(1,kelm); %归一化噪声方差 13 | snr=20; %信噪比 14 | snr0=10^(snr/10); 15 | n=200; %样本数量 16 | A=exp(-j*twpi*d.'*sin(theta*derad)); %方向矩阵 17 | K=length(d); 18 | cr=zeros(K,K); 19 | L=length(theta); 20 | data=randn(L,n); 21 | data=sign(data); 22 | twpi=2.0*pi; 23 | derad=pi/180.0; 24 | s=diag(pw)*data; 25 | A1=exp(-j*twpi*d.'*sin([0:0.2:90]*derad)); 26 | received_signal = A*s; 27 | cx = received_signal+diag(sqrt(nv/snr0/2))*(randn(K,n)+j*randn(K,n)); 28 | Rxx=cx*cx'/n; 29 | 30 | %传播算子算法 31 | G=Rxx(:,1:iwave); 32 | H=Rxx(:,iwave+1:end); 33 | P=inv(G'*G)*G'*H; %传播算子矩阵 34 | Q=[P',-diag(ones(1,kelm-iwave))]; %Q矩阵 35 | 36 | for iang = 1:361 37 | angle(iang)=(iang-181)/2; 38 | phim=derad*angle(iang); 39 | a=exp(-j*twpi*d*sin(phim)).' 40 | SP(iang)=1/(a'*Q'*Q*a); 41 | end 42 | SP=abs(SP); 43 | SPmax=max(SP); 44 | SP=10*log10(SP/SPmax); 45 | %作图 46 | figure 47 | h=plot(angle,SP,'-k'); 48 | set(h,'Linewidth',2) 49 | xlabel('angle/degree') 50 | ylabel('magnitude/dB') 51 | axis([0 60 -60 0]) 52 | set(gca,'Xtick',[0:10:60]) 53 | grid on 54 | hold on 55 | legend('Propagator Method ') -------------------------------------------------------------------------------- /DOA estimation/readme.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /DOA estimation/root_music.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | %定义常数 4 | derad = pi/180; %角度——>弧度 5 | radeg = 180/pi; %弧度——>角度 6 | twpi = 2*pi; 7 | kelm = 8; %阵元数 8 | dd = 0.5; %阵元间距 9 | d = 0:dd:(kelm-1)*dd; 10 | iwave = 3; %信源数 11 | theta = [10 20 30];%波达方向 12 | snr = 10; %信噪比 13 | n=200; %采样数 14 | A=exp(-j*twpi*d.'*sin(theta*derad)); %方向向量 15 | S=randn(iwave,n); %信源信号 16 | X0=A*S; %接收信号 17 | X=awgn(X0,snr,'measured'); %添加噪声 18 | Rxx=X*X'; %计算协方差矩阵 19 | InvS=inv(Rxx); 20 | [EVx,Dx]=eig(Rxx); %特征值分解 21 | EVAx=diag(Dx)'; 22 | [EVAx,Ix]=sort(EVAx); %特征值从小到大排序 23 | EVAx=fliplr(EVAx); %左右翻转,从大到小排序 24 | EVx=fliplr(EVx(:,Ix)); %对应特征向量排序 25 | 26 | %Root-MUSIC 27 | Unx=EVx(:,iwave+1:kelm); %提取噪声子空间 28 | 29 | syms z 30 | pz = z.^([0:kelm-1]'); 31 | pz1 =(z^(-1)).^([0:kelm-1]); 32 | fz=z.^(kelm-1)*pz1*Unx*Unx'*pz; %构造多项式 33 | a = sym2poly(fz) %符号多项式——>数值多项式 34 | zx = roots(a) %求根 35 | rx = zx.'; 36 | [as,ad]=(sort(abs((abs(rx)-1)))); 37 | DOAest=asin(sort(-angle(rx(ad([1,3,5])))/pi))*180/pi %计算DOA角度 38 | 39 | -------------------------------------------------------------------------------- /DOA estimation/ss_music/main.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | derad = pi/180; 4 | radeg = 180/pi; 5 | twpi=2*pi; 6 | Melm=7; 7 | kelm=6; 8 | dd=0.5; 9 | d=0:dd:(Melm-1)*dd; 10 | iwave=3; 11 | theta=[0 30 60]; 12 | n=200 13 | A=exp(-j*twpi*d.'*sin(theta*derad)); 14 | 15 | %构造相干信源 16 | S0=randn(iwave-1,n); 17 | S=[S0(1,:);S0]; 18 | X0=A*S; 19 | X=awgn(X0,10,'measured'); 20 | Rxxm=X*X'/n; 21 | issp=1; %设置平滑算法模式 22 | 23 | %空间平滑 24 | if issp == 1 25 | Rxx=ssp(Rxxm,kelm); %平滑算法 26 | elseif issp == 2 27 | Rxx=mssp(Rxxm,kelm); %改进的平滑算法 28 | else 29 | Rxx=Rxxm; 30 | kelm=Melm; 31 | end 32 | [EV,D]=eig(Rxx); 33 | EVA=diag(D)';[EVA,I]=sort(EVA); 34 | EVA=fliplr(EVA),EV=fliplr(EV(:,I)); 35 | 36 | for iang = 1:361 37 | angle(iang)=(iang-181)/2; 38 | phim=derad*angle(iang); 39 | a=exp(-j*twpi*d(1:kelm)*sin(phim)).'; 40 | L=iwave; 41 | En=EV(:,L+1:kelm); 42 | SP(iang)=(a'*a)/(a'*En*En'*a); 43 | end 44 | SP=abs(SP); 45 | SPmax=max(SP); 46 | SP=10*log10(SP/SPmax); 47 | figure 48 | h=plot(angle,SP); 49 | set(h,'Linewidth',2) 50 | xlabel('angle/degree') 51 | ylabel('magnitude/dB') 52 | axis([-90 90 -60 0]) 53 | set(gca,'Xtick',[-90:30:90],'YTick',[-60:10:0]) 54 | grid on 55 | hold on 56 | legend('空间平滑MUSIC') 57 | 58 | -------------------------------------------------------------------------------- /DOA estimation/ss_music/mssp.m: -------------------------------------------------------------------------------- 1 | function crs=mssp(cr,K) 2 | [M,MM]=size(cr); 3 | N=M-K+1; 4 | J=fliplr(eye(M)); 5 | crfb=(cr+J*cr.'*J)/2; 6 | crs=zeros(K,K); 7 | for in=1:N 8 | crs = crs + crfb(in:in+K-1,in:in+K-1) 9 | end 10 | crs = crs / N; 11 | -------------------------------------------------------------------------------- /DOA estimation/ss_music/ssp.m: -------------------------------------------------------------------------------- 1 | function crs=ssp(cr,K) 2 | [M,MM]=size(cr); 3 | N=M-K+1; 4 | crs=zeros(K,K); 5 | for in=1:N 6 | crs = crs + cr(in:in+K-1,in:in+K-1) 7 | end 8 | crs = crs / N; 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Array-signal-processing 2 | 本书参考张小飞阵列信号处理的matlab实现 3 | -------------------------------------------------------------------------------- /basicmathfunction.m: -------------------------------------------------------------------------------- 1 | %创建矩阵 2 | %1 3 | clear 4 | A=[1 3 5;2 4 6;7 8 9]; 5 | A 6 | % 在第一个%%以前的代码自动成为一节 7 | % 这里11-16行是一节,光标放在其中任何一行,该节的背景色会高亮 8 | % 编辑器菜单-运行节,只运行当前节,方便调试代码,快捷键:ctrl+回车(Enter) 9 | %% 10 | % 用%%表示分节,直到下一个%%之前是一节 11 | %2 zero函数:创建全0矩阵 12 | clear 13 | A=zeros(3); 14 | A 15 | 16 | %% 分节后空格,可以注释文字,这是第三节 17 | clear 18 | %%不带空格写就不行了,这样不能分节,只是一行注释 19 | A=zeros(2,3); 20 | A 21 | 22 | %% 23 | %3 eyes函数:创建单位矩阵 24 | clear 25 | A=eye(3,4); 26 | A 27 | %% 28 | %4 ones函数:创建全1矩阵 29 | clear 30 | A=ones(3); 31 | A 32 | %% 33 | clear 34 | A=ones(2,4); 35 | A 36 | %% 37 | %5 rand函数:创建均匀分布随机矩阵 38 | clear 39 | A=rand(3,5); 40 | A 41 | %% 42 | %6 randn函数:创建正态分布随机矩阵 43 | clear 44 | A=randn(3,5); 45 | A 46 | %% 47 | %7 hankel函数:创建Hankel矩阵 48 | n=[3 2 1]; 49 | m=[1 5 9]; 50 | A=hankel(n,m); 51 | A 52 | %% 53 | % 54 | A=hankel(n); 55 | A 56 | %% 57 | %8 toeplitz函数:创建Toeplitz矩阵 58 | n=[1 2 3]; 59 | m=[1 5 9]; 60 | A=toeplitz(n); 61 | A 62 | %% 63 | % 64 | A=toeplitz(n,m); 65 | A 66 | %% 67 | %9 det函数:求方阵的行列式 68 | A=[1 3 6;2 4 5;1 2 3]; 69 | A 70 | det(A) 71 | %% 72 | %10 inv函数:求方阵的逆矩阵 73 | A=[1 3 6;2 4 5;1 2 3]; 74 | inv(A) 75 | %% 76 | %11 pinv函数:求矩阵的伪逆矩阵 77 | A=[1 3 6;2 4 5;1 2 3;1 1 1]; 78 | pinv(A) 79 | %% 80 | %12 rank函数:求矩阵的秩 81 | A=[1 3 6;2 4 5;1 2 3]; 82 | rank(A) 83 | %% 84 | %13 diag函数:抽取矩阵对角线元素 85 | A=[1 3 6;2 4 5;1 2 3]; 86 | m=diag(A); 87 | m 88 | %% 89 | % 90 | m=[1,2,3]; 91 | A=diag(m); 92 | A 93 | %% 94 | %14 fliplr函数:矩阵左右翻转 95 | A=[1 3 6;2 4 5;1 2 3]; 96 | A 97 | fliplr(A) 98 | %% 99 | %15 eig函数:矩阵特征值分解 100 | A=[1 3 6;2 4 5;1 2 3]; 101 | [V,D]=eig(A); 102 | V 103 | D 104 | %% 105 | %16 svd函数:矩阵的奇异值分解 106 | A=[1 3 6;2 4 5;1 2 3]; 107 | [U,S,V]=svd(A); 108 | U 109 | S 110 | V 111 | %% 112 | %17 矩阵转置和共轭转置 113 | A=randn(2,3)+j*randn(2,3); %创建一个复矩阵 114 | A 115 | A' 116 | A.' 117 | %% 118 | %18 awgn函数:添加高斯白噪声 119 | X=randn(2,5);%产生一个随机信号 120 | X 121 | Y=awgn(X,10,'measured');%添加高斯白噪声,信噪比为10dB 122 | Y 123 | %% 124 | %19-24 sin,cos,tan,asin,acos,atan 125 | sin(45*pi/180) 126 | cos(45*pi/180) 127 | tan(45*pi/180) 128 | asin(0.7071) 129 | acos(0.7071) 130 | atan(1) 131 | %% 132 | %25 abs函数:求复数的模 133 | a=-1; 134 | b=1+1j; 135 | abs(a) 136 | abs(b) 137 | %% 138 | %26 angle函数:求复数的相位角 139 | a=1+1j 140 | angle(a) 141 | %% 142 | %27 real函数:求复数的实部 143 | a=1+1j 144 | real(a) 145 | %% 146 | %28 imag函数:求复数的虚部 147 | a=1+1j 148 | imag(a) 149 | %% 150 | %29 sum函数:求和函数 151 | A=[1 3 6;2 4 5;1 2 3;1 1 1]; 152 | sum(A,1) 153 | sum(A,2) 154 | sum(A) 155 | %% 156 | %30 max函数:求最大值函数 157 | A=[1 3 6;2 4 5;1 2 3;1 1 1]; 158 | max(A,[],1) 159 | max(A,[],2) 160 | max(A) 161 | %% 162 | %31 min函数:求最小值函数 163 | A=[1 3 6;2 4 5;1 2 3;1 1 1]; 164 | min(A) 165 | min(A,[],1) 166 | min(A,[],2) 167 | %% 168 | %32 sort函数:排序函数 169 | A=[1 10 3;5 2 6;3 4 8] 170 | disp('-------1------'); 171 | A 172 | disp('-------2------'); 173 | sort(A) 174 | disp('-------3------'); 175 | sort(A,1) 176 | disp('-------4------'); 177 | sort(A,2) 178 | disp('-------5------'); 179 | sort(A,'descend') 180 | disp('-------6------'); 181 | [B,V]=sort(A) 182 | %% 183 | %33 ploy2sym函数:创建多项式 184 | c=[1 2 5 7]; 185 | y=poly2sym(c); 186 | y 187 | %% 188 | %34 sym2poly函数:符号多项式转换为数值多项式 189 | syms x; 190 | y=x^3+2*x^2+5*x+7; 191 | c=sym2poly(y); 192 | c 193 | %% 194 | %35 roots函数:多项式求根 195 | c=[1,2,5,7]; 196 | r=roots(c); 197 | r 198 | %% 199 | %36 size函数:求矩阵大小 200 | A=[1,2,3,4;5 6 7 8]; 201 | A 202 | [m,n]=size(A); 203 | m 204 | n -------------------------------------------------------------------------------- /beamforming/LCMV.m: -------------------------------------------------------------------------------- 1 | clc; 2 | close all 3 | clear all; 4 | M=18 ; %阵元数 5 | L=100 ; %快拍数 6 | thetas=10 ; %信号入射角度 7 | thetai=[-30 30];%干扰入射角度 8 | n=[0:M-1]'; 9 | 10 | vs=exp(-j*pi*n*sin(thetas/180*pi)); %信号方向向量 11 | vi=exp(-j*pi*n*sin(thetai/180*pi)); %干扰方向向量 12 | f=16000; %信号频率 13 | t=[0:1:L-1]/200; 14 | snr=10; %信噪比 15 | inr=10; %信干噪比 16 | xs=sqrt(10^(snr/10))*vs*exp(j*2*pi*f*t); %构造有用信号 17 | xi=sqrt(10^(inr/10)/2)*vi*[randn(length(thetai),L)+j*randn(length(thetai),L)]; 18 | %构造干扰信号 19 | noise=[randn(M,L)+j*randn(M,L)]/sqrt(2); %噪声 20 | X=xi+noise; %含噪信号 21 | R=X*X'/L; %构造协方差矩阵 22 | wop1=inv(R)*vs/(vs'*inv(R)*vs); %波束形成 23 | sita=48*[-1:0.001:1]; %波束形成 24 | v=exp(-j*pi*n*sin(sita/180*pi)); %扫描方向范围 25 | B=abs(wop1'*v); %扫描方向向量 26 | plot(sita,20*log10(B/max(B)),'k'); 27 | title('波束图'); 28 | xlabel('角度/degree'); 29 | ylabel('波束幅度/dB'); 30 | grid on 31 | axis([-48 48 -50 0]); 32 | hold off -------------------------------------------------------------------------------- /beamforming/LMS.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | clc 4 | M=16; %阵元数 5 | K=2; %信源数 6 | theta=[0 30]; %信号入射角度 7 | d=0.3; %阵元间距 8 | N=500; %采样数 9 | Meann=0; varn=1;%噪声均值、方差 10 | SNR=20; %信噪比 11 | INR=20; %信干噪比 12 | pp=zeros(100,N);pp1=zeros(100,N); 13 | rvar1=sqrt(varn)*10^(SNR/20); %信号功率 14 | rvar2=sqrt(varn)*10^(INR/20); %干扰功率 15 | for q=1:100 16 | s=[rvar1*exp(j*2*pi*(50*0.001*[0:N-1]));rvar2*exp(j*2*pi*(100*0.001*[0:N-1]+rand))]; %生成源信号 17 | A=exp(-j*2*pi*d*[0:M-1].'*sin(theta*pi/180)); %方向向量 18 | e=sqrt(varn/2)*(randn(M,N)+j*randn(M,N)); %噪声 19 | Y=A*s+e; %接收信号 20 | 21 | %LMS算法 22 | L=200 23 | de=s(1,:); 24 | mu=0.0005; 25 | w=zeros(M,1); 26 | for k=1:N 27 | y(k)=w'*Y(:,k); %预测下一个采样和误差 28 | e(k) = de(k)-y(k); %误差 29 | w = w + mu*Y(:,k)*conj(e(k)); %调整权向量 30 | end 31 | end 32 | %波束形成 33 | beam=zeros(1,L); 34 | for i=1:L 35 | a=exp(-j*2*pi*d*[0:M-1].'*sin(-pi/2+pi*(i-1)/L)); 36 | beam(i)=20*log10(abs(w'*a)); 37 | end 38 | %作图 39 | figure 40 | angle=-90:180/200:(90-180/200); 41 | plot(angle,beam); 42 | grid on 43 | xlabel('方向角/degree'); 44 | ylabel('幅度响应/dB'); 45 | figure 46 | for k=1:N 47 | en(k)=(abs(e(k))).^2; 48 | end 49 | semilogy(en);hold on 50 | xlabel('迭代次数'); 51 | ylabel('MSE'); 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /beamforming/readme.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /info_source_estimation.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | K=6; %天线数 4 | snr=-2; %信噪比 5 | theta=[10,16,20]; %DOA 6 | Sample = [10 20 30 40 60 80 100 120 150 200 300 400 600 900 1200]'; 7 | %快拍数 8 | C = 2; 9 | Ntrial = 200; 10 | jj = sqrt(-1); 11 | Ndoa = size(theta,2); 12 | Nsample = length(Sample); 13 | pdf_MDL=zeros(Nsample,Ndoa+2); 14 | proposedMethod = zeros(Nsample,Ndoa+2); 15 | Num_ref=[0:Ndoa+1]'; 16 | 17 | for nNsample =1:Nsample 18 | number_dEVD = zeros(Ndoa+2,1); 19 | SNR = ones(size(theta',1),1)*snr; 20 | T = Sample(nNsample); 21 | for nTrial = 1:Ntrial 22 | %============================ 23 | source_power=(10.^(SNR./10)); 24 | source_amplitude=sqrt(source_power)*ones(1,T); %信源标准差 25 | source_wave=sqrt(0.5)*(randn(T,Ndoa)+jj*randn(T,Ndoa)); 26 | st = source_amplitude.*source_wave.'; 27 | d0 = st(1,:).'; 28 | nt = sqrt(0.5)*(randn(K,T)+jj*randn(K,T)); 29 | A = exp(jj*pi*[0:K-1]'*sin(theta)); 30 | xt = A*st + nt; %接收信号 31 | %==============MDL准则============== 32 | [Ke,N]=size(xt); 33 | Rx=(xt*xt')./T; 34 | [u,s,v]=svd(Rx); 35 | sd=diag(s); 36 | a=zeros(1,K); 37 | for m=0:K-1 38 | negv = sd(m+1:K); 39 | Tsph = mean(negv)/((prod(negv))^(1/(Ke-m))); 40 | a(m+1)=T*(K-m)*log(Tsph)+m*(2*K-m)*log(T)/2; 41 | end 42 | [y,b]=min(a); 43 | dEVD = b - 1; 44 | p_dEVD = find(dEVD - Num_ref==0); 45 | number_dEVD(p_dEVD)=number_dEVD(p_dEVD)+1; 46 | end 47 | pdf_MDL(nNsample,1:end)=number_dEVD'/nTrial; 48 | end %=========================================== 49 | figure 50 | semilogx(Sample,pdf_MDL(:,Ndoa+1),'b:*') %绘制概率曲线 51 | legend('MDL') 52 | ylabel('Probability of Detection') 53 | xlabel('Number of Snapshots') 54 | axis([Sample(1),Sample(length(Sample)),0,1]) 55 | -------------------------------------------------------------------------------- /mutual_prime_array_musicDOA.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | clc 4 | derad = pi/180; 5 | radeg = 180/pi; 6 | twpi = 2*pi; 7 | kelm1 = 5; %子阵1阵元数 8 | kelm2 = 3; %子阵2阵元数 9 | dd = 0.5; %阵元间距 10 | n = 100; %快拍数 11 | snr = 10; %信噪比 12 | d1 = 0:kelm1*dd:(2*kelm2-1)*kelm1*dd; %子阵1阵元分布(这里是2×kelm2个阵元) 13 | d2 = 0:kelm2*dd:(kelm1-1)*kelm2*dd; %子阵2阵元分布 14 | theta = [10 20 30]; 15 | iwave = length(theta); %目标数 16 | A1=exp(-j*twpi*d1.'*sin(theta*derad)); %子阵1阵元对应的方向矩阵 17 | A2=exp(-j*twpi*d2.'*sin(theta*derad)); %子阵2阵元对应的方向矩阵 18 | S=randn(iwave,n); 19 | X01=A1*S; %接收信号 20 | X02=A2*S; 21 | X1=awgn(X01,snr,'measured'); %加入高斯白噪声 22 | X2=awgn(X02,snr,'measured'); 23 | Rxx1=X1*X1'/n; %自相关函数 24 | Rxx2=X2*X2'/n; 25 | InvS=inv(Rxx1); 26 | [EV,D]=eig(Rxx1); %求矩阵的特征向量和特征值 27 | EVA=diag(D)'; 28 | [EVA,I]=sort(EVA); %特征值按升序排序 29 | EVA=fliplr(EVA); %左右翻转,特征值按降序排序 30 | EV=fliplr(EV(:,I)); 31 | InvS1=inv(Rxx2); 32 | [EV1,D1]=eig(Rxx2); 33 | EVA1=diag(D1)'; 34 | [EVA1,I1]=sort(EVA1); 35 | EVA1=fliplr(EVA1); 36 | EV1=fliplr(EV1(:,I1)); 37 | step=0.01; %步长 38 | Angle=-90:step:90; %搜索范围 39 | %子阵1谱函数 40 | for iang=1:length(Angle) 41 | phim = derad*Angle(iang); 42 | a=exp(-j*twpi*d1*sin(phim)).'; 43 | L=iwave; 44 | En=EV(:,L+1:end); %噪声子空间 45 | SP1(iang)=(a'*a)/(a'*En*En'*a); 46 | end 47 | SP1=abs(SP1); 48 | SPmax1=max(SP1); 49 | SP1=10*log10(SP1/SPmax1); 50 | %子阵2谱函数 51 | for iang=1:length(Angle) 52 | phim=derad*Angle(iang); 53 | a=exp(-j*twpi*d2*sin(phim)).'; 54 | L=iwave; 55 | En1=EV1(:,L+1:end); 56 | SP2(iang)=(a'*a)/(a'*En1*En1'*a); 57 | end 58 | SP2=abs(SP2); 59 | SPmax2=max(SP2); 60 | SP2=10*log10(SP2/SPmax2); 61 | SP=SP1+SP2; 62 | h1=plot(Angle,SP1); %绘制空间谱函图 63 | set(h1,'Linewidth',2) 64 | hold on 65 | h2=plot(Angle,SP2); 66 | set(h2,'Linewidth',2) 67 | xlabel('angle/degree') 68 | ylabel('magnitude/dB') 69 | axis([0 60 -40 10]) 70 | set(gca,'Xtick',[-90:10:90]) 71 | grid on 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /nested_array_visual_ssmusic_doa.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | clc 4 | %嵌套阵列SS-MUSIC算法DOA估计 5 | derad=pi/180; 6 | twpi=2*pi; 7 | theta=[10 20 30]; %目标角度 8 | snr=20; %信噪比 9 | n=500; %快拍数 10 | iwave=length(theta); %目标数 11 | 12 | dd=0.5; %阵元间距 13 | N1=3; %第一级阵列阵元数 14 | N2=3; %第二级阵列阵元数 15 | d1=dd*(0:N1-1); %第一级阵列阵元位置 16 | d2=dd*(N1+(0:N2-1)*(N1+1)); %第二级阵列阵元位置 17 | d=sort(unique([d1,d2])); %去掉重复项 18 | DOF=N2*(N1+1)-1; %虚拟阵列阵元 19 | 20 | A=exp(-j*2*pi*d.'*sin(theta*derad)); %方向向量 21 | S=randn(iwave,n); %信号向量 22 | X0=A*S; %阵列输出矩阵 23 | X=awgn(X0,snr,'measured'); %模拟阵列输出信号(加入噪声) 24 | Rxx=X*X'/n; %实际接收协方差矩阵 25 | z=vec(Rxx); %向量化 26 | D=[]; 27 | 28 | for i=1:length(d) 29 | for ii=1:length(d) 30 | D(i,ii)=d(i)-d(ii); %差分阵 31 | end 32 | end 33 | Dv=vec(D); 34 | Dv1=sort(unique(Dv)); %去掉相同项 35 | for i=1:length(Dv1) 36 | dat=Dv1(i); 37 | pos=find(Dv==dat); 38 | zt(i,1)=mean(z(pos)); 39 | end 40 | 41 | Rz=zeros(DOF+1,DOF+1); %构造空间平滑矩阵 42 | for i=1:DOF+1 43 | zt1=zt(i:DOF+i); 44 | Rz=Rz+zt1*zt1'; 45 | end 46 | Rz=Rz/(DOF+1); %得到差分阵的协方差矩阵 47 | Rz=sqrtm(Rz); 48 | 49 | %MUSIC算法 50 | [Enf,~]=eigs(Rz,DOF+1-iwave,'sm'); %返回M-K个小特征值作为噪声特征值 51 | En=fliplr(Enf); 52 | d0=0:DOF; 53 | for iang=1:9000 54 | angle(iang)=iang/100; 55 | phim=derad*angle(iang); 56 | a=exp(-j*twpi*d0*0.5*sin(phim)).'; 57 | SP(iang)=(a'*a)/(a'*En*En'*a); 58 | end 59 | SP=abs(SP); 60 | SP=SP/max(SP); 61 | SP=10*log10(SP); 62 | [peak,ad]=findpeaks(SP); %找出谱峰对应角度 63 | [peak,ads]=sort(peak,'descend'); %降序排序 64 | anglen=(ad(:,ads)); 65 | angle1=anglen/100; 66 | angle1=angle1([1,2,3]); 67 | angle1=sort(angle1); 68 | 69 | h=plot(angle,SP,'-black'); %得到空间谱图 70 | set(h,'Linewidth'); 71 | axis([0 40 -60 0]) 72 | xlabel('angle/degree') 73 | ylabel('magnitude/dB') -------------------------------------------------------------------------------- /wideband_signal_DOA_ISM.m: -------------------------------------------------------------------------------- 1 | clc 2 | clear all 3 | close all 4 | M=12; %阵元数 5 | N=200; %快拍数 6 | ts=0.01; %时域采样间隔 7 | f0=100; %入射信号中心频率 8 | f1=80; %入射信号最低频率 9 | f2=120; %入射信号最高频率 10 | c=1500; %声速 11 | lambda=c/f0; %波长 12 | d=lambda/2; %阵元间距 13 | SNR=15; %信噪比 14 | b=pi/180; 15 | theat1=30*b; %入射信号波束角1 16 | theat2=0*b; %入射信号波束角2 17 | n=ts:ts:N*ts; 18 | theat=[theat1 theat2]'; 19 | %%%%%%%%%%%%%%%%%%%%%%%%%%produce signal 20 | s1=chirp(n,80,1,120); %生成线性调频信号1; 21 | sa=fft(s1,2048); %进行FFT 22 | %figure,%specgram(s1,256,1E3,256,250); %频谱图 23 | s2=chirp(n+0.100,80,1,120); %生成线性调频信号2 24 | sb=fft(s2,2048); %进行FFT 25 | 26 | %%%%%%%%%%%%%ISM算法 27 | P=1:2; 28 | a=zeros(M,2); 29 | sump=zeros(1,181); 30 | for i=1:N 31 | f=80+(i-1)*1.0; 32 | s=[sa(i) sb(i)]'; 33 | for m=1:M 34 | a(m,P)=exp(-j*2*pi*f*d/c*sin(theat(P))*(m-1))'; 35 | end 36 | R=a*(s*s')*a'; 37 | [em,zm]=eig(R); 38 | [zm1,pos1]=max(zm); 39 | for l=1:2 40 | [zm2,pos2]=max(zm1); 41 | zm1(:,pos2)=[]; 42 | em(:,pos2)=[]; 43 | end 44 | k=1; 45 | for ii=-90:1:90 46 | arfa=sin(ii*b)*d/c; 47 | for iii=1:M 48 | tao(1,iii)=(iii-1)*arfa; 49 | end 50 | A=[exp(-j*2*pi*f*tao)]'; 51 | p(k)=A'*em*em'*A; 52 | k=k+1; 53 | end 54 | sump=sump+abs(p); 55 | end 56 | pmusic=1/33*sump; 57 | pm=1./pmusic; 58 | thetaesti=-90:1:90; 59 | plot(thetaesti,20*log(abs(pm))); %绘制空间谱 60 | xlabel('入射角/degree'); 61 | ylabel('空间谱/dB'); 62 | grid on 63 | 64 | 65 | --------------------------------------------------------------------------------