www.pudn.com > music.rar > music.m


%-------------------------------------------- 
 
%相干信号DOA估计MD(矩阵分解)算法  
%适用于均匀线阵 
%修正后的music算法 
%程序分为信源、全局变量定义、信号产生、预处理算法、DF算法、做图等几部分 
%盒子 于200803~200805期间研学,无版权 
%-------------------------------------------- 
 
clc; 
%1:信源 
%-------------------------------------------- 
Pd=2000; 
Fd=1; 
Fs=4*Fd; 
R=0.5; 
Delay=5; 
M=4; 
x1=randint(Pd,1,M); %生成一个随机数为2000*1的矩阵,输出范围为0~3 
x2=randint(Pd,1,M); 
y1=modmap(x1,Fd,Fs,'qask',M);%数字信号调制模拟信号,modmap可用scatterplot代替 
y2=modmap(x2,Fd,Fs,'qask',M); 
[rcv_a1,ti]=rcosflt(y1,Fd,Fs,'fir/sqrt/Fs',R,Delay);%对输入信号进行升余弦滤波 
[rcv_a2,ti]=rcosflt(y2,Fd,Fs,'fir/sqrt/Fs',R,Delay); 
s1=amodce(rcv_a1,10,'qam');%输出复包络,amodce可用ammod来代替,s1为8040*1 
% s2=amodce(rcv_a2,10,'qam'); 
s2=s1; %假设信号s1和s2相关 
save sig3 s1 s2 %把变量s1,s2保存为sig3.mat文件 
%-------------------------------------------- 
 
%2:全局变量定义 
%-------------------------------------------- 
% clear 
m=8; %阵元数 
angle1=-50;%信号角度 
angle2=60; 
th=[angle1;angle2];%th为2*1矩阵 
nn=1024;%采样数 
SN1=10;%信号的SNR 
SN2=10; 
SN3=12; 
sn=[SN1;SN2];%sn为2*1矩阵 
degrad=pi/180; 
%-------------------------------------------- 
 
%3:生成离散信号 
%-------------------------------------------- 
load sig3 %把sig3.mat文件中的s1,s2变量装入内存 
tt=1:nn; 
S=[s1(tt).';s2(tt).'];%S为2*1024矩阵 
nr=randn(m,nn);%nr为8*1024矩阵,为正态分布随机阵 
ni=randn(m,nn); 
U=nr+j*ni; %构造噪声源,U为8*1024复数矩阵 
Ps=S*S'/nn;%信号的协方差矩阵,Ps为2*2矩阵 
ps=diag(Ps);%取主对角线上值,ps为2*1矩阵 
refp=2*10.^(sn/10); 
tmp=sqrt(refp./ps);%tmp为2*1矩阵 
S2=diag(tmp)*S;%S2为2*1024矩阵 
%-------------------------------------------- 
 
%4:协方差矩阵及前后向平滑 
%-------------------------------------------- 
tmp2=[0:m-1]'; %阵元位置 
A=exp(-i*pi*tmp2*sin(th'*degrad)); %A为8*2矩阵,方向矩阵由公式得出 
X=A*S2+U;%X为8*1024矩阵,1024次采集后得到的数据,阵列接受信号 
Rxx=X*X'/nn;%Rxx为8*8矩阵,阵列接受信号协方差 
 
a=eye(8); 
b=a(:,8:-1:1);%构造交换矩阵 
RXX=(Rxx+b*Rxx.'*b)/2; 
%-------------------------------------------- 
 
%5:奇异值分解 
%-------------------------------------------- 
[Q,SS,W]=svd(RXX);  
Vu=Q(:,3:8 ); %小特征值对应的特征向量,即噪声子空间 
%-------------------------------------------- 
 
%6:做图 
%-------------------------------------------- 
th2=[-90:90]'; 
tmp2=[0:m-1]'; 
a2=-i*tmp2*pi*sin(th2'*degrad); 
A2=exp(a2); 
num=diag(A2'*A2); 
Ena=Vu'*A2; 
den=diag(Ena'*Ena); 
doa=num./den; 
semilogy(th2,abs(doa)); 
axis([-90 90 0.1 1e5]); 
grid on; 
hold on; 
%--------------------------------------------