Сгенерированная фиксированная точка

Местоположение сгенерированных файлов фиксированной точки

По умолчанию процесс преобразования фиксированной точки генерирует файлы в папке под названием codegen/fcn_name/fixpt в вашей локальной рабочей папке. fcn_name является именем функции MATLAB®, которую вы преобразовываете в фиксированную точку.

FileName Описание
fcn_name_fixpt.m

Сгенерированная фиксированная точка код MATLAB.

Чтобы интегрировать эту фиксированную точку в объемное приложение, рассмотрите генерацию MEX-функции для функции и вызова этой MEX-функции вместо оригинального кода MATLAB.

fcn_name_fixpt_exVal.mat

MAT-файл, содержащий:

  • Структура для входных параметров.

  • Имя файла фиксированной точки.

fcn_name_fixpt_report.html

Соединитесь с предложением по типу, сообщают, что отображает сгенерированную фиксированную точку и предложенную информацию о типе.

fcn_name_report.html

Соединитесь с предложением по типу, сообщают, что отображает оригинальный код MATLAB и предложенную информацию о типе.

fcn_name_wrapper_fixpt.m

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

Минимизация fi - бросает, чтобы улучшить удобочитаемость кода

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

Например, вот фиксированная точка, сгенерированная для константного выражения x = 1/sqrt(2), когда выбранный размер слова равняется 14.

Оригинальный код MATLABСгенерированная фиксированная точка

x = 1/sqrt(2);

x = fi(1/sqrt(2), 0, 14, 14, fm);

fm является локальный fimath.

Предотвращение переполнения в сгенерированной фиксированной точке

Процесс преобразования избегает переполнения:

  • Используя арифметику полной точности, если вы не задаете в противном случае.

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

  • Предотвращение переполнения при добавлении и вычитании не переменных фиксированной точки и переменных фиксированной точки.

    Процесс преобразования фиксированной точки бросает non-fi выражения к соответствующему типу fi.

    Например, рассмотрите следующий алгоритм MATLAB.

    % A = 5;
    % B = ones(300, 1)
    function y = fi_plus_non_fi(A, B)
      % '1024' is non-fi, cast it
      y = A + 1024;
      % 'size(B, 1)*length(A)' is a non-fi, cast it
      y = A + size(B, 1)*length(A);
    end

    Сгенерированная фиксированная точка:

    %#codegen
    % A = 5;
    % B = ones(300, 1)
    function y = fi_plus_non_fi_fixpt(A, B)
      % '1024' is non-fi, cast it
      fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128);
    
      y = fi(A + fi(1024, 0, 11, 0, fm), 0, 11, 0, fm);
      % 'size(B, 1)*length(A)' is a non-fi, cast it
      y(:) = A + fi(size(B, fi(1, 0, 1, 0, fm))*length(A), 0, 9, 0, fm);
    end

Управление ростом разрядности

Рост разрядности управлений процессом преобразования при помощи преобразованных в нижний индекс присвоений, то есть, присвоения, которые используют двоеточие (:) оператор, в сгенерированном коде. Когда вы используете преобразованные в нижний индекс присвоения, MATLAB перезаписывает значение левого аргумента стороны, но сохраняет существующий размер типа данных и массива. Используя преобразованное в нижний индекс присвоение сохраняет фиксированную точку переменных фиксированной точки вместо того, чтобы непреднамеренно повернуть их в, удваивается. Поддержание фиксированной точки сокращает количество описаний типа в сгенерированном коде. Преобразованное в нижний индекс присвоение также предотвращает рост разрядности, который полезен когда это необходимо, чтобы поддержать конкретный тип данных для вывода.

Предотвращение потери области значений или точности

Предотвращение потери области значений или точности в операциях вычитания без знака

Когда результат вычитания отрицателен, процесс преобразования продвигает левый операнд тип со знаком.

Например, рассмотрите следующий алгоритм MATLAB.

% A = 1;
% B = 5
function [y,z] = unsigned_subtraction(A,B)
  y = A - B;
  
  C = -20;
  z = C - B;
end

В оригинальном коде и A и B без знака, и результат A-B может быть отрицательным. В сгенерированной фиксированной точке A продвинут на со знаком. В оригинальном коде, C подписывается, не требует продвижения в сгенерированном коде.

%#codegen
% A = 1;
% B = 5
function [y,z] = unsigned_subtraction_fixpt(A,B)
 
fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128);
y = fi(fi_signed(A) - B, 1, 3, 0, fm);
C = fi(-20, 1, 6, 0, fm);
z = fi(C - B, 1, 6, 0, fm);
end
 
 
function y = fi_signed(a)
coder.inline( 'always' );
if isfi( a ) && ~(issigned( a ))
  nt = numerictype( a );
  new_nt = numerictype( 1, nt.WordLength + 1, nt.FractionLength );
  y = fi( a, new_nt, fimath( a ) );
else
  y = a;
end
end

Предотвращение потери области значений при конкатенации массивов чисел фиксированной точки

Если вы конкатенируете матрицы с помощью vertcat и horzcat, процесс преобразования использует самый большой numerictype среди выражений строки и бросает крайний левый элемент к тому типу. Этот тип затем используется для конкатенированной матрицы, чтобы избежать потери области значений.

Например, рассмотрите следующий алгоритм MATLAB.

% A = 1, B = 100, C = 1000
function [y, z] = lb_node(A, B, C)
  %% single rows
  y = [A B C];
  %% multiple rows
  z = [A 5; A B; A C];
end

В сгенерированной фиксированной точке:

  • Для выражения y = [A B C], крайний левый элемент, A, брошен к типу C, потому что C имеет самый большой тип в строке.

  • Для выражения [A 5; A B; A C]:

    • В первой строке A брошен к типу C, потому что C имеет самый большой тип целого выражения.

    • Во второй строке A брошен к типу B, потому что B имеет больший тип в строке.

    • В третьей строке A брошен к типу C, потому что C имеет больший тип в строке.

%#codegen
% A = 1, B = 100, C = 1000
function [y, z] = lb_node_fixpt(A, B, C)
  %% single rows
  fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128);

  y = fi([fi(A, 0, 10, 0, fm) B C], 0, 10, 0, fm);
  
  %% multiple rows
  z = fi([fi(A, 0, 10, 0, fm) 5; fi(A, 0, 7, 0, fm) B; fi(A, 0, 10, 0, fm) C], 0, 10, 0, fm);
end

Обработка Непостоянных mpower Экспонент

Если функция, которую вы преобразовываете, имеет скалярный вход, и вход экспоненты mpower не является постоянным, процесс преобразования устанавливает ProductMode fimath на SpecifyPrecision в сгенерированном коде. С этой установкой тип выходных данных может быть определен во время компиляции.

Например, рассмотрите следующий алгоритм MATLAB.

% a = 1
% b = 3
function y = exp_operator(a, b)
  % exponent is a constant so no need to specify precision
  y = a^3;
  % exponent is not a constant, use 'SpecifyPrecision' for 'ProductMode'
  y = b^a;
end

В сгенерированной фиксированной точке, для выражения y = a^3, экспонента является константой, таким образом, нет никакой потребности задать точность. Для выражения, y = b^a, экспонента не является постоянной, таким образом, ProductMode установлен в SpecifyPrecision.

%#codegen
% a = 1
% b = 3
function y = exp_operator_fixpt(a, b)
  % exponent is a constant so no need to specify precision
  fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128);

  y = fi(a^3, 0, 2, 0, fm);
  % exponent is not a constant, use 'SpecifyPrecision' for 'ProductMode'
  y(:) = fi(b, 'ProductMode', 'SpecifyPrecision', 'ProductWordLength', 2, 'ProductFractionLength', 0 )^a;
end