По умолчанию процесс преобразования фиксированной точки генерирует файлы в папке под названием 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 | Файл, который преобразовывает значения данных с плавающей точкой, предоставленные тестовым файлом фиксированным точкам, определенным для входных параметров во время шага преобразования. Эти значения фиксированной точки поданы в конвертированную функцию фиксированной точки, |
fi
- бросает, чтобы улучшить удобочитаемость кодаПроцесс преобразования пытается сократить количество fi
- бросает путем анализа кода с плавающей точкой. Если арифметическая операция состоит только из констант времени компиляции, процесс преобразования не бросает операнды к фиксированной точке индивидуально. Вместо этого это бросает целое выражение к фиксированной точке.
Например, вот фиксированная точка, сгенерированная для константного выражения x = 1/sqrt(2)
, когда выбранный размер слова равняется 14.
Оригинальный код MATLAB | Сгенерированная фиксированная точка |
---|---|
x = 1/sqrt(2); | x = fi(1/sqrt(2), 0, 14, 14, fm);
|
Процесс преобразования избегает переполнения:
Используя арифметику полной точности, если вы не задаете в противном случае.
Предотвращение арифметических операций, которые включают дважды и типы данных 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
не является постоянным, процесс преобразования устанавливает 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