exponenta event banner

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

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

Конфигурация радара

Предположим, что многофункциональная РЛС работает в 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)

Форма волны

Чтобы удовлетворить требованиям диапазона, определите и используйте линейную ЧМ-форму сигнала с полосой пропускания 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.

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

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

Моделирование

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

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

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

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

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

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

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

Предположим, что задержка составляет 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

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

Этот процесс повторяется для каждого пребывания. Это моделирование запускает радиолокационную систему в течение 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] Уолтер Вайншток, «Компьютерное управление многофункциональным радаром», Практические системы фазированных антенных решеток, 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;