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

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

Можно использовать программное обеспечение 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™. Смотрите Начало работы со страницей MATLAB Coder (MATLAB Coder) для получения дополнительной информации.

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

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

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

codegen myfunction.m
myfunction_mex;

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

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

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

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

Почти все функции 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 (MATLAB Coder), но
    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Поддерживаемый только, когда выходные аргументы заданы.
    pambgfunПоддерживаемый только, когда выходные аргументы заданы.
    polsignatureПоддерживаемый только, когда выходные аргументы заданы.
    rocpfa
    • Поддерживаемый только, когда выходные аргументы заданы.

    • NonfluctuatingNoncoherent тип сигнала не поддерживается.

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

    • NonfluctuatingNoncoherent тип сигнала не поддерживается.

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

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

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

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

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

  • Вы не можете загрузить использование MAT-файла coder.load (MATLAB Coder), когда это содержит Системный объект. Например, если вы создаете Системный объект в среде 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 Coder), чтобы загрузить свойства объектов и воссоздать объект. Например, создайте и сохраните свойства Системного объекта в среде 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
  • Можно присвоить ненастраиваемое значение свойства Системного объекта только однажды a 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 (MATLAB Coder) и coder.const (MATLAB Coder), чтобы обеспечить, что значение для ненастраиваемого свойства, '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 (MATLAB Coder). Скомпилировать и запускать

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

    Альтернативное обходное решение использует coder.load (MATLAB Coder), чтобы обеспечить, что значение ненастраиваемого свойства '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 (MATLAB Coder). Скомпилировать и запускать 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 для генерации кода и динамического выделения памяти отключен.