В этом примере показано, как использовать phased.SumDifferenceMonopulseTracker Система object� для отслеживания движущейся цели. The phased.SumDifferenceMonopulseTracker трекер решает направление цели из сигналов, поступающих на равномерный линейный массив (ULA). Алгоритм моноимпульса суммарной разности требует предварительной оценки целевого направления, которое принято близким к фактическому направлению. В трекере текущая оценка служит предварительной информацией для следующей оценки. Цель является узкополосным излучателем 500 МГц, движущимся с постоянной скоростью 800 к/ч. Для массива ULA вектор управления зависит только от широкого угла. Широкий угол является углом между исходным направлением и плоскостью, нормальной к линейному массиву. Любой поступающий сигнал задается его широким углом.
Предположим, что цель расположена в [0,10000,20000] относительно радара в локальной системе координат радара. Предположим, что цель движется вдоль оси Y к радару со скоростью 800 км/ч.
x0 = [0,10000,20000].'; v0 = -800; v0 = v0*1000/3600; targetplatform = phased.Platform(x0,[0,v0,0].');
Монопульсный трекер использует ULA массива, который состоит из 8 изотропных антенных элементов. Интервал между элементами устанавливается равным половине длины волны сигнала.
fc = 500e6; c = physconst('LightSpeed'); lam = c/fc; antenna = phased.IsotropicAntennaElement('FrequencyRange',[100e6,800e6],... 'BackBaffled',true); array = phased.ULA('Element',antenna,'NumElements',8,... 'ElementSpacing',lam/2);
Примите узкополосный сигнал. Этот вид сигнала может быть симулирован с помощью phased.SteeringVector Системный объект.
steervec = phased.SteeringVector('SensorArray',array);Инициализируйте цикл отслеживания. Создайте phased.SumDifferenceMonopulseTracker Системный объект.
tracker = phased.SumDifferenceMonopulseTracker('SensorArray',array,... 'PropagationSpeed',c,... 'OperatingFrequency',fc);
На каждом временном шаге вычислите широкий угол цели относительно массива. Установите значение шага 0,5 секунды.
T = 0.5; nsteps = 40; t = [1:nsteps]*T;
Настройте векторы данных для хранения и отображения результатов
rng = zeros(1,nsteps); broadang_actual = zeros(1,nsteps); broadang_est = zeros(1,nsteps); angerr = zeros(1,nsteps);
Пройдите по циклу отслеживания. Сначала предоставьте оценку начального широкого угла. В этой симуляции известен фактический широкий угол, но добавляется ошибка в пяти степенях.
[tgtrng,tgtang_actual] = rangeangle(x0,[0,0,0].');
broadang0 = az2broadside(tgtang_actual(1),tgtang_actual(2));
broadang_prev = broadang0 + 5.0; % add some sort of errorВычислите фактический широкий угол, broadang_actual.
Вычислите сигнал, signl, с фактического широкого угла, с помощью phased.SteeringVector Системный объект.
Использование phased.SumDifferenceMonopulseTracker трекер, оцените широкий угол, broadang_est, от сигнала. Широкий угол, полученный из предыдущего шага, служит начальной оценкой для текущего шага.
Вычислите различие между расчетным широким углом, broadang_est, и фактический широкий угол, broadang_actual. Это мера того, насколько хорошо решение.
for n = 1:nsteps x = targetplatform(T); [rng(n),tgtang_actual] = rangeangle(x,[0,0,0].'); broadang_actual(n) = az2broadside(tgtang_actual(1),tgtang_actual(2)); signl = steervec(fc,broadang_actual(n)).'; broadang_est(n) = tracker(signl,broadang_prev); broadang_prev = broadang_est(n); angerr(n) = broadang_est(n) - broadang_actual(n); end
Постройте график области значений как функцию времени, показывающую точку ближайшего подхода.
plot(t,rng/1000,'-o') xlabel('time (sec)') ylabel('Range (km)')
![]()
Постройте график предполагаемого широкого угла как функции времени.
plot(t,broadang_actual,'-o') xlabel('time (sec)') ylabel('Broadside angle (deg)')
![]()
Моноимпульсный трекер не может решить угол направления, если угловое разделение между выборками слишком велико. Максимально допустимое угловое разделение составляет примерно половину ширины луча массива от нуля до нуля. Для ULA с интервалом между 8 элементами с половинной длиной волны половинная ширина луча составляет приблизительно 14,3 степени на широкой стороне. В этой симуляции самое большое угловое различие между выборками
maxangdiff = max(abs(diff(broadang_est))); disp(maxangdiff)
0.2942
Угловое разделение между выборками меньше, чем полулучевая ширина.
Постройте график ошибки угла. Это - различие между расчетным углом и фактическим углом. График показывает очень маленькую ошибку, по порядку микростепени.
plot(t,angerr,'-o') xlabel('time (sec)') ylabel('Angle error (deg)')
![]()