Поиск и отслеживание планирования для многофункционального радара с фазированной решеткой

Этот пример показов, как симулировать многофункциональную фазированную решетку радиолокационную систему. Многофункциональный радар может выполнять задания, которые обычно требуют нескольких традиционных радаров. Примерами традиционных радаров являются сканирующие радары, которые отвечают за поиск целей, и сопровождение радаров, которые отвечают за отслеживание целей. В этом примере многофункциональный радар с фазированной решеткой выполняет задачи сканирования (поиска) и отслеживания. На основе обнаружений и дорожек, полученных из текущего эха, радар решает, что делать дальше, чтобы обеспечить отслеживание интересующих целей и поиск желаемого воздушного пространства. Многофункциональный радар с фазированной решеткой работает как замкнутый цикл, включая такие функции, как планирование задач, выбор формы волны, генерация обнаружения и отслеживание цели.

Радиолокационные Строения

Предположим, что многофункциональный радар работает в полосе S и должен обнаруживать цели между 2 км и 100 км с минимальным сечением радара цели (RCS) 1 квадратный метр.

fc     = 2e9;                 % Radar carrier frequency (Hz)
c      = 3e8;                 % Propagation speed (m/s)
lambda = c/fc;                % Radar wavelength (m)

maxrng = 100e3;               % Maximum range (m)
minrng = 2e3;                 % Minimum range (m)

Форма волны

Чтобы удовлетворить требованиям области значений, задайте и используйте линейную FM-форму волны с пропускной способностью 1 МГц.

bw     = 1e6;
fs     = 1.5*bw;
prf    = 1/range2time(maxrng,c);
dcycle = 0.1;

wav = phased.LinearFMWaveform('SampleRate', fs, ...
    'DurationSpecification', 'Duty cycle', 'DutyCycle', dcycle, ...
    'PRF', prf, 'SweepBandwidth', bw);

Вычислите разрешение области значений, достижимое формой волны.

rngres = bw2range(bw,c)
rngres =

   150

Радиолокационная антенна

Многофункциональный радар оборудован фазированной решеткой, которая может электронно сканировать радиолокационные лучи в пространстве. Используйте прямоугольный массив 50 на 50 с элементами, разделенными половинной длиной волны, чтобы получить половину ширины луча степени приблизительно 2 степени.

arraysz   = 50;
ant       = phased.URA('Size',arraysz,'ElementSpacing',lambda/2);
ant.Element.BackBaffled = true;

arraystv  = phased.SteeringVector('SensorArray',ant,'PropagationSpeed',c);
radiator  = phased.Radiator('OperatingFrequency',fc, ...
    'PropagationSpeed', c, 'Sensor',ant, 'WeightsInputPort', true);
collector = phased.Collector('OperatingFrequency',fc, ...
    'PropagationSpeed', c, 'Sensor',ant);

beamw = rad2deg(lambda/(arraysz*lambda/2))
beamw =

    2.2918

Передатчик и приемник

Используйте требования к обнаружению, чтобы вывести соответствующую степень передачи. Предположим, что рисунок шума на приемном предварительном усилителе составляет 7 дБ.

pd      = 0.9;                     % Probability of detection
pfa     = 1e-6;                    % Probability of false alarm
snr_min = albersheim(pd, pfa, 1);
ampgain = 20;
tgtrcs  = 1;
ant_snrgain = pow2db(arraysz^2);

ppower  = radareqpow(lambda,maxrng,snr_min,wav.PulseWidth,...
    'RCS',tgtrcs,'Gain',ampgain+ant_snrgain);

tx = phased.Transmitter('PeakPower',ppower,'Gain',ampgain,'InUseOutputPort',true);
rx = phased.ReceiverPreamp('Gain',ampgain,'NoiseFigure',7,'EnableInputPort',true);

rxpassthrough = phased.ReceiverPreamp('SampleRate',fs,'Gain',0,...
    'ReferenceTemperature',1);
radar = radarTransceiver('Waveform',wav,'Transmitter',tx,...
    'TransmitAntenna',radiator,'ReceiveAntenna',collector,...
    'Receiver',rxpassthrough,'ElectronicScanMode','Custom');

Обработка сигналов

Многофункциональный радар применяет последовательность операций, включая согласованную фильтрацию, изменяющийся во времени коэффициент усиления, моноимпульс и обнаружение, к принимаемому сигналу для формирования области значений и угловых измерений обнаруженных целей.

% matched filter
mfcoeff = getMatchedFilter(wav);
mf      = phased.MatchedFilter('Coefficients',mfcoeff,'GainOutputPort', true);

% time varying gain
tgrid   = unigrid(0,1/fs,1/prf,'[)');
rgates  = c*tgrid/2;
rngloss = 2*fspl(rgates,lambda);
refloss = 2*fspl(maxrng,lambda);
tvg     = phased.TimeVaryingGain('RangeLoss',rngloss,'ReferenceLoss',refloss);

% monopulse
monfeed = phased.MonopulseFeed('SensorArray',ant,'PropagationSpeed',c,...
    'OperatingFrequency',fc,'SquintAngle',1);
monest  = getMonopulseEstimator(monfeed);

Обработка данных

Обнаружения подаются в трекер, который выполняет несколько операций. Трекер поддерживает список треков, то есть оценок целевых состояний в интересующей области. Если обнаружение не может быть назначено ни одному треку, уже поддерживаемому трекером, трекер инициирует новый трек. В большинстве случаев неясно, представляет ли новая дорожка истинную цель или ложную цель. Сначала создается трек с предварительным статусом. Если получено достаточное количество обнаружений, дорожка становится подтвержденной. Точно так же, если никакие обнаружения не назначены дорожке, дорожка покрывается (прогнозируется без коррекции). Если у трека несколько пропущенных обновлений, трекер удаляет трек.

Многофункциональный радар использует трекер, который связывает обнаружения с треками с помощью глобального алгоритма ближайшего соседа (GNN).

tracker = radarTracker('FilterInitializationFcn',@initSATGNN,...
    'ConfirmationThreshold',[2 3], 'DeletionThreshold',5,...
    'HasDetectableTrackIDsInput',true,'AssignmentThreshold',100,...
    'MaxNumTracks',2,'MaxNumSensors',1);

Сгруппируйте все компоненты радара в структуру для более легкой ссылки в цикле симуляции.

mfradar.Tx      = tx;
mfradar.Rx      = rx;
mfradar.TxAnt   = radiator;
mfradar.RxAnt   = collector;
mfradar.Wav     = wav;
mfradar.Radar   = radar;
mfradar.RxFeed  = monfeed;
mfradar.MF      = mf;
mfradar.TVG     = tvg;
mfradar.DOA     = monest;
mfradar.STV     = arraystv;
mfradar.Tracker = tracker;
mfradar.IsTrackerInitialized = false;

Определение цели и сцены

Этот пример предполагает, что радар является стационарным в источник с двумя целями в поле зрения. Одна цель отходит от радара и находится на расстоянии около 50 км. Другая цель приближается к радару и находится на расстоянии 30 км. Обе цели имеют RCS 1 квадратный метр.

% Define the targets.
tgtpos = [29875 49637; 0 4225; 0 0];
tgtvel = [-100 120; 0 100; 0 0];

ntgt = size(tgtpos,2);
tgtmotion = phased.Platform('InitialPosition',tgtpos,'Velocity',tgtvel);
target = phased.RadarTarget('MeanRCS',tgtrcs*ones(1,ntgt),'OperatingFrequency',fc);

Предположим, что окружение распространения является свободным пространством.

channel = phased.FreeSpace('SampleRate',fs,'TwoWayPropagation',true,'OperatingFrequency',fc);

Группируйте цели и каналы распространения вместе в структуре для более легкой ссылки в цикле симуляции.

env.Target           = target;
env.TargetMotion     = tgtmotion;
env.Channel          = channel;

scene = radarScenario('UpdateRate',prf);
radartraj = kinematicTrajectory('SampleRate',prf,'Position',[0 0 0],...
    'Velocity',[0 0 0],'AccelerationSource','Property',...
    'AngularVelocitySource','Property');
radarplat = platform(scene,'Position',[0 0 0],'Sensors',{radar});
tgtplat1 = platform(scene,'Trajectory',...
    kinematicTrajectory('SampleRate',prf,'Position',tgtpos(:,1).',...
    'Velocity',tgtvel(:,1).','AccelerationSource','Property',...
    'AngularVelocitySource','Property'));
tgtplat2 = platform(scene,'Trajectory',...
    kinematicTrajectory('SampleRate',prf,'Position',tgtpos(:,2).',...
    'Velocity',tgtvel(:,2).','AccelerationSource','Property',...
    'AngularVelocitySource','Property'));

env.Scene = scene;
env.RadarPlatform = radarplat;

Управление радиолокационными ресурсами

Хотя использование одного многофункционального радара для выполнения нескольких задач имеет свои преимущества, он также имеет более высокую стоимость и более сложную логику. В целом радар имеет конечные ресурсы, чтобы тратить на свои задачи. Если ресурсы используются для отслеживания задач, эти ресурсы недоступны для поиска задач до завершения задач отслеживания. Из-за этого распределения ресурсов критическим компонентом при использовании многофункционального радара является управление ресурсами.

Задачи поиска

Задачи поиска могут быть рассмотрены как детерминированные. В этом примере растровый скан используется для покрытия желаемого воздушного пространства. Если других задач не существует, радар сканирует пространство по одной угловой камере за раз. Размер угловой камеры определяется шириной луча антенной решетки.

Предположим, что радар сканирует пространство от -30 до 30 степеней азимута и от 0 до 20 степеней повышения. Вычислите угловую сетку поиска с помощью ширины балки.

scanregion   = [-30, 30, 0, 20];
azscanspan   = diff(scanregion(1:2));
numazscan    = ceil(azscanspan/beamw);
azscanangles = linspace(scanregion(1),scanregion(2),numazscan);
elscanspan   = diff(scanregion(3:4));
numelscan    = ceil(elscanspan/beamw);
elscanangles = linspace(scanregion(3),scanregion(4),numelscan);
[elscangrid,azscangrid] = meshgrid(elscanangles,azscanangles);
scanangles   = [azscangrid(:) elscangrid(:)].';

Сетка положения балки и целевая сцена показаны ниже.

sceneplot = helperSATTaskPlot('initialize',scanangles,azscanangles,maxrng,beamw,tgtpos);

Поисковые лучи передаются по одному за раз последовательно до тех пор, пока не будет покрыта вся область поиска. Когда вся область поиска покрыта, радар повторяет последовательность поиска. Поиски выполняются по азимутальному направлению, по одному углу возвышения в раз. Задачи поиска часто содержатся в очереди заданий.

searchq = struct('JobType','Search','BeamDirection',num2cell(scanangles,1),...
    'Priority',1000,'WaveformIndex',1);
current_search_idx = 1;

Каждое задание в очереди определяет тип задания, а также направление указателя балки. Он также содержит значение приоритета для задания. Это значение приоритета определяется типом задания. Этот пример использует значение 1000 в качестве приоритета для заданий поиска.

disp(searchq(current_search_idx))
          JobType: 'Search'
    BeamDirection: [2×1 double]
         Priority: 1000
    WaveformIndex: 1

Отслеживайте задачи

В отличие от задач поиска, отслеживать задачи нельзя планировать. Задачи отслеживания создаются только тогда, когда цель обнаруживается поисковой задачей или когда цель уже отслежена. Отслеживать задачи - это динамические задачи, которые создаются и выполняются на основе изменяющегося сценария. Подобно задачам поиска, отслеживать задачи также управляют в очереди заданий.

trackq(10) = struct('JobType',[],'BeamDirection',[],'Priority',3000,'WaveformIndex',[],...
    'Time',[],'Range',[],'TrackID',[]);
num_trackq_items = 0;
disp(trackq(1))
          JobType: []
    BeamDirection: []
         Priority: []
    WaveformIndex: []
             Time: []
            Range: []
          TrackID: []

Группируйте поиск и отслеживайте очереди вместе в структуре для более легкой ссылки в цикле симуляции.

jobq.SearchQueue  = searchq;
jobq.SearchIndex  = current_search_idx;
jobq.TrackQueue   = trackq;
jobq.NumTrackJobs = num_trackq_items;

Поскольку задание отслеживания не может быть инициализировано до обнаружения целевого объекта, все задания отслеживания начинаются как пустые задания. После создания задания в нем содержится такая информация, как тип задания, направление луча и время выполнения. Задача отслеживания имеет приоритет 3000, что выше приоритета 1000 для задания поиска. Это более высокое значение приоритета означает, что, когда время находится в конфликте, система сначала выполняет задание отслеживания.

Размер предела для очереди в этом примере установлен равным 10.

Планирование задач

В этом примере для простоты многофункциональный радар выполняет только один тип задания в течение небольшого периода времени, часто называемого dwell, но может переключать задачи в начале каждого dwell. Для каждого dwell радар просматривает все задачи, которые подлежат выполнению, и выбирает тот, который имеет наивысший приоритет. Следовательно, задания, которые будут отложены, теперь будут иметь повышенный приоритет и с большей вероятностью будут выполнены в следующем dwell.

Симуляция

В этом разделе примера описывается короткий запуск многофункциональной радиолокационной системы. Вся структура многофункциональной радиолокационной симуляции представлена этой схемой.

Симуляция начинается с радиолокационного менеджера, который обеспечивает начальное задание. На основе этого задания радар передает форму волны, моделирует эхо и применяет обработку сигнала, чтобы сгенерировать обнаружение. Обнаружение обрабатывается трекером для создания треков для целей. Затем дорожки возвращаются к менеджеру радаров. Основываясь на треках и знаниях о сцене, менеджер радара планирует новые задания трека и выбирает задание для следующего останова.

Логика операции радиолокационного менеджера показана на этой блок-схеме и описана на этих этапах.

  1. Радар начинается с задания поиска.

  2. Если цель присутствует в обнаружении, радар планирует задание подтверждения в том же направлении, чтобы убедиться, что присутствие этой цели не является ложным предупреждением. Задача подтверждения имеет более высокий приоритет, чем задача поиска, но не так высоко, как задача отслеживания. Если обнаружение подтверждается, устанавливается дорожка, и создается задание дорожки, которое должно быть выполнено после заданного времени повторного просмотра. Если обнаружение не подтверждено, то исходное обнаружение рассматривается как ложное предупреждение, и дорожка не создается.

  3. Если текущее задание является заданием на дорожку, радар выполняет обнаружение, обновляет дорожку и создает будущее задание на дорожку.

  4. На основе приоритета и времени выполнения радар выбирает следующее задание.

Предположим, что dwell составляет 10 мс. В начале симуляции радар сконфигурирован для поиска по одному лучу за раз.

rng(2018);
current_time = 0;
Npulses      = 10;
numdwells    = 200;
dwelltime    = 0.01;

jobload.num_search_job = zeros(1,numdwells);
jobload.num_track_job  = zeros(1,numdwells);

Можно запустить пример полностью, чтобы увидеть динамическое обновление графиков во время выполнения. На двух верхних графиках цвет балок указывает типы текущего задания: красный для поиска, желтый для подтверждения и фиолетовый для дорожки. На двух графиках ниже показаны истинные местоположения (треугольник), обнаружения (круг) и дорожки (квадрат) двух целей, соответственно. Системный журнал также отображается в командной строке, чтобы объяснить поведение системы в текущий момент. Далее в примере показаны более подробные сведения о нескольких критических моментах симуляции.

Моделируйте поведение системы, пока она не обнаружит первую цель. Цикл симуляции следует предыдущей системной схеме.

for dwell_idx = 1:14
    % Scheduler to provide current job
    [current_job,jobq]       = currentRadarTask(jobq,current_time);

    % Simulate the received I/Q signal
    [xsum,xdaz,xdel,mfradar] = generateEchos(mfradar,env,current_job);

    % Signal processor to extract detection
    [detection,mfradar]      = generateDetections(xsum,xdaz,xdel,mfradar,current_job,current_time);

    % Radar manager to perform data processing and update track queue
    [jobq,allTracks,mfradar] = updateTrackAndJobQueue(detection,jobq,mfradar,current_job,current_time,dwelltime);

    % Visualization
    helperSATTaskPlot('update',sceneplot,current_job,maxrng,beamw,tgtpos,allTracks,detection.Measurement);

    % Update time
    tgtpos = env.TargetMotion(dwelltime-Npulses/mfradar.Wav.PRF);
    current_time = current_time+dwelltime;

    % Record resource allocation
    if strcmp(current_job.JobType,'Search')
        jobload.num_search_job(dwell_idx) = 1;
    else
        jobload.num_track_job(dwell_idx)  = 1;
    end

end
0.000000 sec:	Search	[-30.000000 0.000000]
0.010000 sec:	Search	[-27.692308 0.000000]
0.020000 sec:	Search	[-25.384615 0.000000]
0.030000 sec:	Search	[-23.076923 0.000000]
0.040000 sec:	Search	[-20.769231 0.000000]
0.050000 sec:	Search	[-18.461538 0.000000]
0.060000 sec:	Search	[-16.153846 0.000000]
0.070000 sec:	Search	[-13.846154 0.000000]
0.080000 sec:	Search	[-11.538462 0.000000]
0.090000 sec:	Search	[-9.230769 0.000000]
0.100000 sec:	Search	[-6.923077 0.000000]
0.110000 sec:	Search	[-4.615385 0.000000]
0.120000 sec:	Search	[-2.307692 0.000000]
0.130000 sec:	Search	[0.000000 0.000000]	Target detected at 29900.000000 m

Как ожидалось, радар получает обнаружение, когда радиолокационный луч освещает цель, как показано на рисунке. Когда это происходит, радар немедленно отправляет пучок подтверждения, чтобы убедиться, что это не ложное обнаружение.

Затем отобразите результаты задания подтверждения. Остальная часть этого примера показывает упрощенный код, который объединяет цикл симуляции в функцию системной симуляции.

[mfradar,env,jobq,jobload,current_time,tgtpos] = SATSimRun(...
    mfradar,env,jobq,jobload,current_time,dwelltime,sceneplot,maxrng,beamw,tgtpos,15,15);
0.140000 sec:	Confirm	[0.001804 0.006157]	Created track 1 at 29900.000000 m

Теперь рисунок показывает пучок подтверждения. После подтверждения обнаружения для цели устанавливается дорожка, и задание дорожки планируется выполнить через короткий интервал времени.

Этот процесс повторяется для каждой обнаруженной цели до момента пересмотра, в эту точку многофункциональный радар останавливает последовательность поиска и снова выполняет задачу дорожки.

[mfradar,env,jobq,jobload,current_time,tgtpos] = SATSimRun(...
    mfradar,env,jobq,jobload,current_time,dwelltime,sceneplot,maxrng,beamw,tgtpos,16,25);
0.150000 sec:	Search	[2.307692 0.000000]
0.160000 sec:	Search	[4.615385 0.000000]	Target detected at 49900.000000 m
0.170000 sec:	Confirm	[4.896994 0.014031]	Created track 2 at 49900.000000 m
0.180000 sec:	Search	[6.923077 0.000000]
0.190000 sec:	Search	[9.230769 0.000000]
0.200000 sec:	Search	[11.538462 0.000000]
0.210000 sec:	Search	[13.846154 0.000000]
0.220000 sec:	Search	[16.153846 0.000000]
0.230000 sec:	Search	[18.461538 0.000000]
0.240000 sec:	Track	[0.000833 -0.000127]	Track 1 at 29900.000000 m

Результаты показывают, что симуляция останавливается на путевой балке. Увеличенные рисунки вокруг двух целей показывают, как дорожки обновляются на основе обнаружения и измерений. Новое задание на отслеживание для следующего повторного просмотра также добавляется в очередь заданий во время выполнения задания на отслеживание.

Этот процесс повторяется для каждого dwell. Эта симуляция запускает радиолокационную систему в течение 2 секунд. Через некоторое время вторая цель обнаруживается за пределами 50 км. На основе этой информации менеджер радаров уменьшает, как часто системе нужно отслеживать вторую цель. Это сокращение высвобождает ресурсы для удовлетворения других, более насущных потребностей.

[mfradar,env,jobq,jobload,current_time,tgtpos] = SATSimRun(...
    mfradar,env,jobq,jobload,current_time,dwelltime,sceneplot,maxrng,beamw,tgtpos,26,numdwells);
0.250000 sec:	Search	[20.769231 0.000000]
0.260000 sec:	Search	[23.076923 0.000000]
0.270000 sec:	Track	[4.882021 0.002546]	Track 2 at 49900.000000 m
0.280000 sec:	Search	[25.384615 0.000000]
0.290000 sec:	Search	[27.692308 0.000000]
0.340000 sec:	Track	[0.014417 0.015384]	Track 1 at 29900.000000 m
0.370000 sec:	Track	[4.883901 0.012786]	Track 2 at 49900.000000 m
0.440000 sec:	Track	[0.002694 0.009423]	Track 1 at 29900.000000 m
0.470000 sec:	Track	[4.889519 -0.009622]	Track 2 at 49900.000000 m
0.540000 sec:	Track	[-0.003890 -0.006735]	Track 1 at 29900.000000 m
0.570000 sec:	Track	[4.905253 -0.023520]	Track 2 at 49900.000000 m
0.640000 sec:	Track	[-0.009124 0.012105]	Track 1 at 29900.000000 m
0.670000 sec:	Track	[4.908435 -0.012902]	Track 2 at 49900.000000 m
0.740000 sec:	Track	[-0.014700 -0.007442]	Track 1 at 29800.000000 m
0.770000 sec:	Track	[4.916246 -0.006127]	Track 2 at 49900.000000 m
0.840000 sec:	Track	[0.002371 -0.007959]	Track 1 at 29800.000000 m
0.870000 sec:	Track	[4.919202 0.000403]	Track 2 at 49900.000000 m
0.940000 sec:	Track	[0.003877 -0.018467]	Track 1 at 29800.000000 m
0.970000 sec:	Track	[4.931431 0.003165]	Track 2 at 49900.000000 m
1.040000 sec:	Track	[0.002358 -0.007887]	Track 1 at 29800.000000 m
1.070000 sec:	Track	[4.932988 -0.003006]	Track 2 at 49900.000000 m
1.140000 sec:	Track	[0.000982 -0.003077]	Track 1 at 29800.000000 m
1.170000 sec:	Track	[4.944549 -0.004130]	Track 2 at 50000.000000 m
1.240000 sec:	Track	[-0.000250 -0.003156]	Track 1 at 29800.000000 m
1.340000 sec:	Track	[0.000101 -0.005774]	Track 1 at 29800.000000 m
1.440000 sec:	Track	[0.000461 -0.003104]	Track 1 at 29800.000000 m
1.540000 sec:	Track	[-0.000965 -0.003565]	Track 1 at 29800.000000 m
1.640000 sec:	Track	[-0.001041 -0.003305]	Track 1 at 29800.000000 m
1.670000 sec:	Track	[4.979614 -0.000920]	Track 2 at 50000.000000 m
1.740000 sec:	Track	[-0.000550 -0.003633]	Track 1 at 29800.000000 m
1.840000 sec:	Track	[-0.002676 -0.003713]	Track 1 at 29800.000000 m
1.940000 sec:	Track	[-0.005176 -0.003055]	Track 1 at 29800.000000 m

Анализ распределения ресурсов

В этом разделе примера показано, как ресурс радара распределяется между различными задачами. Этот рисунок показывает, как многофункциональная радиолокационная система в этом примере распределяет свои ресурсы между поиском и дорожкой.

L = 10;
searchpercent = sum(buffer(jobload.num_search_job,L,L-1,'nodelay'))/L;
trackpercent  = sum(buffer(jobload.num_track_job,L,L-1,'nodelay'))/L;
figure;
plot((1:numel(searchpercent))*L*dwelltime,[searchpercent(:) trackpercent(:)]);
xlabel('Time (s)');
ylabel('Job Percentage');
title('Resource Distribution between Search and Track');
legend('Search','Track','Location','best');
grid on;

Рисунок предполагает, что в начале симуляции все ресурсы расходуются на поиск. После обнаружения целей ресурсы радара разделяются на 80% и 20% между поиском и дорожкой, соответственно. Однако, когда вторая цель удаляется дальше, больше ресурсов высвобождается для поиска. Нагрузка на дорожку кратковременно увеличивается, когда приходит время для повторного отслеживания второй цели.

Сводные данные

Этот пример представляет концепцию управления ресурсами и планирования задач в многофункциональной радиолокационной системе с фазированной решеткой. Это показывает, что с компонентом управления ресурсами радар действует как система с обратным циклом. Несмотря на то, что многофункциональный радар в этом примере занимается только задачами поиска и отслеживания, концепция может быть распространена на более реалистичные ситуации, когда также участвуют другие функции, такие как самоконтроль и связь.

Ссылки

[1] Walter Weinstock, «Computer Control of a Multifunction Radar», Practical Phased Array Antenna Systems, Lex Book, 1997

Приложения

Эти вспомогательные функции моделируют рабочий процесс управления радиолокационными ресурсами.

currentRadarTask

Функция currentRadarTask сравнивает задания в очереди поиска и очереди треков и выбирает задание с наивысшим приоритетом для выполнения.

function [currentjob,jobq] = currentRadarTask(jobq,current_time)

searchq   = jobq.SearchQueue;
trackq    = jobq.TrackQueue;
searchidx = jobq.SearchIndex;
num_trackq_items = jobq.NumTrackJobs;

% Update search queue index
searchqidx = mod(searchidx-1,numel(searchq))+1;

% Find the track job that is due and has the highest priority
readyidx = find([trackq(1:num_trackq_items).Time]<=current_time);
[~,maxpidx] = max([trackq(readyidx).Priority]);
taskqidx = readyidx(maxpidx);

% If the track job found has a higher priority, use that as the current job
% and increase the next search job priority since it gets postponed.
% Otherwise, the next search job due is the current job.
if ~isempty(taskqidx) && trackq(taskqidx).Priority >= searchq(searchqidx).Priority
    currentjob = trackq(taskqidx);
    for m = taskqidx+1:num_trackq_items
        trackq(m-1) = trackq(m);
    end
    num_trackq_items = num_trackq_items-1;
    searchq(searchqidx).Priority = searchq(searchqidx).Priority+100;
else
    currentjob = searchq(searchqidx);
    searchidx = searchqidx+1;

end

jobq.SearchQueue  = searchq;
jobq.SearchIndex  = searchidx;
jobq.TrackQueue   = trackq;
jobq.NumTrackJobs = num_trackq_items;

generateEchos

Функция generateEchos моделирует комплексное (I/Q) представление полосы частот эхо-сигнала цели, полученное в радаре.

function [xrsint,xrdazint,xrdelint,mfradar] = generateEchos(mfradar,env,current_job)

% Number of pulses and operating frequency
Npulses = 10;
fc = mfradar.TxAnt.OperatingFrequency;

for m = 1:Npulses
    % Transmit weights
    w  = mfradar.STV(fc,current_job.BeamDirection);
    
    % Simulate echo
    advance(env.Scene);
    xr1 = mfradar.Radar(targetPoses(env.RadarPlatform),(m-1)/mfradar.Wav.PRF,conj(w));
    
    % Monopulse
    [xrs,xrdaz,xrdel] = mfradar.RxFeed(xr1,current_job.BeamDirection);
    
    % Pulse integration
    inuseflag = zeros(size(xr1,1),1);
    inuseflag(1:round(mfradar.Wav.DutyCycle/mfradar.Wav.PRF*mfradar.Wav.SampleRate))=1;
    if m == 1
        xrsint   = mfradar.Rx(xrs,~(inuseflag>0));
        xrdazint = mfradar.Rx(xrdaz,~(inuseflag>0));
        xrdelint = mfradar.Rx(xrdel,~(inuseflag>0));
    else
        xrsint   = xrsint+mfradar.Rx(xrs,~(inuseflag>0));
        xrdazint = xrdazint+mfradar.Rx(xrdaz,~(inuseflag>0));
        xrdelint = xrdelint+mfradar.Rx(xrdel,~(inuseflag>0));
    end
end

generateDetections

Функция generateDetections применяет методы обработки сигналов к эхо-сигналу, чтобы сгенерировать обнаружение цели.

function [detection,mfradar] = generateDetections(xrsint,xrdazint,xrdelint,mfradar,current_job,current_time)

% Compute detection threshold
nbw         = mfradar.Rx.SampleRate/(mfradar.Wav.SampleRate/mfradar.Wav.SweepBandwidth);
npower      = noisepow(nbw,mfradar.Rx.NoiseFigure,mfradar.Rx.ReferenceTemperature);
pfa         = 1e-6;
threshold   = npower * db2pow(npwgnthresh(pfa,1,'noncoherent'));
arraysz     = mfradar.TxAnt.Sensor.Size(1);
ant_snrgain = pow2db(arraysz^2);
mfcoeff     = getMatchedFilter(mfradar.Wav);
mfgain      = pow2db(norm(mfcoeff)^2);
threshold   = threshold * db2pow(mfgain+2*ant_snrgain); 
threshold   = sqrt(threshold);    

tgrid   = unigrid(0,1/mfradar.Wav.SampleRate,1/mfradar.Wav.PRF,'[)');
rgates  = mfradar.TxAnt.PropagationSpeed*tgrid/2;

% Matched filtering and time varying gain
xrsmf = mfradar.TVG(mfradar.MF(xrsint));

% Detection in range and angle estimation via monopulse
if any(abs(xrsmf)>threshold)
    [~,tgtidx] = findpeaks(abs(xrsmf),'MinPeakHeight',threshold,...
        'Sortstr','Descend','NPeaks',1);
    rng_est = rgates(tgtidx-(numel(mfcoeff)-1));
    ang_est = mfradar.DOA(xrsint(tgtidx-1),xrdazint(tgtidx-1),xrdelint(tgtidx-1),current_job.BeamDirection);
    % Form the detection object.  
    measNoise = diag([0.1, 0.1, 150].^2);           % Measurement noise matrix
    detection = objectDetection(current_time,...
        [ang_est(1);ang_est(2);rng_est], 'MeasurementNoise', measNoise,...
        'MeasurementParameters',struct('Frame','spherical', 'HasVelocity', false));  
else
    detection = objectDetection.empty;
end

if current_time < 0.3 || strcmp(current_job.JobType,'Track')
    fprintf('\n%f sec:\t%s\t[%f %f]',current_time,current_job.JobType,current_job.BeamDirection(1),...
        current_job.BeamDirection(2));
end


updateTrackAndJobQueue

Функция updateTrackAndJobQueue отслеживает обнаружение и затем передает дорожки менеджеру радара, чтобы обновить очередь задач трека.

function [jobq,allTracks,mfradar] = updateTrackAndJobQueue(detection,jobq,mfradar,current_job,current_time,dwellinterval)

trackq           = jobq.TrackQueue;
num_trackq_items = jobq.NumTrackJobs;

% Execute current job
switch current_job.JobType
    case 'Search'
        % For search job, if there is a detection, establish tentative
        % track and schedule a confirmation job
        if ~isempty(detection)
            ang_est = detection.Measurement(1:2);
            rng_est = detection.Measurement(3);
            if ~mfradar.IsTrackerInitialized
                [~,~,allTracks] = mfradar.Tracker(detection,current_time,uint32([]));
                mfradar.IsTrackerInitialized = true;
            else
                [~,~,allTracks] = mfradar.Tracker(detection,current_time,uint32([]));
            end
            num_trackq_items = num_trackq_items+1;
            trackq(num_trackq_items) = struct('JobType','Confirm','Priority',2000,...
                'BeamDirection',ang_est,'WaveformIndex',1,'Time',current_time+dwellinterval,...
                'Range',rng_est,'TrackID',allTracks(~[allTracks.IsConfirmed]).TrackID);
            if current_time < 0.3 || strcmp(current_job.JobType,'Track')
                fprintf('\tTarget detected at %f m',rng_est);
            end
        else
            allTracks = [];
        end

    case 'Confirm'
        % For confirm job, if the detection is confirmed, establish a track
        % and create a track job corresponding to the revisit time
        if ~isempty(detection)
            trackid = current_job.TrackID;
            [~,~,allTracks] = mfradar.Tracker(detection,current_time,trackid);

            rng_est = detection.Measurement(3);
            if rng_est >= 50e3
                updateinterval = 0.5;
            else
                updateinterval = 0.1;
            end
            revisit_time = current_time+updateinterval;
            predictedTrack = predictTracksToTime(mfradar.Tracker,trackid,revisit_time);
            xpred = predictedTrack.State([1 3 5]);
            [phipred,thetapred,rpred] = cart2sph(xpred(1),xpred(2),xpred(3));
            num_trackq_items = num_trackq_items+1;
            trackq(num_trackq_items) = struct('JobType','Track','Priority',3000,...
                'BeamDirection',rad2deg([phipred;thetapred]),'WaveformIndex',1,'Time',revisit_time,...
                'Range',rpred,'TrackID',trackid);
            if current_time < 0.3 || strcmp(current_job.JobType,'Track')
                fprintf('\tCreated track %d at %f m',trackid,rng_est);
            end
        else
            allTracks = [];
        end

    case 'Track'
        % For track job, if there is a detection, update the track and
        % schedule a track job corresponding to the revisit time. If there
        % is no detection, predict and schedule a track job sooner so the
        % target is not lost.
        if ~isempty(detection)
            trackid = current_job.TrackID;
            [~,~,allTracks] = mfradar.Tracker(detection,current_time,trackid);

            rng_est = detection.Measurement(3);
            if rng_est >= 50e3
                updateinterval = 0.5;
            else
                updateinterval = 0.1;
            end

            revisit_time = current_time+updateinterval;
            predictedTrack = predictTracksToTime(mfradar.Tracker,trackid,revisit_time);
            xpred = predictedTrack.State([1 3 5]);
            [phipred,thetapred,rpred] = cart2sph(xpred(1),xpred(2),xpred(3));
            num_trackq_items = num_trackq_items+1;
            trackq(num_trackq_items) = struct('JobType','Track','Priority',3000,...
                'BeamDirection',rad2deg([phipred;thetapred]),'WaveformIndex',1,'Time',revisit_time,...
                'Range',rpred,'TrackID',trackid);

            if current_time < 0.3 || strcmp(current_job.JobType,'Track')
                fprintf('\tTrack %d at %f m',trackid,rng_est);
            end
        else
            trackid = current_job.TrackID;
            [~,~,allTracks] = mfradar.Tracker(detection,current_time,trackid);

            updateinterval = 0.1;  % revisit sooner
            revisit_time = current_time+updateinterval;
            predictedTrack = predictTracksToTime(mfradar.Tracker,trackid,revisit_time);
            xpred = predictedTrack.State([1 3 5]);

            [phipred,thetapred,rpred] = cart2sph(xpred(1),xpred(2),xpred(3));
            num_trackq_items = num_trackq_items+1;
            trackq(num_trackq_items) = struct('JobType','Track','Priority',3000,...
                'BeamDirection',rad2deg([phipred;thetapred]),'WaveformIndex',1,'Time',revisit_time,...
                'Range',rpred,'TrackID',trackid);

            if current_time < 0.3 || strcmp(current_job.JobType,'Track')
                fprintf('\tNo detection, track %d predicted',current_job.TrackID);
            end
        end

end
    
jobq.TrackQueue   = trackq;
jobq.NumTrackJobs = num_trackq_items;