clear all;
close all;
%% MUSIC algorithm
% 2019-11-02
%%
dread = pi/180;
N = 3;%阵元个数
M = 2;%信源个数
K = 1024;
snr = 10;
theta =[-30,10,20];%待估角度
lamda = 1;%波长
d = 0:lamda/2:(N-1)*lamda/2;%阵列
A = exp(-1i*2*pi*d.'*sin(dread *theta));
%%
S = randn(M,K);
X = A*S;
X1 = awgn(X,snr,'measured');
Rxx = X1 * X1'/K;
% Rxx = [3 0 -2;0 3 0;-2 0 3];
[EV,D] = eig(Rxx);
EVA = diag(D)';
[EVA,I] = sort(EVA);
EV = fliplr(EV(:,I));
%%
for iang = 1:361
   angle(iang) = (iang-181)/2;
    phim =dread * angle(iang);
    a = exp(-1i * 2*pi*d*sin(phim)).';% .' is 数组转置
    En = EV(:,M+1:N);
    SP(iang) = 1/(a'* En * En'* a);  
end
%%
SP = abs(SP);
SP = 10*log10(SP);
h = plot(angle,SP);
set(h,'Linewidth',0.5);
xlabel('入射角/°');
ylabel('空间谱/dB');
set(gca,'XTick',[-100:20:100]);
grid on;
%%

%% 此算法是参照博客改动的 在理解了MUSIC算法之后,自己改动一些

clear all;
close all;
% root MUSIC algorithm
% 2019-11-02
% code by wk
dread = pi/180;
N = 10;%阵元个数
M = 3;%信源个数
K = 1024;
snr = 10;
theta =[-30,10,20];%待估角度
lamda = 1;%波长
d = 0:lamda/2:(N-1)*lamda/2;%阵列
A = exp(-1i*2*pi*d.'*sin(dread *theta));
S = randn(M,K);
X = A*S;
X1 = awgn(X,snr,'measured');
Rxx = X1 * X1'/K;
% Rxx = [3 0 -2;0 3 0;-2 0 3];
[EV,D] = eig(Rxx);
EVA = diag(D)';
[EVA,I] = sort(EVA);
EV = fliplr(EV(:,I));
En = EV(:,M+1:N);
G =En *En';
m = zeros(1,2*N-1);
for i = -(N-1):(N-1)
    m(N+i) = sum(diag(G,i));  %这一步跟自己推导的不一致? 
end
a = roots(m);
a1 = a(abs(a)<1);
[lam,I] = sort(abs(abs(a1)-1));
f = a1(I(1:M));
source_doa=zeros(1,M);
for j = 1:M
  source_doa(j)=asin(angle(f(j))/pi)*180/pi;  
end
disp('doa');
disp(source_doa);

%%根据博客看明白了公式推导 然后上面提出自己的疑问,上面在于b1n和bn1(多项式系数)和自己推导不同,按照自己的,%结果为正确的相反数。

clear all;
close all;
%% ESPRIT algorithm
% 2019-11-05
% code by wk
%%
dread = pi/180;
N = 10;%阵元个数
M = 3;%信源个数
K = 1024;
snr = 10;
theta =[-30,40,60];%待估角度
lamda = 1;%波长
d = 0:lamda/2:(N-1)*lamda/2;%阵列
A = exp(-1i*2*pi*d.'*sin(dread *theta));
S = randn(M,K);
X = A*S;
X1 = awgn(X,snr,'measured');
%%
Rxx = X1 * X1'/K;
[EV,D] = eig(Rxx);
EVA = diag(D)';
[EVA,I] = sort(EVA);
EV = fliplr(EV(:,I));%按特征值从大到小排序
s = EV(:,1:M);%信号子空间
s1 = s(1:N-1,:);
s2 = s(2:N,:);
wa = s2/s1;%s2/s1 =s2*s1^-1;s2\s1 =s2^-1*s1
[Ew,Dw] = eig(wa);
f= diag(Dw)'; 
source_doa=zeros(1,M);
for j = N-M:N-1
  source_doa(j-(N-M)+1)=asin(angle(f(j))/pi)*180/pi;  
end
disp('source_doa');
disp(source_doa);

%这个算法在看完书之后,理解到就能很快写出代码。

clear all;
close all;
%% TLS-ESPRIT algorithm
% 2019-11-05
% code by wk
%%
dread = pi/180;
N = 10;%阵元个数
M = 3;%信源个数
K = 1024;
snr = 10;
theta =[-50,30,60];%待估角度
lamda = 1;%波长
d = 0:lamda/2:(N-1)*lamda/2;%阵列
A = exp(-1i*2*pi*d.'*sin(dread *theta));
S = randn(M,K);
X = A*S;
X1 = awgn(X,snr,'measured');
Rxx = X1 * X1'/K;
[EV,D] = eig(Rxx);
EVA = diag(D)';
[EVA,I] = sort(EVA);
EV = fliplr(EV(:,I));%按特征值从大到小排序
s = EV(:,1:M);%信号子空间
s1 = s(1:N-1,:);
s2 = s(2:N,:);
s12 = [s1,s2];
[Es,Ds] = eig(s12'* s12);
Ess = diag(Ds)';
[Ess,I] = sort(Ess);
Es = fliplr(Es(:,I));%按特征值从大到小排序,找出最小的特征值约等于0.
C = mat2cell(Es,[M,M],[M M]);
U12 = cell2mat(C(1,2));
U22 = cell2mat(C(2,2));
fi = -1*(U12/U22);
[Ef,Df] = eig(fi);
f = diag(Df)'; 
source_doa=zeros(1,M);
for j = 1:M
  source_doa(j)=asin(angle(f(j))/pi)*180/pi;  
end
disp('doa angle:');
disp(sort(source_doa));
%%这个出现的问题在s12'* s12的特征值分解,只是单纯的分解,但是特征值对应的特征向量有关系,需考虑有M个入射角度,

%但总共2M*2M的矩阵,意味着有M列的噪声,所以按照博客的算法分析,需要将信号矩阵和噪声矩阵排序,找到噪声矩阵。

MUSIC和ESPRIT算法相关推荐

  1. DOA算法2:ESPRIT算法

    目录 算法简述 算法要得到什么 如何得到矩阵 Φ \Phi Φ ESPRIT算法的步骤 参考文献(仅写文章的标题,以做记录) 注:本博文为本人阅读论文.文章后的原创笔记,未经授权不允许任何转载或商用行 ...

  2. 基于ESPRIT算法对DoA的估计

    对于ESPRIT算法利用了相邻子阵间存在一个固定间距,这个固定间距反映出各相邻子阵间的一个固定关系.用ESPRIT算法需要假设:1.阵列形式为线性均匀阵,阵元间距不大于信号波长的二分之一.2.存生两个 ...

  3. DOA——ESPRIT算法

    相位phei = 2*pi*f*d*sind(theta),因此理论上来讲测向的算法都可以用来测频. ESPRIT:Estimating signal parameters viarotational ...

  4. 常见传统算法实现DOA估计总结CBF、Capon、MUSIC、ESPRIT、OMP

    常见传统算法DOA估计总结 CBF算法 传统时域傅里叶谱估计方法在空域中简单拓展形式,空间分辨能力会受到"瑞利限"的限制 Capon算法 通过对与信号协方差矩阵以及阵列方向矢量相关 ...

  5. 使用ESPRIT,LS-ESPRIT,Music以及Root-Music四种算法进行角度估计matlab仿真

    目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 1.1ESPRIT ESPRIT算法全称为:Estimation of Signal Parameters using Rotationa ...

  6. 【阵列信号处理】DOA估计算法

    DOA估计中的ESPRIT算法 ESPRIT算法时一种利用子空间旋转法估计DOA参数的方法,其算法的基本思想是将阵列在结构上分成两个完全一致的子列,两个子列相应阵元偏移的距离相等,也就是说阵列的阵元被 ...

  7. 雷达测角方法(MUSIC ESPRIT)

    雷达测角方法(MUSIC ESPRIT)) MUSIC测角 圆阵MUSIC测角仿真 圆阵MUSIC解相干仿真 极化圆阵MUSIC测角 ESPRIT测角 圆阵ESPRIT测角 圆阵ESPRIT测角仿真 ...

  8. 读书笔记 | 自动驾驶中的雷达信号处理(第6章 到达方向(DOA)估计算法 )

    本文编辑:调皮哥的小助理 6.1介绍 DOA 估计算法在汽车应用雷达处理中非常重要,它构成了雷达数据立方体(距离.速度和角度)的第三个部分--角度.实际上,会有多个未知数量的源信号同时被接收阵列接收, ...

  9. 阵列算法matlab,阵列信号处理的常见算法

    阵列处理算法常用程序 AR argamse.m armaorder.m lsar.m lsarma.m myprogramme.m mywarma.m yulewalker.m ESPRIT TAM算 ...

最新文章

  1. c语言编写atm取款功能_21行C语言代码编写一个具备加密功能的聊天程序!网友:666...
  2. 仓鼠体重年龄对照表_各年龄段血糖,血压,血脂,尿酸对照表,内容太值!
  3. PPT 下载 | 龙创悦动游臣隽:数据在游戏行业的落地应用实践
  4. wkwebview html5页面,iOS使用WKWebView加载HTML5不显示屏幕宽度的问题解决
  5. csu 1548: Design road (三分)
  6. mysql --prompt
  7. 【dfs】通行证(jzoj 2013)
  8. 云图说 | 3分钟创建一个游戏类工作负载
  9. IE10、IE11使用 __doPostBack 出现未定义问题
  10. 软件设计师10-面向对象-设计模式
  11. Android轻松实现语音识别
  12. angular 居中_Angular 的模块间通信
  13. php表决器代码,三人表决器:VHDL源代码
  14. 语音处理:Python实现音频文件声道分离批量处理
  15. Android自定义控件--圆形进度条(中间有图diao)
  16. 4G关键技术之MIMO
  17. 【.Net开发】之WPF入门介绍
  18. 在线阅读Linux内核源代码
  19. 服务器bcd配置损坏怎么修复,引导记录损坏修复方法详解
  20. 删除office正版增值计划通知的方法

热门文章

  1. 小程序canvas放大模糊_HTML5 Canvas图像效果应用程序–添加模糊
  2. 深度学习项目四: 实现自己的中文分词模型,基于双向的LSTM(含数据和所需源码)
  3. Ubuntu16.04/Hadoop3.1.3安装教程_单机/伪分布式配置
  4. Bash for 循环使用方法
  5. php bluehost,适合PHP程序的BlueHost Linux外贸主机
  6. anime.js 动画_Anime.js –轻量级JavaScript动画库
  7. HTML标签列表(字母排序)
  8. Flex4+Flash CS3+TweenLite简单实现打苍蝇游戏
  9. HDU 3498 whosyourdaddy(DLX+A*||多重覆盖)
  10. 免费医院信息科运维系统