exponenta event banner

Создание кода

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

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

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

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

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

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

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

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

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

codegen myfunction.m
myfunction_mex;

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

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

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

Функции и системные объекты, поддерживающие создание кода

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

Ограничения, характерные для панели инструментов поэтапной системы массива

Создание кода имеет следующие ограничения при использовании с программным обеспечением 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 System) не поддерживаются. Эти методы: pattern, patternAzimuth, patternElevation, plot, plotResponse, и viewArray.

  • Если объект System содержит другой объект System в качестве значения свойства, необходимо задать содержащийся объект System в конструкторе. Для задания свойства нельзя использовать нотацию свойства объекта. Например,

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

  • Генерация кода матриц панели инструментов системы фазированной решетки, содержащих антенны Antenna Toolbox™, не поддерживается.

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

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

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

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

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

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

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

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

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

  • Нельзя передать объект System какому-либо методу или функции, сделанному внешним с помощью coder.extrinsic (Кодер MATLAB).

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

    sSD = phased.ShortDipoleAntennaElement(...
                'FrequencyRange',[0.9e8,2e9],'AxisDirection','Y');
    save x.mat sSD;
    clear sSD;
    тогда невозможно загрузить объект System в скомпилированный 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) для загрузки свойств объекта и повторного создания объекта. Например, создайте и сохраните свойства объекта System в среде MATLAB

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

    Затем запишите функцию codegen_load2 для загрузки свойств и создания объекта System.

    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

  • Свойства системных объектов настраиваются или не настраиваются. Если не указано иное, свойства объекта System не настраиваются. Неперестраиваемые свойства должны быть постоянными. Константа - это значение, которое можно вычислить во время компиляции. Настраиваемые свойства можно изменить, даже если объект заблокирован. Если вы попытаетесь задать неперестраиваемое свойство объекта System и компилятор определит, что оно не является постоянным, вы получите ошибку. Например, 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
  • Неперестраиваемое значение свойства объекта System можно назначить только один раз перед 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-элементного массива из файла, а затем создает конформный объект System массива. Текстовый файл,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.const (Кодер MATLAB), чтобы гарантировать, что значение для неперестраиваемого свойства, '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). Компиляция и выполнение

    codegen collectWave1 -args {[10 30]}
    collectWave1_mex([10,30])
    будет иметь успех.

    Альтернативное обходное использование coder.load (Кодер MATLAB), чтобы гарантировать, что значение неперестраиваемого свойства '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). Компиляция и выполнение collectWave2.m
    codegen collectWave2 -args {[10 30]}
    collectWave2_mex([10,30])
    будет иметь успех. Этот второй подход является более общим, чем первый, поскольку MAT-файл может содержать любые переменные, кроме системных объектов.

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

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

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

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