Этот пример показывает, как использовать Систему 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)')
![]()