admin 发表于 2023-4-21 22:53:44

基于MATLAB的MUSIC算法程序

%MUSIC spectrum
clear all;
clc;
%参数赋值
c=3.0e+8;                                             %光速
lmda=0.24;                                          %L波段
fc=c/lmda;                                          %载频
N=16;                                                 %阵元数
DOA_sigA=0;                                       %信号源1来波方向与阵法线方向夹角
DOA_sigB=20;                                          %信号源2来波方向与阵法线方向夹角
d=lmda/2;                                             %阵元间距
fs=1.0e+3;                                          %采样率
chirp_rateA=20;
chirp_rateB=10;                                       %调频率
P=2;                                                %信源数
%计算信源复包络
t=';                                        %采样时间
s1=exp(j*pi*chirp_rateA*t.^2);                                    
s2=exp(j*pi*chirp_rateB*t.^2);
% carw=exp(j*2*pi*fc*t);                              %载波
% sc1=s1.*carw;                                       %信源复包络                                       
% sc2=s2.*carw;

%产生方向矢量1(steering vector)
sv_sigA=[];
for i=1:N
    sv_sigA=;
end
T1=[];
for i=1:N
    Ei=i;
    sitai=i+1;
    T1=;
end
sv_sigA1=diag(T1)*sv_sigA;
%产生方向矢量2(steering vector)
sv_sigB=[];
for i=1:N
    sv_sigB=;
end
T2=[];
for i=1:N
    Ei=i-0.5;
    sitai=i;
    T2=;
end
sv_sigB1=diag(T2)*sv_sigB;
%N元等距线阵接收信号矢量
x=*+randn(N,length(t));
%阵列输出协方差矩阵
Rx=zeros(N,N);
for i=1:length(t)
    Rx=Rx+x(:,i)*x(:,i)';
end
Rx=Rx/length(t);
%对R做特征值分解
=eig(Rx);%按照特征值从小到大排列在D的对角线上。
%get the noise subspace.
noise_subspace=V(:,1:N-P);
%搜寻谱峰
MUSICSpec=[];
for sita=-pi/2:1/100:pi/2;
    sv_sita=[];
    for i=1:N
      sv_sita=;
    end
   
    s=0;
    for k=1:N-P;
      s=abs((noise_subspace(:,k))'*sv_sita)^2+s;
    end
    MUSICSpec=;
end
%搜寻谱峰
MUSICSpec_en=[];
for sita=-pi/2:1/100:pi/2;
    sv_sita=[];
    for i=1:N
      sv_sita=;
    end
   
    s=0;
    for k=1:N-P;
      s=abs((noise_subspace(:,k))'*sv_sita)^2/D(k,k)+s;%按照特征值的大小进行加权处理
    end
    MUSICSpec_en=;
end
%搜寻谱峰(maximal likelihood method)
%估计噪声功率.
deltn=0;
for m=1:N-P
    delt=abs(D(m+1,m+1)-D(m,m))/D(m,m);
    deltn=deltn+D(m,m);
end
deltn=deltn/(N-P);
clear delt;
%maximal likelihood signal subspace
ML_sigsubspace=zeros(N,N);
for m=N-P+1:N
    ML_sigsubspace=ML_sigsubspace+deltn*(D(m,m)/(D(m,m)-deltn)^2)*V(:,m)*V(:,m)';
end
MUSICSpec_ML=[];
for sita=-pi/2:1/100:pi/2;
    sv_sita=[];
    for i=1:N
      sv_sita=;%sv_sita 以列向量形式表示。
    end
    s=(sv_sita'*noise_subspace*noise_subspace'*sv_sita)/(sv_sita'*ML_sigsubspace*sv_sita);
    MUSICSpec_ML=;
end
%绘图
sita=-pi/2:1/100:pi/2;
sita_deg=sita*180/pi;
MUSICSpec_log=10*log10(abs(MUSICSpec/max(MUSICSpec)));
MUSICSpec_en_log=10*log10(abs(MUSICSpec_en/max(MUSICSpec_en)));
MUSICSpec_ML_log=10*log10(abs(MUSICSpec_ML/max(MUSICSpec_ML)));

figure(1)
plot(sita_deg,MUSICSpec_log)
grid
axis([-90,90,-40,0])
title('DOA估计图-MUSICSpec')
xlabel('方位角(度)')
ylabel('输出功率(dB)')
hold on
stem(DOA_sigA,-10,'*')
stem(DOA_sigB,-10,':')

figure(2)
plot(sita_deg,MUSICSpec_en_log)
grid
axis([-90,90,-40,0])
title('DOA估计图-MUSICSpeEn')
xlabel('方位角(度)')
ylabel('输出功率(dB)')
hold on
stem(DOA_sigA,-10,'*')
stem(DOA_sigB,-10,':')

figure(3)
plot(sita_deg,MUSICSpec_ML_log)
grid
axis([-90,90,-60,0])
title('DOA估计图-MUSICSpeML')
xlabel('方位角(度)')
ylabel('输出功率(dB)')
hold on
stem(DOA_sigA,-10,'*')
stem(DOA_sigB,-10,':')
页: [1]
查看完整版本: 基于MATLAB的MUSIC算法程序