Компиляция, использование codegen (Кодер MATLAB), функция EstimateDOA.m. Эта функция оценивает направления прихода (DOA) двух сигналов с добавленным шумом, которые принимаются стандартной 10-элементной матрицей унифицированных линий (ULA). Рабочая частота антенны составляет 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) в командной строке для создания функции 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) в командной строке для создания функции 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 ухудшает оценки азимутальных углов.