В этом примере показано, как использовать phased.SumDifferenceMonopulseTracker
Система object�, чтобы отследить движущуюся цель. 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;
Векторы данных Setup для того, чтобы сохранить и отобразить результаты
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)')
Моноимпульсное средство отслеживания не может решить для направляющего угла, если угловое разделение между выборками является слишком большим. Максимальное допустимое угловое разделение является приблизительно половиной ширины луча от пустого указателя к пустому указателю массива. Для с 8 элементами, "половина длины волны распределенный" ULA, полуширина луча является приблизительно 14,3 градусами в развороте. В этой симуляции самое большое угловое различие между выборками
maxangdiff = max(abs(diff(broadang_est))); disp(maxangdiff)
0.2942
Угловое разделение между выборками меньше полуширины луча.
Постройте угловую погрешность. Вот в чем разница между предполагаемым углом и фактическим углом. График показывает очень небольшую ошибку на порядке микростепеней.
plot(t,angerr,'-o') xlabel('time (sec)') ylabel('Angle error (deg)')