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

В этом примере показано, как предложить типы данных с фиксированной точкой на основе статических областей значений, используя 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)

Включите построение графиков с помощью Данных моделирования Inspector

Выберите, чтобы запустить тестовый файл, чтобы проверить сгенерированный код MATLAB с фиксированной точкой. Журнал входов и выходов для сравнения графического изображения и выберите, чтобы использовать Данные моделирования Inspector для построения графика результатов.

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

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

Поскольку вы выбрали для регистрации входов и выходов для графиков сравнения и использования Данных моделирования Inspector для этих графиков, откроются Данные моделирования Inspector.

Можно использовать Данные моделирования Inspector, чтобы просмотреть информацию о запуске с плавающей и фиксированной точками и сравнить результаты. Для примера сравните значения с плавающей и фиксированной точками для выхода yна вкладке Compare выберите y, а затем нажмите Compare Runs.

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