function DOA_music
clear all;
clc;
close all;
wavelength = 1; % 波长1m
d = 0.5 * wavelength; % 阵元间的距离
% ----- 影响分辨力的重要参数 ---
element_num = 10; % 阵元数,对分辨率起决定性作用
snapshot_num = 1200; % 快拍数
snr = 20; % 单个天线单次快拍信噪比
doa = [35 150 80 60]; % 信号方向,这里可以有多个信号
% -------------------
num_s = length(doa); % 信号数
fd = linspace(0, 2000, num_s);
prf = 5000;
signal_power = 1; % 单个信号功率,这里设为等功率,实际上功率差别也会影响分辨力,这里不考虑功率差
step = 0.04; % 步进值,为了更精细的估计可以调小些
for noTrial = 1:10 % 10次仿真
%%------ 产生信号----------
signal = receive_signal_ul (doa, d, element_num, wavelength, ...
fd, prf, signal_power, snr, snapshot_num);
X = signal;
R = X*X'./snapshot_num; % 计算协方差矩阵
[V, D] = eig(R); % 特征值分解
DD = diag(D); % 对角阵变矢量
[DD idx] = sort(DD, 'descend'); % 按从大往小排序特征值
V = V(:, idx); % 特征矢量按同样顺序排列
Us = V(:, 1:num_s); % 信号子空间
Un = V(:, num_s+1 : end); % 噪声子空间
end
%%-------------music算法----------%%
theta = 0 : step :180;
for k = 1 : length(theta);
a = steering_vector_ul (theta(k), wavelength, d, element_num);
Pmu(noTrial, k) = abs(a'*a ./ (a' * Un * Un' * a)); % 空间谱
end
%%------归一化------------------------
for i=1:noTrial;
Pmum =( Pmu(i, : )./max(Pmu(i,:)));
end
%%--------------绘图----------
figure;
plot(theta, Pmum);
grid on;
xlabel('角度(/\circ)');
ylabel('空间谱');
title('Music算法空间谱');
function signal = receive_signal_ul (phi, d, element_num, wavelength, ...
fd, prf, signal_power, snr, snapshot_num)
% 信号采样
%
A = array_manifold_ul (phi, d, element_num, wavelength);
noise_power = signal_power / 10 .^ (snr / 10);%snr公式
signal_num = length(phi);
noise = wgn(element_num, snapshot_num, noise_power, 'linear', 'complex');%产生噪声
S = zeros(signal_num, snapshot_num);%S是singnal*snapshot 维矩阵(多次快拍)
theta = 2 *pi * rand(1, signal_num);
for i = 1 : signal_num
w = 2 * pi * fd(i) / prf*(0 : snapshot_num-1) ;%不同采样时刻的频率
S(i, :) = signal_power .^0.5 * exp(j * theta(i)) * exp(j * w); % 模拟的信号为正弦波
end
signal = A * S + noise;
%------------------------------
function a = steering_vector_ul (phi, wavelength, d, element_num)
% 均匀线阵导向矢量
% phi -- 目标方位 (-90到90)/度
% wavelength -- 波长
% d -- 阵元间距
% element_num -- 阵元数
n = (0 : element_num - 1).';
a = exp(j * 2 * pi * n * d * cosd(phi) ./ wavelength);
%-------------------------------------------------
function A = array_manifold_ul (phi, d, element_num, wavelength)
% 均匀线阵流型
%
for k = 1 : length(phi)
A(:, k) = steering_vector_ul (phi(k), wavelength, d, element_num);
end
希望大神们快来帮助,谢谢啦!
1 个解决方案
#1
不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml
共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……
“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml
共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……
“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!
#1
不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml
共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……
“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml
共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……
“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!