exponenta event banner

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

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

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