Поток и ускоряет системную симуляцию

Phased Array System Toolbox™ может использоваться, чтобы смоделировать сквозную систему фазированной решетки - генерируют переданную форму волны, симулируют целевой возврат, и затем обрабатывают полученный сигнал обнаружить цель. Это показывают в примерах: Симуляция Тестовых сигналов для Радарного Проекта Приемника и Формы волны, чтобы Улучшать Производительность Области значений Существующей Системы. В этом примере показано, как симулировать такую систему в потоковом режиме, таким образом, можно запускать симуляцию в течение долгого времени и наблюдать системную динамику.

Setup симуляции

Во-первых, настройте радиолокационную систему с некоторыми основными параметрами. Целая радиолокационная система похожа на один показанный в Проекте Формы волны, чтобы Улучшать Производительность Области значений Существующего Системного примера.

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 импульсов, чтобы проверить ваш код, можно хотеть запустить 1 000 импульсов. Когда вы запускаете симуляцию в интерпретированном режиме MATLAB, можно измерить прошедшее время с помощью:

tic;
helperRadarStreamRun;
time_interpreted = toc
time_interpreted =

    3.5121

Если симуляция является слишком медленной, можно ускорить ее использование MATLAB Coder™. MATLAB Coder может сгенерировать, скомпилировал код MATLAB®, приводящий к существенному улучшению в обработке скорости. В этом примере MATLAB Coder генерирует функцию helperRadarStreamRun_mex от функции helperRadarStreamRun.

codegen helperRadarStreamRun.m
Code generation successful.

Когда mex версия вызывается, скорость симуляции улучшена.

tic;
helperRadarStreamRun_mex;
time_compiled = toc
time_compiled =

    1.1352

Улучшение ускорения зависит от нескольких факторов, таких как скорость ЦП машины и доступная память, но обычно увеличивается 3-4 раза. Обратите внимание на то, что визуализация данных с помощью осциллографов не ускорена MATLAB Coder и все еще обработана интерпретатором MATLAB. Если визуализация не очень важна для вашей симуляции, то можно удалить их для дальнейшего улучшения скорости.

Ниже несколько компромиссов, чтобы рассмотреть при принятии этого подхода:

  1. Возможность визуализации в сгенерированном коде очень ограничена по сравнению с тем, что доступно в MATLAB. Если необходимо сохранить визуализацию в симуляции, используйте coder.extrinsic прием; но это замедляет симуляцию.

  2. Сгенерированный код не позволяет динамические изменения типа переменной и размера по сравнению с оригинальным кодом MATLAB. Сгенерированный код часто оптимизируется для конкретного типа переменной и размера; поэтому, любое изменение в типе переменной и размере, который может быть вызван, например, изменением в PRF, требует перекомпилировать.

  3. Преимущество скорости симуляции становится более важным, когда время симуляции MATLAB длинно. Если симуляция MATLAB заканчивается через несколько секунд, вы не получаете много путем генерации кода от исходной симуляции MATLAB. Как упомянуто в предыдущем маркере, часто необходимо перекомпилировать код, когда параметры изменяются. Поэтому может быть лучше сначала использовать симуляцию MATLAB, чтобы идентифицировать соответствующие значения параметров и затем использовать сгенерированный код, чтобы запустить долгие симуляции.

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

В этом примере показано, как выполнить симуляцию радиолокационной системы в потоковом режиме. Это также показывает, как генерация кода может использоваться, чтобы ускорить симуляцию. Компромисс между использованием сгенерированного кода и кодом MATLAB обсужден в конце.