Для создания кода 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 |
|
rocsnr |
|
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;
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);
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.mcodegen collectWave2 -args {[10 30]} collectWave2_mex([10,30])
Системный объект clone метод не поддерживается.
Системные объекты, требующие динамического выделения памяти, не могут использоваться для создания кода в следующих случаях:
| Внутри функционального блока MATLAB в модели Simulink ®. |
| Внутри функции MATLAB в диаграмме Stateflow ®. |
| При использовании MATLAB в качестве языка действий в диаграмме Stateflow. |
| Внутри блока таблицы истинности в модели Simulink. |
| Внутри системного блока MATLAB (за исключением обычного режима). |
| При использовании Simulink Coder для создания кода. |
| При использовании кодера MATLAB для генерации кода динамическое выделение памяти отключено. |