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