Можно использовать программное обеспечение 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:
Когда вы используете антенны и массивы, которые производят поляризованные поля, параметр 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 |
|
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 для генерации кода и динамического выделения памяти отключен. |