Phased Array System Toolbox™ может использоваться, чтобы смоделировать сквозную систему фазированных решеток - сгенерировать переданную форму волны, симулировать возврат цели, а затем обработать принятый сигнал, чтобы обнаружить цель. Это показано в примерах: Симуляция тестовых сигналов для радарного приемника и проект формы волны для улучшения эффективности области значений существующей системы. В этом примере показано, как симулировать такую систему в потоковом режиме, чтобы вы могли запускать симуляцию в течение длительного времени и наблюдать динамику системы.
Сначала настройте радиолокационную систему с некоторыми базовыми параметрами. Вся радиолокационная система аналогична той, которая показана в проекте для улучшения эффективности области значений существующей системы.
fs = 6e6; bw = 3e6; c = 3e8; fc = 10e9; prf = 18750; num_pulse_int = 10; [waveform,transmitter,radiator,collector,receiver,sensormotion,... target,tgtmotion,channel,matchedfilter,tvg,threshold] = ... helperRadarStreamExampleSystemSetup(fs,bw,prf,fc,c);
Затем запустите симуляцию для 100 импульсов. Во время этой симуляции четыре временных диапазона используются, чтобы наблюдать сигналы на различных этапах. Первые три области отображают переданный сигнал, принятый сигнал и сигнал после согласования и регулируемый усилением для 10-импульсов. Несмотря на то, что переданный сигнал является последовательностью импульсов большой мощности, область 2 показывает намного более слабый принятый сигнал из-за потерь распространения. Этот сигнал не может быть обнаружен с помощью предустановленного порога обнаружения. Даже после согласованной фильтрации и компенсации усиления все еще трудно обнаружить все три цели.
% pre-allocation fast_time_grid = 0:1/fs:1/prf-1/fs; num_pulse_samples = numel(fast_time_grid); rx_pulses = complex(zeros(num_pulse_samples,num_pulse_int)); mf_pulses = complex(zeros(num_pulse_samples,num_pulse_int)); detect_pulse = zeros(num_pulse_samples,1); % simulation loop for m = 1:10*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 [tgtrng,tgtang] = rangeangle(tgtpos,sensorpos); % Simulate propagation of pulse in direction of targets pulse = waveform(); [pulse,txstatus] = transmitter(pulse); txsig = radiator(pulse,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); nn = mod(m-1,num_pulse_int)+1; rx_pulses(:,nn) = receiver(rxsig,~(txstatus>0)); % Detection processing mf_pulses(:,nn) = matchedfilter(rx_pulses(:,nn)); mf_pulses(:,nn) = tvg(mf_pulses(:,nn)); % Perform pulse integration every 'num_pulse_int' pulses if nn == num_pulse_int detect_pulse = pulsint(mf_pulses,'noncoherent'); end helperRadarStreamDisplay(pulse,abs(rx_pulses(:,nn)),... abs(mf_pulses(:,nn)),detect_pulse,... sqrt(threshold)*ones(num_pulse_samples,1)); end
Поскольку радиолокационные системы требуют интенсивной обработки, скорость симуляции является основной проблемой. После того, как вы запустили 100 импульсов, чтобы проверить ваш код, вы, возможно, захотите запустить 1000 импульсов. Когда вы запускаете симуляцию в интерпретированном режиме MATLAB, можно измерить прошедшее время, используя:
tic; helperRadarStreamRun; time_interpreted = toc
time_interpreted = 3.4775
Если симуляция слишком медленная, можно ускорить ее с помощью MATLAB Coder™. MATLAB Coder может сгенерировать скомпилированный код MATLAB ®, что приводит к значительному улучшению скорости обработки. В этом примере MATLAB Coder генерирует функцию helperRadarStreamRun_mex из функции helperRadarStreamRun. Используемая команда показана ниже:
codegen helperRadarStreamRun.m
Когда вызывается версия mex, скорость симуляции улучшается.
tic; helperRadarStreamRun_mex; time_compiled = toc
time_compiled = 0.7795
Улучшение скорости зависит от нескольких факторов, таких как скорость центрального процессора машины и доступная память, но обычно увеличивается в 3-4 раза. Обратите внимание, что визуализация данных с помощью возможностей не ускоряется MATLAB Coder и все еще обрабатывается интерпретатором MATLAB. Если визуализация не является критической для вашей симуляции, то можно удалить их для дальнейшего улучшения скорости.
Ниже приводятся несколько компромиссов, которые следует учитывать при принятии этого подхода:
Возможность визуализации в сгенерированном коде очень ограничена по сравнению с тем, что доступно в MATLAB. Если вам нужно сохранить визуализацию в симуляции, используйте coder.extrinsic
трюк; но это замедляет симуляцию.
Сгенерированный код не допускает динамических изменений типа и размера переменной по сравнению с оригинальным кодом MATLAB. Сгенерированный код часто оптимизируется для конкретного типа и размера переменной; поэтому любое изменение типа и размера переменной, которое может быть вызвано, например, изменением PRF, требует перекомпиляции.
Преимущество скорости симуляции становится более важным, когда время симуляции MATLAB велико. Если симуляция MATLAB закончится за несколько секунд, вы не получите много, сгенерировав код из исходной симуляции MATLAB. Как упоминалось в предыдущей пуле, часто приходится перекомпилировать код при изменении параметров. Поэтому может быть лучше сначала использовать симуляцию MATLAB, чтобы идентифицировать соответствующие значения параметров, а затем использовать сгенерированный код, чтобы запустить длинные симуляции.
Этот пример показывает, как выполнить симуляцию радиолокационной системы в потоковом режиме. Также показано, как генерация кода может использоваться для ускорения симуляции. Компромисс между использованием сгенерированного кода и кода MATLAB обсуждается в конце.