Можно использовать программное обеспечение 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 (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:
Когда вы используете антенны и массивы, которые производят поляризованные поля, 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
график
, 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 |
|
rocsnr |
|
stokes | Поддерживаемый только, когда выходные аргументы заданы. |
phased.ArrayGain | Этот Системный объект не может использоваться с массивами, которые содержат элементы антенны, которые создают поляризованные сигналы, то есть, phased.ShortDipoleAntennaElement или phased.CrossedDipoleAntennaElement |
phased.IntensityScope | Этот Системный объект не поддержан. |
phased.MatchedFilter | CustomSpectrumWindow свойство не поддержано. |
phased.RangeDopplerResponse | CustomRangeWindow и 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;
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);
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])
Системный объект clone
метод не поддержан.
Системные объекты, которые требуют динамического выделения памяти, не могут использоваться в генерации кода в следующих случаях:
В блоке MATLAB function в модели Simulink®. |
В функции MATLAB в графике Stateflow®. |
При использовании MATLAB как язык действия в диаграмме Stateflow. |
В блоке Truth Table в модели Simulink. |
В блоке MATLAB System (за исключением режима normal mode). |
При использовании Simulink Coder для генерации кода. |
При использовании MATLAB Coder для генерации кода и динамического выделения памяти отключен. |