Сгенерируйте MEX-функцию, чтобы оценить направления прибытия

Скомпилируйте, с помощью codegen (MATLAB Coder), функциональный EstimateDOA.m. Эта функция оценивает направления прибытия (DOA) двух сигналов с добавленным шумом, которые получены стандартным Универсальным массивом линии (ULA) с 10 элементами. Антенна рабочая частота составляет 150 МГц и элементы массива, является распределенной половиной длины волны независимо. Фактическое направление прибытия первого сигнала является азимутом на 10 °, вертикальным изменением на 20 °. Направление прибытия второго сигнала является азимутом на 45 °, вертикальным изменением на 60 °. Сигналы и шум сгенерированы с помощью sensorsig функция.

function [az] = EstimateDOA()
% Example:
% Estimate the DOAs of two signals received by a standard
% 10-element ULA with element spacing one half-wavelength apart.
% The antenna operating frequency is 150 MHz.
% The actual direction of the first signal is 10 degrees in
% azimuth and 20 degrees in elevation. The direction of the
% second signal is 45 degrees in azimuth and 60 degrees in
% elevation.
c = physconst('LightSpeed');
fc = 150e6;
lambda = c/fc;
fs = 8000;
nsamp = 8000;
sigma = 0.1;
ang = [10 20; 45 60]';
antenna = phased.IsotropicAntennaElement( ...
    'FrequencyRange',[100e6,300e6]);
array = phased.ULA('Element',antenna,'NumElements',10, ...
    'ElementSpacing',lambda/2);
pos = getElementPosition(array)/lambda;
sig = sensorsig(pos,nsamp,ang,sigma^2);
estimator = phased.RootMUSICEstimator('SensorArray',array,...
    'OperatingFrequency',fc,...
    'NumSignalsSource','Property','NumSignals',2);
doas = estimator(sig);
az = broadside2az(sort(doas),[20,60]);
end

Запущенный codegen (MATLAB Coder) в командной строке, чтобы сгенерировать MEX-функцию, EstimateDOA_mex, и затем запустите MEX-функцию:

codegen EstimateDOA.m
EstimateDOA_mex

Предполагаемые углы падения:

az =

  10.0036   45.0030

Программа содержит фиксированное значение для шумового отклонения. Если вы хотели снова использовать тот же код для различного уровня шума, можно передать шумовое отклонение в качестве аргумента в функцию. Это сделано в функциональном EstimateDOA1.m, показанный здесь, который имеет входной параметр sigma.

function [az] = EstimateDOA1(sigma)
% Example:
% Estimate the DOAs of two signals received by a standard
% 10-element ULA with element spacing one half-wavelength apart.
% The antenna operating frequency is 150 MHz.
% The actual direction of the first signal is 10 degrees in
% azimuth and 20 degrees in elevation. The direction of the
% second signal is 45 degrees in azimuth and 60 degrees in
% elevation.
c = physconst('LightSpeed');
fc = 150e6;
lambda = c/fc;
fs = 8000;
nsamp = 8000;
ang = [10 20; 45 60]';
antenna = phased.IsotropicAntennaElement( ...
    'FrequencyRange',[100e6,300e6]);
array = phased.ULA('Element',antenna,'NumElements',10, ...
    'ElementSpacing',lambda/2);
pos = getElementPosition(array)/lambda;
sig = sensorsig(pos,nsamp,ang,sigma^2);
estimator = phased.RootMUSICEstimator('SensorArray',array, ...
    'OperatingFrequency',fc, ...
    'NumSignalsSource','Property','NumSignals',2);
doas = estimator(sig);
az = broadside2az(sort(doas),[20,60]);
end

Запущенный codegen (MATLAB Coder) в командной строке, чтобы сгенерировать MEX-функцию, EstimateDOA1_mex, использование -args опция, чтобы задать тип входного параметра. Затем запустите MEX-функцию несколькими различными входными параметрами:

codegen EstimateDOA1.m -args {1}
EstimateDOA1_mex(1)
az =
   10.0130   45.0613
EstimateDOA1_mex(10)
az =
   10.1882   44.3327
EstimateDOA1_mex(15)
az =
    8.1620   46.2440

Увеличение значения sigma ухудшает оценки углов азимута.