Визуализация сцены для системной симуляции фазированной решетки

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

Введение

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

Phased Array System Toolbox™ обеспечивает средство просмотра сценария, чтобы помочь визуализировать, как радары и цели перемещаются в пробел. Через средство просмотра сценария можно следовать за траекторией каждой движущейся платформы и исследовать относительное движение между радаром и целью.

Визуализация траекторий

В первом примере средство просмотра сценария используется, чтобы визуализировать траектории радара и цели. Примите, что радар кружится вокруг источника в на расстоянии в 3 км. Плоскость с радаром летит на уровне 250 м/с (приблизительно 560 миль в час) и делает круг приблизительно каждые 60 секунд.

v = 250;
deltaPhi = 360/60;
sensormotion = phased.Platform(...
    'InitialPosition',[0;-3000;500],...
    'VelocitySource','Input port',...
    'InitialVelocity',[0;v;0]);

Цель перемещается вдоль прямой дороги со скоростью 30 м/с вдоль оси X. который составляет приблизительно 67 миль в час.

tgtmotion = phased.Platform('InitialPosition',[0;0;0],...
    'Velocity',[30;0;0]);

Средство просмотра собирается обновиться в каждые 0,1 секунды. Для самого простого случая луч не показывают в средстве просмотра.

tau = 0.5;
sceneview = phased.ScenarioViewer('ShowBeam','None');

Этот код симулирует и отображает радар и траектории цели.

for m = 1:tau:60
    [sensorpos,sensorvel] = sensormotion(tau,...
        v*[cosd(m*deltaPhi);sind(m*deltaPhi);0]);
    [tgtpos,tgtvel] = tgtmotion(tau);
    sceneview(sensorpos,sensorvel,tgtpos,tgtvel);
    drawnow;
end

Визуализируйте радарные лучи и траектории

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

Во-первых, установите радары и цели. Отметьте первый радар и первое целевое соответствие, что использовало в предыдущем разделе.

sensormotion = phased.Platform(...
    'InitialPosition',[0 0;-3000 500;500 1], ...
    'VelocitySource','Input port', ...
    'InitialVelocity',[0 100;v 0;0 0], ...
    'OrientationAxesOutputPort', true);
tgtmotion = phased.Platform(...
    'InitialPosition',[0 2000.66 3532.63;0 0 500;0 500 500],...
    'Velocity',[30 120 -120; 0 0 -20; 0 0 60],...
    'OrientationAxesOutputPort', true);

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

sceneview = phased.ScenarioViewer('BeamRange',[3e3 3e3],...
    'BeamWidth',[5 5], ...
    'ShowBeam', 'All', ...
    'CameraPerspective', 'Custom', ...
    'CameraPosition', [-15453.85 -19716.96 13539], ...
    'CameraOrientation', [-47 -27 0]', ...
    'CameraViewAngle', 11.28, ...
    'OrientationInputPort', true, ...
    'UpdateRate',1/tau);

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

for m = 1:60
    [sensorpos,sensorvel,sensoraxis] = sensormotion(tau,...
        [v*[cosd(m*deltaPhi);sind(m*deltaPhi);0] [100; 0; 0]]);
    [tgtpos,tgtvel,tgtaxis] = tgtmotion(tau);
    % Radar 1 tracks Target 1
    [lclrng, lclang] = rangeangle(tgtpos(:,1),sensorpos(:,1),...
        sensoraxis(:,:,1));
    % Update beam direction
    sceneview.BeamSteering = [lclang [0;0]];
    sceneview(sensorpos,sensorvel,sensoraxis,tgtpos,tgtvel,tgtaxis);
    drawnow;
end

Визуализация системной симуляции

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

Пример использует радиолокационную систему, созданную в Тестовых сигналах Симуляции для Радарного примера Приемника.

load BasicMonostaticRadarExampleData.mat

Рассмотрите сцену, где существует три цели.

fc = radiator.OperatingFrequency;
fs = waveform.SampleRate;
c = radiator.PropagationSpeed;

sensormotion = phased.Platform(...
    'InitialPosition',[0; 0; 10],...
    'Velocity',[0; 0; 0]);

target = phased.RadarTarget(...
    'MeanRCS',[1.6 2.2 1.05],...
    'OperatingFrequency',fc);
tgtmotion = phased.Platform(...
    'InitialPosition',[2000.66 3532.63 3845.04; 0 0 0;10 10 10], ...
    'Velocity',[120 -120 0; 0 0 0; 0 0 0]);

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

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

matchingcoeff = getMatchedFilter(waveform);
matchingdelay = size(matchingcoeff,1)-1;
matchedfilter = phased.MatchedFilter(...
    'Coefficients',matchingcoeff,...
    'GainOutputPort',true);

prf = waveform.PRF;
fast_time_grid = unigrid(0,1/fs,1/prf,'[)');
rangeGates = c*fast_time_grid/2;

lambda = c/fc;
max_range = 5000;
tvg = phased.TimeVaryingGain(...
    'RangeLoss',2*fspl(rangeGates,lambda),...
    'ReferenceLoss',2*fspl(max_range,lambda));

num_pulse_int = 10;

Поскольку является ненужным контролировать траекторию на импульсной частоте повторения, этот пример принимает, что система читает радарное измерение на уровне 20 Гц. Пример использует средство просмотра сценария, чтобы контролировать сцену и график интенсивности времени области значений (RTI), а также график Доплеровской интенсивности времени (DTI) исследовать предполагаемую область значений и значение уровня области значений.

r_update = 20;

sceneview = phased.ScenarioViewer('UpdateRate',r_update,...
    'Title','Monostatic Radar with Three Targets');

rtiscope = phased.IntensityScope('Name','Range-Time Intensity Scope',...
    'XLabel','Range (m)', ...
    'XResolution',c/(2*fs), ...
    'XOffset',-(matchingdelay-1)*c/(2*fs), ...
    'TimeResolution',1/r_update,'TimeSpan',5,'IntensityUnits','dB');

nfft = 128;
df = prf/nfft;
dtiscope = phased.IntensityScope(...
    'Name','Doppler-Time Intensity Scope',...
    'XLabel','Velocity (m/sec)', ...
    'XResolution',dop2speed(df,lambda)/2, ...
    'XOffset', dop2speed(-prf/2,lambda)/2, ...
    'TimeResolution',1/r_update,'TimeSpan',5,'IntensityUnits','dB');

Следующий раздел выполняет системную симуляцию и производит визуализацию.

% Pre-allocate array for improved processing speed
rxpulses = zeros(numel(rangeGates),num_pulse_int);

for k = 1:100
    for m = 1:num_pulse_int
        % Update sensor and target positions
        [sensorpos,sensorvel] = sensormotion(1/prf);
        [tgtpos,tgtvel] = tgtmotion(1/prf);

        % Calculate the target angles as seen by the sensor
        [~,tgtang] = rangeangle(tgtpos,sensorpos);

        % Simulate propagation of pulse in direction of targets
        pulse = waveform();
        [txsig,txstatus] = transmitter(pulse);
        txsig = radiator(txsig,tgtang);
        txsig = channel(txsig,sensorpos,tgtpos,sensorvel,tgtvel);

        % Reflect pulse off of targets
        tgtsig = target(txsig);

        % Receive target returns at sensor
        rxsig = collector(tgtsig,tgtang);
        rxpulses(:,m) = receiver(rxsig,~(txstatus>0));
    end

    rxpulses = matchedfilter(rxpulses);

    % Correct for matched filter delay
    rxpulses = buffer(...
        rxpulses(matchingdelay+1:end),...
        size(rxpulses,1));

    rxpulses = tvg(rxpulses);

    rx_int = pulsint(rxpulses,'noncoherent');

    % display RTI
    rtiscope(rx_int);

    % display DTI
    rx_dop = mean(fftshift(...
        abs(fft(rxpulses,nfft,2)),2));
    dtiscope(rx_dop.');

    % display scene
    sceneview(sensorpos,sensorvel,tgtpos,tgtvel);

    % perform next detection when next update is needed
    sensormotion(1/r_update);
    tgtmotion(1/r_update);
end

hide(dtiscope);
hide(rtiscope);

hide(sceneview);
show(rtiscope);

И средство просмотра сценария и RTI обновляются во время симуляции, таким образом, можно легко проверить, запускается ли симуляция как ожидалось и совпадает ли оценка области значений с основной истиной, в то время как симуляция запускается.

hide(rtiscope);
show(dtiscope);

Точно так же DTI обеспечивает оценки уровня области значений каждой цели.

Заключения

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