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.
| Имя класса | Описание |
|---|---|
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 как аргумент к -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