exponenta event banner

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

Почему необходимо указать входные свойства

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

Свойства для указания

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

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

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

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

Прочие вводы

  

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

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

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

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

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

Имя классаОписание
logicalЛогический массив значений true и false
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)

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

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

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

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

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

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

Параметр командной строки - args

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

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

Правила использования параметра -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 поддерживает ограниченные и неограниченные данные переменного размера для генерации кода. Ограниченные данные переменного размера имеют фиксированные верхние границы. Эти данные могут распределяться статически в стеке или динамически в куче. Неограниченные данные переменного размера не имеют фиксированных верхних границ. Эти данные должны быть распределены в куче. Можно определить входные данные, чтобы иметь один или несколько размеров переменного размера, и указать их верхние границы, используя -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

Связанные темы