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

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

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

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

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

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

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

Создание MATLAB Coder файла MEX может привести к существенному ускорению алгоритмов 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 System не поддерживаются. Эти методы 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
    • Поддерживается только при указании выходных аргументов.

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

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

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

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

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

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

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

  • Вы не можете передать Системный объект ни одному методу или функции, которые вы сделали внешними 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 является значением, которое может быть оценено во время компиляции. Можно изменить настраиваемые свойства, даже если объект заблокирован. Обратитесь к объекту страницы с описанием, чтобы определить, является ли индивидуальное свойство настраиваемым или нет. Если вы пытаетесь задать свойство nontunable Системного объекта и компилятор определяет, что оно не является постоянным, вы получите ошибку. Для примера, phased.URA Системный объект имеет свойство nontunable, 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 -cordinates массива с 5 элементами из файла, а затем, создает conformal array системный объект. Текстовый файл, 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), чтобы гарантировать, что значение для свойства nontunable, '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), чтобы гарантировать, что значение свойства nontunable '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 загружает положения координат и создает объект conformal array
    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.
Внутри блока Таблица в модели Simulink.
Внутри блока MATLAB System (кроме режима normal mode).
При использовании Simulink Coder для генерации кода.
При использовании MATLAB Coder для генерации кода и динамического выделения памяти отключается.