В этом примере показано, как предлагать типы данных с фиксированной точкой на основе статических диапазонов с помощью fiaccel функция. Преимущество предложения типов данных, основанных на производных диапазонах, состоит в том, что нет необходимости предоставлять тестовые файлы, выполняющие алгоритм в полном рабочем диапазоне. Выполнение таких тестовых файлов часто занимает очень много времени, чтобы можно было сэкономить время, выведя вместо этого диапазоны.
Примечание
Анализ производного диапазона не поддерживается для несалярных переменных.
Для завершения этого примера необходимо установить следующие продукты:
MATLAB ®
Designer™ с фиксированной точкой
Компилятор C
См. раздел Поддерживаемые компиляторы.
Вы можете использовать mex -setup для изменения компилятора по умолчанию. См. раздел Изменение компилятора по умолчанию.
Создайте локальную рабочую папку, например: c:\dti.
Изменение на docroot\toolbox\fixpoint\examples папка. В командной строке MATLAB введите:
cd(fullfile(docroot, 'toolbox', 'fixpoint', 'examples'))
Копировать dti.m и dti_test.m в локальную рабочую папку.
Рекомендуется создать отдельный сценарий тестирования для выполнения всех предварительных и последующих операций, таких как загрузка входных данных, настройка входных значений, вызов тестируемой функции и вывод результатов тестирования.
| Напечатать | Имя | Описание |
|---|---|---|
| Код функции | dti.m | Начальная функция MATLAB |
| Тестовый файл | dti_test.m | Сценарий MATLAB, который тестирует dti.m |
Создайте объект конфигурации с фиксированной точкой и настройте имя тестового файла.
fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'dti_test';
Укажите сведения о диапазоне проектирования для dti параметр ввода функции u_in.
fixptcfg.addDesignRangeSpecification('dti', 'u_in', -1.0, 1.0)
Выберите для запуска тестового файла для проверки сгенерированного кода MATLAB с фиксированной точкой. Запишите входные и выходные данные для печати сравнения и выберите использование инспектора данных моделирования для печати результатов.
fixptcfg.TestNumerics = true; fixptcfg.LogIOForComparisonPlotting = true; fixptcfg.PlotWithSimulationDataInspector = true;
Используйте fiaccel функция для преобразования функции MATLAB с плавающей запятой, dti, к коду MATLAB с фиксированной точкой. Задайте длину слова по умолчанию для типов данных с фиксированной точкой 16.
fixptcfg.ComputeDerivedRanges = true; fixptcfg.ComputeSimulationRanges = false; fixptcfg.DefaultWordLength = 16; % Derive ranges and generate fixed-point code fiaccel -float2fixed fixptcfg dti
fiaccel анализирует код с плавающей запятой. Поскольку вы не указали типы ввода для dti функция, процесс преобразования определяет типы путем моделирования тестового файла. Затем процесс преобразования выводит диапазоны для переменных в алгоритме. Эти производные диапазоны используются для предложения типов с фиксированной точкой для этих переменных. После завершения преобразования создается отчет по предложениям типа.
Щелкните ссылку на отчет по предложениям типа для dti функция, dti_report.html.
Отчет открывается в веб-браузере.

fiaccel генерирует версию с фиксированной точкой dti функция, dti_fxpt.mи функция-оболочка, вызывающая dti_fxpt. Эти файлы генерируются в codegen\dti\fixpt в локальной рабочей папке.
function [y, clip_status] = dti_fixpt(u_in) %#codegen
% Discrete Time Integrator in MATLAB
%
% Forward Euler method, also known as Forward Rectangular, or left-hand
% approximation. The resulting expression for the output of the block at
% step 'n' is y(n) = y(n-1) + K * u(n-1)
%
fm = get_fimath();
init_val = fi(1, 0, 1, 0, fm);
gain_val = fi(1, 0, 1, 0, fm);
limit_upper = fi(500, 0, 9, 0, fm);
limit_lower = fi(-500, 1, 10, 0, fm);
% variable to hold state between consecutive calls to this block
persistent u_state;
if isempty(u_state)
u_state = fi(init_val+fi(1, 0, 1, 0, fm), 1, 16, 6, fm);
end
% Compute Output
if (u_state > limit_upper)
y = fi(limit_upper, 1, 16, 6, fm);
clip_status = fi(-2, 1, 16, 13, fm);
elseif (u_state >= limit_upper)
y = fi(limit_upper, 1, 16, 6, fm);
clip_status = fi(-1, 1, 16, 13, fm);
elseif (u_state < limit_lower)
y = fi(limit_lower, 1, 16, 6, fm);
clip_status = fi(2, 1, 16, 13, fm);
elseif (u_state <= limit_lower)
y = fi(limit_lower, 1, 16, 6, fm);
clip_status = fi(1, 1, 16, 13, fm);
else
y = fi(u_state, 1, 16, 6, fm);
clip_status = fi(0, 1, 16, 13, fm);
end
% Update State
tprod = fi(gain_val * u_in, 1, 16, 14, fm);
u_state(:) = y + tprod;
end
function fm = get_fimath()
fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128);
end
Поскольку было выбрано регистрировать входные и выходные данные для сравнительных графиков и использовать инспектор расчетных данных для этих графиков, откроется инспектор расчетных данных.
Инспектор данных моделирования можно использовать для просмотра информации о выполнении с плавающей и фиксированной точками и сравнения результатов. Например, для сравнения значений с плавающей и фиксированной точками для вывода y, на вкладке Сравнить (Compare) выберите yи нажмите кнопку Сравнить прогоны.
Инспектор данных моделирования отображает график прогона базовой линии с плавающей точкой относительно прогона с фиксированной точкой и разницу между ними.
