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