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