Генерация кода

Использование генерации кода и преимущества

Можно использовать программное обеспечение Phased Array System Toolbox™ вместе с продуктом MATLAB® Coder™, чтобы создать код C/C++, который реализует функции MATLAB и модели. С этим программным обеспечением вы можете

  • Создайте файл MEX, чтобы ускорить ваше собственное приложение MATLAB.

  • Сгенерируйте независимый исполняемый файл, который запускается независимо от MATLAB на вашем собственном компьютере или другой платформе.

  • Включайте Системные объекты таким же образом как любой другой элемент.

В целом кодом, вы генерируете использование тулбокса, является портативный код С ANSI®. В порядке использовать генерацию кода, вам нужна лицензия MATLAB Coder. Используя Phased Array System Toolbox программное обеспечение требует лицензий и на DSP System Toolbox™ и на Signal Processing Toolbox™. Смотрите страницу Getting Started with MATLAB Coder (MATLAB Coder) для получения дополнительной информации.

Создание файла MEX MATLAB Coder может привести к существенному ускорению ваших алгоритмов MATLAB. Это - также удобный первый шаг в рабочем процессе, который в конечном счете приводит к абсолютно автономному коду. Когда вы создаете файл MEX, он запускается в среде MATLAB. Его вводы и выводы доступны для контроля точно так же, как любая другая переменная MATLAB. Можно использовать визуализацию MATLAB и другие инструменты, для верификации и анализа.

В рамках вашего кода можно запустить определенные команды или как сгенерированный код C или путем выполнения использования движка MATLAB. В случаях, где изолированная команда еще не сделала, чтобы генерация кода поддержала, можно использовать команду coder.extrinsic, чтобы встроить команду в код. Это означает, что сгенерированный код повторно входит в среду MATLAB, когда это должно запустить ту конкретную команду. Это также полезное, если вы хотите встроить определенные команды, которые не могут сгенерировать код (такой как функции построения графика).

Самый простой способ сгенерировать файлы MEX из вашего кода MATLAB при помощи функции codegen в командной строке. Часто, генерация файлы MEX включает не что иное как вызов команды coder на одной из ваших существующих функций. Например, если у вас есть существующая функция, myfunction.m, можно ввести команды в командной строке, чтобы скомпилировать и запустить MEX-функцию. codegen добавляет специфичное для платформы расширение этого имени. В этом случае суффикс "mex" добавляется.

codegen myfunction.m
myfunction_mex;

Можно сгенерировать независимые исполняемые файлы, которые запускаются независимо от среды MATLAB. Можно сделать это путем создания проекта MATLAB Coder в Интегрированной среде разработки (IDE) MATLAB Coder. Также можно дать команду codegen в среде командной строки с соответствующими параметрами конфигурации. Чтобы создать независимый исполняемый файл, необходимо записать собственный main.c или функцию main.cpp. Смотрите Генерацию кода C/C++ (MATLAB Coder) для получения дополнительной информации.

Настройте свой компилятор

Перед использованием codegen, чтобы скомпилировать ваш код, необходимо настроить компилятор C/C++. Для 32-битных платформ Windows MathWorks® предоставляет компилятор по умолчанию MATLAB. Если ваша установка не включает компилятор по умолчанию, можно предоставить собственный компилятор. Для текущего списка поддерживаемых компиляторов см. Поддерживаемые и Совместимые Компиляторы на веб-сайте MathWorks. Установите компилятор, который подходит для вашей платформы. Затем считайте Подготовку C или Компилятора C++ (MATLAB Coder). После установки, в подсказке команды MATLAB, запускают mex -setup. Можно затем использовать функцию codegen, чтобы скомпилировать код.

Функции и системные объекты та генерация кода поддержки

Почти все функции Phased Array System Toolbox и Системные объекты поддерживаются для генерации кода. Для списка поддерживаемых функций и Системных объектов, смотрите Функции и Системные объекты, Поддержанные для Генерации кода C/C++.

Ограничения, характерные для Phased Array System Toolbox

У Генерации кода есть следующие ограничения, когда используется с программным обеспечением Phased Array System Toolbox:

  • Когда вы используете антенны и массивы, которые производят поляризованные поля, параметр EnablePolarization для этих Системных объектов должен быть установлен на true:

    Это требование отличается от регулярного использования MATLAB, где можно установить свойство EnablePolarization на false, даже когда вы используете поддерживающую поляризацию антенну. Например, этот код использует поляризованную антенну, которая требует, чтобы свойство EnablePolarization Системы phased.Radiator object™ было установлено в true.

    function [y] = codegen_radiator()
    sSD = phased.ShortDipoleAntennaElement(...
        'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
    c = physconst('LightSpeed');
    fc = 200e6;
    lambda = c/fc;
    d = lambda/2;
    sURA = phased.URA('Element',sSD,...
        'Size',[3,3],...
        'ElementSpacing',[d,d]);
    sRad = phased.Radiator('Sensor',sURA,...
        'OperatingFrequency',150e6,...
        'CombineRadiatedSignals',true,...
        'EnablePolarization',true);
    x = [1;2;1];
    radiatingAngle = [10;0]; % One angle for one antenna
    y = step(sRad,x,radiatingAngle,eye(3,3));
    

  • Методы визуализации для Системных объектов Phased Array System Toolbox не поддержаны. Этими методами является pattern, patternAzimuth, patternElevation, plot, plotResponse и viewArray.

  • Когда Системный объект содержит другой Системный объект как значение свойства, необходимо установить содержавший Системный объект в конструкторе. Вы не можете использовать обозначение Свойства объекта, чтобы установить свойство. Например,

    antenna = phased.ShortDipoleAntennaElement( ...
        'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
    array = phased.URA('Element',antenna,'Size',[3,3],'ElementSpacing',[0.75,0.75]);
    
    допустимо для codegen, но
    antenna = phased.ShortDipoleAntennaElement( ...
        'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
    array = phased.URA('Size',[3,3],'ElementSpacing',[0.75,0.75]);
    array.Element = antenna;
    
    не.

  • Генерация кода массивов Phased Array System Toolbox, которые содержат антенны Antenna Toolbox™, не поддержана.

  • Список ограничений на функции Phased Array System Toolbox и Системные объекты представлен здесь:

    Функциональный или системный объектОграничение
    plotResponseЭтот метод Системного объекта не поддержан.
    patternЭтот метод Системного объекта не поддержан.
    patternAzimuthЭтот метод Системного объекта не поддержан.
    patternElevationЭтот метод Системного объекта не поддержан.
    plotЭтот метод Системного объекта не поддержан.
    viewArrayЭтот метод Системного объекта не поддержан.
    ambgfunПоддерживаемый только, когда выходные аргументы заданы.
    blakechartЭта функция не поддерживается.
    pambgfunПоддерживаемый только, когда выходные аргументы заданы.
    polsignatureПоддерживаемый только, когда выходные аргументы заданы.
    rocpfa
    • Поддерживаемый только, когда выходные аргументы заданы.

    • Тип сигнала NonfluctuatingNoncoherent не поддержан.

    rocsnr
    • Поддерживаемый только, когда выходные аргументы заданы.

    • Тип сигнала NonfluctuatingNoncoherent не поддержан.

    stokesПоддерживаемый только, когда выходные аргументы заданы.
    phased.ArrayGainЭтот Системный объект не может использоваться с массивами, которые содержат элементы антенны, которые создают поляризованные сигналы, то есть, phased.ShortDipoleAntennaElement или phased.CrossedDipoleAntennaElement
    phased.IntensityScopeЭтот Системный объект не поддержан.
    phased.MatchedFilterСвойство CustomSpectrumWindow не поддержано.
    phased.RangeDopplerResponseCustomRangeWindow и свойства CustomDopplerWindow не поддержаны.
    phased.ScenarioViewerЭтот Системный объект не поддержан.

Общие ограничения

У Генерации кода есть некоторые общие ограничения, не в частности связанные с программным обеспечением Phased Array System Toolbox. Для более полного обсуждения смотрите Системные объекты в Генерации кода MATLAB (MATLAB Coder).

  • Тип данных и сложность (т.е. действительный или комплексный) любого входного параметра к функциональному или Системному объекту должны всегда оставаться то же самое.

  • Вы не можете передать Системный объект никакому методу или функции, что вы сделали внешнее использование coder.extrinsic.

  • Вы не можете загрузить MAT-файл с помощью coder.load, когда он содержит Системный объект. Например, если вы создаете Системный объект в среде MATLAB и сохраняете ее в MAT-файл

    sSD = phased.ShortDipoleAntennaElement(...
                'FrequencyRange',[0.9e8,2e9],'AxisDirection','Y');
    save x.mat sSD;
    clear sSD;
    затем вы не можете загрузить Системный объект в своем скомпилированном файле MEX:
    function codegen_load1()
    W = coder.load('x.mat');
    sSD = W.sSD;
    Компиляция
    codegen codegen_load1
    будет произвел сообщение об ошибке: 'Found unsupported class for variable using function 'coder.load'. MATLAB class 'phased.ShortDipoleAntennaElement' found at 'W.sSD' is unsupported.'

    Чтобы избежать этой проблемы, можно сохранить свойства объекта в MAT-файл, затем, используйте coder.load, чтобы загрузить свойства объектов и воссоздать объект. Например, создайте и сохраните свойства Системного объекта в среде MATLAB

    sSD = phased.ShortDipoleAntennaElement(...
                'FrequencyRange',[0.9e8,2e9],'AxisDirection','Y');
    FrequencyRange = sSD.FrequencyRange;
    AxisDirection = sSD.AxisDirection;
    save x.mat FrequencyRange AxisDirection;
    

    Затем запишите функциональный codegen_load2, чтобы загрузить свойства и создать Системный объект.

    function codegen_load2()
    W = coder.load('x.mat');
    sSD = phased.ShortDipoleAntennaElement(...
        'FrequencyRange',W.FrequencyRange,...
        'AxisDirection',W.AxisDirection);
    Затем дайте команды, чтобы создать и выполнить файл MEX, codegen_load2_mex.
    codegen codegen_load2;
    codegen_load2_mex

  • Свойства системного объекта являются или настраиваемыми или ненастраиваемыми. Если в противном случае не задано, свойства Системного объекта являются ненастраиваемыми. Ненастраиваемые свойства должны быть постоянными. constant является значением, которое может быть оценено во время компиляции. Можно изменить настраиваемые свойства, даже если объект заблокирован. Обратитесь к странице с описанием объекта, чтобы определить, является ли отдельное свойство настраиваемым или нет. При попытке установить ненастраиваемое свойство Системного объекта, и компилятор решает, что это не постоянно, вы получите ошибку. Например, Системный объект phased.URA имеет ненастраиваемое свойство, ElementSpacing, который устанавливает расстояние между элементами. Можно хотеть создать массив, который настраивается на частоту. Вы не можете передать в частоте как входной параметр, потому что частота должна быть константой.

    function [resp] = codegen_const1(fc)
    sSD = phased.ShortDipoleAntennaElement(...
        'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
    c = physconst('LightSpeed');
    lambda = c/fc;
    d = lambda/2;
    sURA = phased.URA('Element',sSD,...
        'Size',[3,3],...
        'ElementSpacing',[d,d]);
    ang = [30;0];
    resp = step(sURA,fc,ang);

    Когда вы codegen эта функция

    fc = 200e6;
    codegen codegen_const1 -args {fc}

    компилятор отвечает, что значение свойства 'ElementSpacing', d, не является постоянным и генерирует сообщение об ошибке: "Failed to compute constant value for nontunable property 'ElementSpacing'. In code generation, nontunable properties can only be assigned constant values." Это не постоянно, потому что это зависит от непостоянной переменной, fc.

    Чтобы исправить эту проблему, установите fc на константу в функции:

    function [resp] = codegen_const2()
    sSD = phased.ShortDipoleAntennaElement(...
        'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
    c = physconst('LightSpeed');
    fc = 200e6;
    lambda = c/fc;
    d = lambda/2;
    sURA = phased.URA('Element',sSD,...
        'Size',[3,3],...
        'ElementSpacing',[d,d]);
    ang = [30;0];
    resp = step(sURA,fc,ang);
    
    и затем компиляция

    codegen codegen_const2
  • Можно присвоить ненастраиваемое значение свойства Системного объекта только однажды, метод step выполняется. Это требование отличается от использования MATLAB, где можно инициализировать эти свойства многократно, прежде чем метод step будет выполнен.

    Этот пример устанавливает свойство Size дважды.

    function codegen_property
    sSD = phased.ShortDipoleAntennaElement(...
        'FrequencyRange',[0.9e8,2e9],'AxisDirection','Y');
    sURA = phased.URA('Element',sSD,...
        'Size',[3,3],...
        'ElementSpacing',[0.15,0.15]);
    sURA.Size = [4,4];

    Когда вы даете команду

    codegen codegen_property

    следующее сообщение об ошибке производится: "A nontunable property may only be assigned once."

  • В определенных случаях компилятор не может определить значения ненастраиваемых свойств во время компиляции, или код даже не может скомпилировать. Рассмотрите следующий пример, который читает в x,y,z - координаты массива с 5 элементами из файла и затем, создает конформный Системный объект массивов. Текстовый файл, elempos.txt, содержит координаты элемента

    -0.5000 -0.2588  0       0.2588  0.5000
    -0.8660 -0.9659 -1.0000 -0.9659 -0.8660
     0       0       0       0       0
    
    Файл, который содержит collectWave.m, читает, элемент координирует и создает объект.
    function y = collectWave(angle)
    elPos = calcElPos;
    cArr = phased.ConformalArray('ElementPosition',elPos);
    y = collectPlaneWave(cArr,randn(4,2),angle,1e8);
    end
    
    function elPos = calcElPos
    fid = fopen('elempos.txt','r');
    el = textscan(fid, '%f');
    n = length(el{1});
    nelem = n/3;
    fclose(fid);
    elPos = reshape(el{1},nelem,3).';
    end
    Попытка скомпилировать
    codegen collectWave -args {[10 30]}
    производит ошибку "Permissions 'r' and 'r+' are not supported".

    Следующим примером является обходное решение, которое использует coder.extrinsic и coder.const, чтобы обеспечить, чтобы значение для ненастраиваемого свойства, 'ElementPosition', было постоянным временем компиляции. Функция в файле, collectWave1.m, создает объект с помощью функции calcElPos. Эта функция запускается в интерпретаторе MATLAB во время компиляции.

    function y = collectWave1(angle)
    coder.extrinsic('calcElPos')
    elPos = coder.const(calcElPos);
    cArr = phased.ConformalArray('ElementPosition',elPos);
    y = collectPlaneWave(cArr,randn(4,2),angle,1e8);
    end
    Файл calcElPos.m загружает положения элемента из текстового файла

    function elPos = calcElPos
    fid = fopen('elempos.txt','r');
    el = textscan(fid, '%f');
    n = length(el{1});
    nelem = n/3;
    fclose(fid);
    elPos = reshape(el{1},nelem,3).';

    Только файл collectWave1.m скомпилирован с codegen. Скомпилировать и запускать

    codegen collectWave1 -args {[10 30]}
    collectWave1_mex([10,30])
    успешно выполнится.

    Альтернативное обходное решение использует coder.load, чтобы обеспечить, чтобы значение ненастраиваемого свойства 'ElementPosition' было постоянным временем компиляции. В среде MATLAB запустите calcElPos2, чтобы сохранить координаты массивов, содержавшиеся в elempos.txt к MAT-файлу. Затем загрузите содержимое MAT-файла в скомпилированном коде.

    function calcElPos2
    fid = fopen('elempos.txt');
    el = textscan(fid, '%f');
    fclose(fid);
    elPos = reshape(el{1},[],3).';
    save('positions', 'elPos');
    end
    Файл collectWave2.m загружает положения координат и создает конформный объект массивов
    function y = collectWave2(angle)
    var = coder.load('positions');
    cArr = phased.ConformalArray('ElementPosition',var.elPos);
    y = collectPlaneWave(cArr,randn(4,2),angle,1e8);
    end
    Только файл collectWave2.m скомпилирован с codegen. Скомпилировать и запускать collectWave2.m
    codegen collectWave2 -args {[10 30]}
    collectWave2_mex([10,30])
    успешно выполнится. Этот второй подход является более общим, чем первое, поскольку MAT-файл может содержать любые переменные, кроме Системных объектов.

  • Системный объект метод clone не поддержан.

Ограничения для Системных объектов, которые Требуют Динамического выделения памяти

Системные объекты, которые требуют динамического выделения памяти, не могут использоваться для генерации кода в следующих случаях:

В блоке MATLAB function в модели Simulink®.
В функции MATLAB в графике Stateflow®.
При использовании MATLAB как язык действия в диаграмме Stateflow.
В блоке Truth Table в модели Simulink.
В блоке MATLAB System (за исключением режима normal mode).
При использовании Simulink Coder для генерации кода.
При использовании MATLAB Coder для генерации кода и динамического выделения памяти отключен.