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