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.
При использовании -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