Fixed-Point Designer™ должен определить свойства всех переменных в файлах MATLAB® во время компиляции. Чтобы вывести переменные свойства в файлах MATLAB, Fixed-Point Designer должен смочь идентифицировать свойства входных параметров к первичной функции, также известной как функцию или точки входа верхнего уровня. Поэтому, если ваша первичная функция имеет входные параметры, необходимо задать свойства этих входных параметров к Fixed-Point Designer. Если ваша первичная функция не имеет никаких входных параметров, Fixed-Point Designer может скомпилировать ваш файл MATLAB без модификации. Вы не должны задавать свойства входных параметров к локальным функциям или внешним функциям, вызванным первичной функцией.
Если ваша первичная функция имеет входные параметры, необходимо задать следующие свойства для каждого входа.
Для | Задайте свойства | ||||
---|---|---|---|---|---|
Класс | Размер | Сложность | numerictype | fimath | |
Входные параметры фиксированной точки |
|
|
|
|
|
Каждое поле в структуре вводится | |||||
Другие входные параметры |
|
|
|
Fixed-Point Designer присваивает следующие значения по умолчанию для свойств входных параметров первичной функции.
Свойство | Значение по умолчанию |
---|---|
класс | double |
размер | scalar |
сложность | real |
numerictype | Никакое значение по умолчанию |
fimath | Значение по умолчанию MATLAB fimath объект |
Следующая таблица представляет имена классов, поддержанные Fixed-Point Designer.
ClassName | Описание |
---|---|
logical | Логический массив истинных и ложных значений |
char | Массив символов |
int8 | 8-битный массив целого числа со знаком |
uint8 | 8-битный массив беззнаковых целых чисел |
int16 | 16-битный массив целого числа со знаком |
uint16 | 16-битный массив беззнаковых целых чисел |
int32 | 32-битный массив целого числа со знаком |
uint32 | 32-битный массив беззнаковых целых чисел |
int64 | 64-битный массив целого числа со знаком |
uint64 | 64-битный массив беззнаковых целых чисел |
single | Массив номера или фиксированной точки с плавающей точкой с одинарной точностью |
double | Массив номера или фиксированной точки с плавающей точкой с двойной точностью |
struct | Массив структур |
embedded.fi | Массив номера фиксированной точки |
При определении свойств первичных входных параметров следуйте этим правилам:
Порядок элементов в массиве ячеек должен соответствовать порядку, в котором входные параметры появляются в подписи первичной функции. Например, первый элемент в массиве ячеек задает свойства первого входа первичной функции.
Чтобы сгенерировать меньше аргументов, чем те аргументы, которые происходят в функции MATLAB, задайте свойства только для количества аргументов, которые вы хотите в сгенерированной функции.
Если функция MATLAB имеет входные параметры, чтобы сгенерировать функцию, которая не имеет никаких входных параметров, передайте массив пустой ячейки -args
.
Для каждого входа первичной функции, класс которого является фиксированной точкой (fi
), задайте вход numerictype
и fimath
свойства.
Для каждого входа первичной функции, классом которого является struct
, задайте свойства каждого из его полей в порядке, что они появляются в определении структуры.
Метод | Преимущества | Недостатки |
---|---|---|
|
| |
Задайте входные свойства на примере в командной строке Примечание Если вы задаете входные свойства программно в файле MATLAB, вы не можете использовать этот метод |
|
|
Задайте входные свойства программно в файле MATLAB (MATLAB Coder) |
|
|
fiaccel
функция обеспечивает параметр командной строки -args
для определения свойств первичных (точка входа) входные параметры функции как массив ячеек значений в качестве примера или типов. Массив ячеек может быть переменным или литеральным массивом постоянных значений. Используя эту опцию, вы задаете свойства входных параметров в то же время, что и вы генерируете код для функции MATLAB с fiaccel
.
Можно также создать coder.Type
объекты в интерактивном режиме при помощи Редактора типов Кодера. Смотрите Создают и Входные Типы Редактирования при помощи Редактора типов Кодера (MATLAB Coder).
При использовании -args
параметр командной строки, чтобы задать свойства на примере, следуйте этим правилам:
Порядок элементов в массиве ячеек должен соответствовать порядку, в котором входные параметры появляются в подписи первичной функции. Например, первый элемент в массиве ячеек задает свойства первого входа первичной функции.
Чтобы сгенерировать меньше аргументов, чем те аргументы, которые происходят в функции MATLAB, задайте свойства только для количества аргументов, которые вы хотите в сгенерированной функции.
Если функция MATLAB имеет входные параметры, чтобы сгенерировать функцию, которая не имеет никаких входных параметров, передайте массив пустой ячейки -args
.
Для каждого входа первичной функции, класс которого является фиксированной точкой (fi
), задайте вход numerictype
и fimath
свойства.
Для каждого входа первичной функции, классом которого является struct
, задайте свойства каждого из его полей в порядке, что они появляются в определении структуры.
Рассмотрите функцию, которая добавляет ее два входных параметров:
function y = emcf(u,v) %#codegen % The directive %#codegen indicates that you % intend to generate code for this algorithm y = u + v;
Следующие примеры показывают, как задать различные свойства первичных входных параметров u
и v
на примере в командной строке:
Используйте литеральный массив ячеек констант, чтобы указать, что оба входных параметров являются действительными, скалярными значениями фиксированной точки:
fiaccel -o emcfx emcf ... -args {fi(0,1,16,15),fi(0,1,16,15)}
Используйте литеральный массив ячеек констант, чтобы задать тот вход u
16-битный, вектор 1 на 4 без знака и вход v
скаляр, значение фиксированной точки:
fiaccel -o emcfx emcf ... -args {zeros(1,4,'uint16'),fi(0,1,16,15)}
Присвойте демонстрационные значения переменной массива ячеек, чтобы указать, что оба входных параметров являются действительными, 8-битными целочисленными векторами без знака:
a = fi([1;2;3;4],0,8,0) b = fi([5;6;7;8],0,8,0) ex = {a,b} fiaccel -o emcfx emcf -args ex
Рассмотрите функцию, которая вычисляет квадратный корень из номера фиксированной точки:
function y = sqrtfi(x) %#codegen y = sqrt(x);
Задавать свойства первичного входа x
фиксированной точки на примере на командной строке MATLAB, выполните эти шаги:
Задайте numerictype
свойства для x
, как в этом примере:
T = numerictype('WordLength',32,... 'FractionLength',23,'Signed',true);
Задайте fimath
свойства для x
, как в этом примере:
F = fimath('SumMode','SpecifyPrecision',... 'SumWordLength',32,'SumFractionLength',23,... 'ProductMode','SpecifyPrecision', ... ProductWordLength',32,'ProductFractionLength',23);
Создайте переменную фиксированной точки с numerictype
и fimath
свойства вы задали, как в этом примере:
myeg = { fi(4.0,T,F) };
Скомпилируйте функциональный sqrtfi
использование fiaccel
команда, передавая переменную myeg
в качестве аргумента к the-args
опция, как в этом примере:
fiaccel sqrtfi -args myeg;
Если вы знаете, что ваши первичные входные параметры не изменяются во время выполнения, можно уменьшать наверху в сгенерированном коде путем указывания, что первичные входные параметры являются постоянными значениями. Постоянные входные параметры обычно используются для флагов, которые управляют, как алгоритм выполняется и значения, которые задают размеры или типы данных.
Чтобы указать, что входные параметры являются константами, используйте -args
параметр командной строки с coder.Constant
объект. Указывать, что вход является константой с размером, классом, сложностью и значением constant_input
, используйте следующий синтаксис:
-args {coder.Constant(constant_input
)}
fiaccel
постоянная функция компиляций вводит в сгенерированный код. В результате подпись MEX-функции отличается от подписи функции MATLAB. Во время выполнения вы предоставляете аргумент константы к функции MATLAB, но не к MEX-функции.
Например, рассмотрите следующий функциональный identity
который копирует его вход в его выход:
function y = identity(u) %#codegen y = u;
Сгенерировать MEX-функцию identity_mex
с постоянным входом введите следующую команду в подсказке MATLAB:
fiaccel -o identity_mex identity... -args {coder.Constant(fi(0.1,1,16,15))}
Чтобы запустить функцию MATLAB, предоставьте аргумент константы можно следующим образом:
identity(fi(0.1,1,16,15))
Вы получаете следующий результат:
ans = 0.1000
Теперь попытайтесь запустить MEX-функцию с этой командой:
identity_mex
Необходимо получить тот же ответ.
Предположим, что вы задаете структуру tmp
в рабочем пространстве MATLAB, чтобы задать размерности матрицы, можно следующим образом:
tmp = struct('rows', 2, 'cols', 3);
Следующая функция MATLAB rowcol
принимает вход p
структуры задавать матричный
y
:
function y = rowcol(u,p) %#codegen y = fi(zeros(p.rows,p.cols),1,16,15) + u;
Следующий пример показывает, как задать тот первичный входной параметр u
двойной скалярный ввод переменной и первичный входной параметр p
постоянная структура:
fiaccel rowcol ... -args {fi(0,1,16,15),coder.Constant(tmp)}
Чтобы запустить этот код, использовать
u = fi(0.5,1,16,15) y_m = rowcol(u,tmp) y_mex = rowcol_mex(u)
Данные переменного размера являются данными, размер которых может измениться во время выполнения. Поддержки MATLAB ограниченные и неограниченные данные переменного размера для генерации кода. Bounded variable-size data зафиксировал верхние границы. Эти данные могут быть выделены статически на стеке или динамически на куче. Unbounded variable-size data не имеет зафиксированных верхних границ. Эти данные должны быть выделены на куче. Можно задать входные параметры, чтобы иметь одну или несколько размерностей переменного размера — и задать их верхние границы — использование -args
опция и coder.typeof
функция:
-args {coder.typeof(example_value, size_vector, variable_dims)}
Тот же класс и сложность как example_value
Тот же размер и верхние границы как size_vector
Переменные размерности заданы variable_dims
Когда вы включаете динамическое выделение памяти, можно задать Inf
в векторе размера для размерностей с неизвестными верхними границами во время компиляции.
Когда variable_dims
скаляр, он применяется ко всем размерностям за следующими исключениями:
Если размерность равняется 1 или 0, которые фиксируются.
Если размерность неограниченна, который всегда является переменным размером.
Запишите функцию, которая вычисляет сумму каждого n
элементы векторного A
и хранит их в векторном B
:
function B = nway(A,n) %#codegen % Compute sum of every N elements of A and put them in B. coder.extrinsic('error'); Tb = numerictype(1,32,24); if ((mod(numel(A),n) == 0) && ... (n>=1 && n<=numel(A))) B = fi(zeros(1,numel(A)/n),Tb); k = 1; for i = 1 : numel(A)/n B(i) = sum(A(k + (0:n-1))); k = k + n; end else B = fi(zeros(1,0),Tb); error('n<=0 or does not divide evenly'); end
Задайте первый вход A
как fi
объект. Его первая размерность остается фиксированной в размере, и его второе измерение может вырасти до верхней границы 100. Задайте второй вход n
как двойной скаляр.
fiaccel nway ... -args {coder.typeof(fi(0,1,16,15,'SumMode','KeepLSB'),[1 100],1),0}... -report
Как альтернатива, присвойте coder.typeof
выражение к переменной MATLAB, затем передайте переменную в качестве аргумента к -args
:
vareg = coder.typeof(fi(0,1,16,15,'SumMode','KeepLSB'),[1 100],1) fiaccel nway -args {vareg, double(0)} -report