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

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

Примечание

Выведенный анализ области значений не поддерживается для нескалярных переменных.

Необходимые условия

Чтобы завершить этот пример, необходимо установить следующие продукты:

Создайте новую папку и скопируйте соответствующие файлы

  1. Создайте локальную рабочую папку, например, c:\dti.

  2. Превратитесь в docroot\toolbox\fixpoint\examples папка. В командной строке MATLAB, введите:

    cd(fullfile(docroot, 'toolbox', 'fixpoint', 'examples')) 

  3. Скопируйте dti.m и dti_test.m файлы к вашей локальной рабочей папке.

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

    ВводИмяОписание
    Функциональный кодdti.mФункция MATLAB точки входа
    Тестовый файлdti_test.mСкрипт MATLAB, который тестирует dti.m

 Функция dti

 Функция dti_test

Настройте объект настройки фиксированной точки

Создайте настройку фиксированной точки, возражают и конфигурируют имя тестового файла.

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.

Отчет открывается в веб-браузере.

Просмотрите сгенерированную фиксированную точку код MATLAB

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, и затем нажмите Compare Runs.

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