exponenta event banner

Электронное сканирование с использованием однородного прямоугольного массива

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

Определение радара

Сначала мы создаем радар с фазированной антенной решеткой. Мы повторно используем большинство подсистем, построенных в примере Моделирование тестовых сигналов для радарного приемника. На этом примере читателям рекомендуется изучить детали конструкции радиолокационной системы. Главное отличие состоит в том, что вместо исходной одиночной антенны мы используем однородную прямоугольную решетку (URA) 30 на 30.

Существующая конструкция РЛС отвечает следующим техническим условиям.

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]);

% Calculate the peak power
snr_min = albersheim(pd, pfa, int_pulsenum);
peak_power = ((4*pi)^3*noisepow(1/waveform.PulseWidth)*max_range^4*...
    db2pow(snr_min))/(db2pow(2*(transmitter.Gain+ag))*tgt_rcs*lambda^2)
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-dB.

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

Ширина луча 3-dB составляет 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;

На карте сканирования ясно видно два пика. Близкий - при азимуте около 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

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

[~,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)

Резюме

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