Задайте свойства входных параметров функции точки входа

Почему вы должны задать входные свойства

Fixed-Point Designer™ должны определять свойства всех переменных в MATLAB® файлы во время компиляции. Чтобы вывести свойства переменных в файлах MATLAB, Fixed-Point Designer должен быть в состоянии идентифицировать свойства входов в первичную функцию, также известную как функция верхнего уровня или точки входа. Поэтому, если ваша основная функция имеет входы, необходимо задать свойства этих входов для Fixed-Point Designer. Если ваша первичная функция не имеет входных параметров, Fixed-Point Designer может скомпилировать ваш файл MATLAB без изменений. Вам не нужно задавать свойства входов в локальные функции или внешние функции, вызываемые основной функцией.

Свойства, которые нужно задать

Если ваша первичная функция имеет входы, необходимо задать следующие свойства для каждого входа.

ДляЗадайте свойства
 КлассРазмерСложностьnumerictypefimath
Входы с фиксированной точкой

Каждое поле в структуре входа

 Задайте свойства для каждого поля в соответствии с его классом

Другие входы

  

Значения свойств по умолчанию

Fixed-Point Designer присваивает следующие значения по умолчанию для свойств входных параметров первичной функции.

СвойствоДефолт
классdouble
размерscalar
сложностьreal
numerictypeПо умолчанию нет
fimathMATLAB по умолчанию fimath объект

Поддерживаемые классы

В следующей таблице представлены имена классов, поддерживаемые Fixed-Point Designer.

Имя классаОписание
logicalЛогический массив истинных и ложных значений
charСимвольный массив
int88-битный целочисленный массив со знаком
uint88-битный массив беззнаковых целых чисел
int1616-битный целочисленный массив со знаком
uint1616-битный массив беззнаковых целых чисел
int3232-битный целочисленный массив со знаком
uint3232-битный массив беззнаковых целых чисел
int6464-битный целочисленный массив со знаком
uint6464-разрядный массив беззнаковых целых чисел
singleМассив с одной точностью с плавающей точкой или с фиксированной точкой
doubleМассив чисел с двойной точностью с плавающей точкой или с фиксированной точкой
structМассив структур
embedded.fiМассив номеров с фиксированной точкой

Правила определения свойств Первичных входных параметров

При определении свойств первичных входных параметров следуйте следующим правилам:

  • Порядок элементов массива ячеек должен соответствовать порядку, в котором входы появляются в сигнатуре основной функции. Для примера первый элемент массива ячеек определяет свойства первого первичного входного параметра функции.

  • Чтобы сгенерировать меньше аргументов, чем те, которые происходят в функции MATLAB, задайте свойства только для количества аргументов, которые вы хотите в сгенерированной функции.

  • Если функция MATLAB имеет входные параметры, чтобы сгенерировать функцию, которая не имеет входных параметров, передайте пустой массив ячеек в -args.

  • Для каждого первичного входного параметра функции, чей класс является фиксированной точкой (fi), задайте вход numerictype и fimath свойства.

  • Для каждого первичного входного параметра функции, чей класс structзадайте свойства каждого из его полей в том порядке, в котором они появляются в определении структуры.

Методы определения свойств Первичных входных параметров

МетодПреимуществаНедостатки
 
  • Если вы работаете в проекте, легко использовать

  • Не изменяет оригинальный код MATLAB

  • сохраняет определения в файле проекта

  • Не эффективен для определения интенсивных входов памяти, таких как большие структуры и массивы

Задайте входные свойства по примеру в командной строке

Примечание

Если вы программно задаете входные свойства в файле MATLAB, вы не можете использовать этот метод

  • Легкий в использовании

  • Не изменяет оригинальный код MATLAB

  • Предназначен для прототипирования функции, которая имеет несколько первичных входных параметров

  • Необходимо задавать в командной строке каждый раз, когда вы вызываете fiaccel(если вы не используете скрипт)

  • Не эффективен для определения интенсивных входов памяти, таких как большие структуры и массивы

Задайте входные свойства программно в файле MATLAB (MATLAB Coder)

  • Интеграция с кодом MATLAB; не нужно переопределять свойства каждый раз, когда вы вызываете

  • Предоставляет документацию спецификаций свойств в коде MATLAB

  • Эффективен для определения интенсивных входов памяти, таких как большие структуры

  • Использует комплексный синтаксис

  • файлы проекта в данный момент не распознают свойства, заданные программно. При использовании проекта необходимо повторно ввести типы входа в проект.

Задайте входные свойства по примеру в командной строке

Опция командной строки -args

fiaccel функция обеспечивает опцию командной строки -args для определения свойств входных параметров основной (точки входа) функции как массива ячеек с примерами значений или типов. Массив ячеек может быть переменной или буквальным массивом постоянных значений. Используя эту опцию, вы задаете свойства входов одновременно с генерацией кода для функции MATLAB с fiaccel.

Можно также создать coder.Type объекты в интерактивном режиме с помощью редактора типов кодеров. См. «Создание и редактирование входных типов при помощи редактора типов кодеров (MATLAB Coder)».

Правила использования опции -args

При использовании -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 выполните следующие шаги:

  1. Определите numerictype свойства для x, как в этом примере:

    T = numerictype('WordLength',32,...
       'FractionLength',23,'Signed',true);

  2. Определите fimath свойства для x, как в этом примере:

    F = fimath('SumMode','SpecifyPrecision',...
        'SumWordLength',32,'SumFractionLength',23,...
        'ProductMode','SpecifyPrecision', ...
         ProductWordLength',32,'ProductFractionLength',23);
  3. Создайте переменную с фиксированной точкой со numerictype и fimath свойства, которые вы определили, как в этом примере:

    myeg = { fi(4.0,T,F) };

  4. Скомпилируйте функцию 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, которые являются фиксированными.

  • Если размерность неограниченный, то это всегда переменный размер.

Задание вектора переменного размера Входа

  1. Напишите функцию, которая вычисляет сумму каждого 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
    
    

  2. Задайте первый вход A как fi объект. Его первая размерность остается фиксированным в размере, а второе измерение может вырасти до верхней границы 100. Задайте второй вход n как двойной скаляр.

    fiaccel nway ...
    -args {coder.typeof(fi(0,1,16,15,'SumMode','KeepLSB'),[1 100],1),0}...
    -report
  3. В качестве альтернативы присвойте coder.typeof выражение в переменный MATLAB, затем передайте переменную в качестве аргумента в -args:

    vareg = coder.typeof(fi(0,1,16,15,'SumMode','KeepLSB'),[1 100],1)
    fiaccel nway -args {vareg, double(0)} -report

Похожие темы