В этом примере моделируется радар с фазированной решеткой, который периодически сканирует заранее определенную область наблюдения. В этом моностатическом радаре используется прямоугольная матрица из 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 дБ.
4íü 2
где - коэффициент усиления матрицы, - ширина луча 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/prfrevisitTime = 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)
В этом примере мы показали, как моделировать радар с фазированной решеткой для сканирования предопределенной области наблюдения. Мы показали, как разработать расписание сканирования. Для обработки принятого многоканального сигнала использовали обычный формирователь луча. Из отраженных импульсов выделяют дальность, угол и доплеровскую информацию каждой цели. Эта информация может использоваться в дальнейших задачах, таких как оценка направления прибытия с высоким разрешением или отслеживание цели.