Designer™ Fixed-Point должны определять свойства всех переменных в файлах MATLAB ® во время компиляции. Чтобы определить переменные свойства в файлах MATLAB, Fixed-Point Designer должен уметь определять свойства входов в основную функцию, также известную как функция верхнего уровня или начальной точки. Поэтому, если основная функция имеет входные данные, необходимо указать свойства этих входных данных в Fixed-Point Designer. Если у основной функции нет входных параметров, Fixed-Point Designer может компилировать файл MATLAB без изменений. Нет необходимости задавать свойства входов для локальных функций или внешних функций, вызываемых основной функцией.
Если основная функция имеет входы, необходимо указать следующие свойства для каждого входа.
| Для | Укажите свойства | ||||
|---|---|---|---|---|---|
| Класс | Размер | Сложность | numerictype | fimath | |
| Вводы с фиксированной точкой |
|
|
|
|
|
| Каждое поле в структурном вводе |
| ||||
| Прочие вводы |
|
|
| ||
Конструктор фиксированных точек назначает следующие значения по умолчанию для свойств входов первичных функций.
| Собственность | Дефолт |
|---|---|
| класс | double |
| размер | scalar |
| сложность | real |
numerictype | По умолчанию нет |
fimath | MATLAB по умолчанию fimath объект |
В следующей таблице представлены имена классов, поддерживаемые Fixed-Point Designer.
| Имя класса | Описание |
|---|---|
logical | Логический массив значений true и false |
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) |
|
|
fiaccel функция предоставляет параметр командной строки -args для задания свойств входных данных первичных (точек входа) функций в виде массива ячеек с примерами значений или типов. Массив ячеек может быть переменным или литеральным массивом констант. С помощью этой опции можно задать свойства входных данных одновременно с созданием кода для функции MATLAB с помощью fiaccel.
Можно также создать coder.Type объектов в интерактивном режиме с помощью редактора типов кодеров. См. раздел Создание и редактирование типов ввода с помощью редактора типов кодеров (кодер MATLAB).
При использовании -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 поддерживает ограниченные и неограниченные данные переменного размера для генерации кода. Ограниченные данные переменного размера имеют фиксированные верхние границы. Эти данные могут распределяться статически в стеке или динамически в куче. Неограниченные данные переменного размера не имеют фиксированных верхних границ. Эти данные должны быть распределены в куче. Можно определить входные данные, чтобы иметь один или несколько размеров переменного размера, и указать их верхние границы, используя -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