Отсканируйте радар Используя универсальный прямоугольный массив

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

Радарное определение

Сначала мы создаем поэтапный радар массивов. Мы снова используем большинство подсистем, созданных в примере, Проектируя Основной Моностатический Импульсный Радар. Читатели поощряются исследовать детали разработки радарных систем через тот пример. Существенное различие - то, что мы используем 30 30 универсальный прямоугольный массив (URA) вместо исходной одной антенны.

Существующий радарный проект выполняет следующим техническим требованиям.

pd = 0.9;            % Probability of detection
pfa = 1e-6;          % Probability of false alarm
max_range = 5000;    % Maximum unambiguous range
tgt_rcs = 1;         % Required target radar cross section
int_pulsenum = 10;   % Number of pulses to integrate

Загрузите радиолокационную систему и получите системные параметры.

load BasicMonostaticRadarExampleData;

fc = radiator.OperatingFrequency;         % Operating frequency (Hz)
v = radiator.PropagationSpeed;            % Wave propagation speed (m/s)
lambda = v/fc;                            % Wavelength (m)
fs = waveform.SampleRate;                 % Sampling frequency (Hz)
prf = waveform.PRF;                       % Pulse repetition frequency (Hz)

Затем мы задаем 30 30 универсальный прямоугольный массив.

ura = phased.URA('Element',antenna,...
    'Size',[30 30],'ElementSpacing',[lambda/2, lambda/2]);
% Configure the antenna elements such that they only transmit forward
ura.Element.BackBaffled = true;

% Visualize the response pattern.
pattern(ura,fc,'PropagationSpeed',physconst('LightSpeed'),...
    'Type','powerdb');

Сопоставьте массив с теплоотводом и коллектором.

radiator.Sensor = ura;
collector.Sensor = ura;

% We need to set the WeightsInputPort property to true to enable it to
% accept transmit beamforming weights
radiator.WeightsInputPort = true;

Теперь мы должны повторно вычислить степень передачи. Исходная степень передачи была вычислена на основе одной антенны. Для массива с 900 элементами степень, требуемая для каждого элемента, намного меньше.

% Calculate the array gain
arraygain = phased.ArrayGain('SensorArray',ura,'PropagationSpeed',v);
ag = arraygain(fc,[0;0]);

% Use the radar equation to calculate the peak power
snr_min = albersheim(pd, pfa, int_pulsenum);
peak_power = radareqpow(lambda,max_range,snr_min,waveform.PulseWidth,...
    'RCS',tgt_rcs,'Gain',transmitter.Gain + ag)
peak_power = 0.0065

Новая пиковая мощность составляет 0,0065 ватта.

% Set the peak power of the transmitter
transmitter.PeakPower = peak_power;

Мы также должны спроектировать расписание сканирования поэтапного массива. Чтобы упростить пример, мы только ищем в размерности азимута. Мы требуем, чтобы радар искал от 45 градусов до-45 градусов в области азимута. Пересмотреть время должно быть меньше 1 секунды, означая, что радар должен пересмотреть тот же угол азимута в течение 1 секунды.

initialAz = 45; endAz = -45; 
volumnAz = initialAz - endAz;

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

G=4πθ2

где G усиление массивов и θ ширина луча на 3 дБ.

% Calculate 3-dB beamwidth
theta = radtodeg(sqrt(4*pi/db2pow(ag)))
theta = 6.7703

Ширина луча на 3 дБ является 6,77 градусами. Чтобы допускать некоторое перекрытие луча на пробеле, мы выбираем шаг сканирования, чтобы быть 6 градусами.

scanstep = -6;
scangrid = initialAz+scanstep/2:scanstep:endAz;
numscans = length(scangrid);    
pulsenum = int_pulsenum*numscans;

% Calculate revisit time
revisitTime = pulsenum/prf
revisitTime = 0.0050

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

Целевое определение

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

tgtpos = [[3532.63; 800; 0],[2020.66; 0; 0]];
tgtvel = [[-100; 50; 0],[60; 80; 0]];
tgtmotion = phased.Platform('InitialPosition',tgtpos,'Velocity',tgtvel);

tgtrcs = [1.6 2.2];
target = phased.RadarTarget('MeanRCS',tgtrcs,'OperatingFrequency',fc);

% Calculate the range, angle, and speed of the targets
[tgtrng,tgtang] = rangeangle(tgtmotion.InitialPosition,...
    sensormotion.InitialPosition);

numtargets = length(target.MeanRCS);

Импульсный синтез

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

% Create the steering vector for transmit beamforming
steeringvec = phased.SteeringVector('SensorArray',ura,...
    'PropagationSpeed',v);

% Create the receiving beamformer
beamformer = phased.PhaseShiftBeamformer('SensorArray',ura,...
    'OperatingFrequency',fc,'PropagationSpeed',v,...
    'DirectionSource','Input port');

% Define propagation channel for each target
channel = phased.FreeSpace(...
    'SampleRate',fs,...
    'TwoWayPropagation',true,...
    'OperatingFrequency',fc);

fast_time_grid = unigrid(0, 1/fs, 1/prf, '[)');

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

for m = 1:pulsenum

    % Update sensor and target positions
    [sensorpos,sensorvel] = sensormotion(1/prf);
    [tgtpos,tgtvel] = tgtmotion(1/prf);

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

    % Calculate steering vector for current scan angle
    scanid = floor((m-1)/int_pulsenum) + 1;
    sv = steeringvec(fc,scangrid(scanid));
    w = conj(sv);
    
    % Form transmit beam for this scan angle and simulate propagation
    pulse = waveform();
    [txsig,txstatus] = transmitter(pulse);
    txsig = radiator(txsig,tgtang,w);
    txsig = channel(txsig,sensorpos,tgtpos,sensorvel,tgtvel);
    
    % Reflect pulse off of targets
    tgtsig = target(txsig);
    
    % Beamform the target returns received at the sensor
    rxsig = collector(tgtsig,tgtang);
    rxsig = receiver(rxsig,~(txstatus>0));    
    rxpulses(:,m) = beamformer(rxsig,[scangrid(scanid);0]);
end

Согласованный фильтр

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

% Matched filtering
matchingcoeff = getMatchedFilter(waveform);
matchedfilter = phased.MatchedFilter(...
    'Coefficients',matchingcoeff,...
    'GainOutputPort',true);
[mf_pulses, mfgain] = matchedfilter(rxpulses);
mf_pulses = reshape(mf_pulses,[],int_pulsenum,numscans);

matchingdelay = size(matchingcoeff,1)-1;
sz_mfpulses = size(mf_pulses);
mf_pulses = [mf_pulses(matchingdelay+1:end) zeros(1,matchingdelay)];
mf_pulses = reshape(mf_pulses,sz_mfpulses);

% Pulse integration
int_pulses = pulsint(mf_pulses,'noncoherent');
int_pulses = squeeze(int_pulses);

% Visualize
r = v*fast_time_grid/2;
X = r'*cosd(scangrid); Y = r'*sind(scangrid);
clf;
pcolor(X,Y,pow2db(abs(int_pulses).^2));
axis equal tight 
shading interp
axis off
text(-800,0,'Array');
text((max(r)+10)*cosd(initialAz),(max(r)+10)*sind(initialAz),...
    [num2str(initialAz) '^o']);
text((max(r)+10)*cosd(endAz),(max(r)+10)*sind(endAz),...
    [num2str(endAz) '^o']);
text((max(r)+10)*cosd(0),(max(r)+10)*sind(0),[num2str(0) '^o']);
colorbar;

Из карты сканирования мы можем ясно видеть два peaks. Близкий - приблизительно в 0 азимутах степеней, удаленном приблизительно в 10 градусах в области азимута.

Обнаружение и оценка области значений

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

range_gates = v*fast_time_grid/2;
tvg = phased.TimeVaryingGain(...
    'RangeLoss',2*fspl(range_gates,lambda),...
    'ReferenceLoss',2*fspl(max(range_gates),lambda));
tvg_pulses = tvg(mf_pulses);

% Pulse integration
int_pulses = pulsint(tvg_pulses,'noncoherent');
int_pulses = squeeze(int_pulses);

% Calculate the detection threshold

% sample rate is twice the noise bandwidth in the design system
noise_bw = receiver.SampleRate/2;
npower = noisepow(noise_bw,...
    receiver.NoiseFigure,receiver.ReferenceTemperature);
threshold = npower * db2pow(npwgnthresh(pfa,int_pulsenum,'noncoherent'));
% Increase the threshold by the matched filter processing gain
threshold = threshold * db2pow(mfgain);

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

N = 51;
clf;
surf(X(N:end,:),Y(N:end,:),...
    pow2db(abs(int_pulses(N:end,:)).^2));
hold on;
mesh(X(N:end,:),Y(N:end,:),...
    pow2db(threshold*ones(size(X(N:end,:)))),'FaceAlpha',0.8);
view(0,56);
axis off

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

[~,peakInd] = findpeaks(int_pulses(:),'MinPeakHeight',sqrt(threshold));
[rngInd,angInd] = ind2sub(size(int_pulses),peakInd);
est_range = range_gates(rngInd); % Estimated range
est_angle = scangrid(angInd);    % Estimated direction

Доплер Эстимэйшн

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

for m = numtargets:-1:1
    [p, f] = periodogram(mf_pulses(rngInd(m),:,angInd(m)),[],256,prf, ...
                'power','centered');
    speed_vec = dop2speed(f,lambda)/2;   

    spectrum_data = p/max(p);
    [~,dop_detect1] = findpeaks(pow2db(spectrum_data),'MinPeakHeight',-5);
    sp(m) = speed_vec(dop_detect1); % Estimated Doppler speed
end

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

------------------------------------------------------------------------
               Estimated (true) target parameters
------------------------------------------------------------------------
                 Range (m)       Azimuth (deg)   Speed (m/s)
Target 1:    3625.00 (3622.08)   12.00 (12.76)   86.01 (86.49)
Target 2:    2025.00 (2020.66)    0.00 (0.00)   -59.68 (-60.00)

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

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

Для просмотра документации необходимо авторизоваться на сайте