exponenta event banner

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

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

Примечание

Анализ производного диапазона не поддерживается для несалярных переменных.

Предпосылки

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

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

  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;

Настройка объекта конфигурации генерации кода C

Создайте объект конфигурации кода для создания статической библиотеки C. Включите отчет о создании кода.

cfg = coder.config('lib');
cfg.GenerateReport = true;

Деривация диапазонов и генерация кода фиксированной точки

Используйте codegen функция для преобразования функции MATLAB с плавающей запятой, dti, к коду C с фиксированной точкой. Задайте длину слова по умолчанию для типов данных с фиксированной точкой 16.

fixptcfg.ComputeDerivedRanges = true;
fixptcfg.ComputeSimulationRanges = false;
fixptcfg.DefaultWordLength = 16;

% Derive ranges  and generate fixed-point code
codegen -float2fixed fixptcfg -config cfg dti

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

Просмотр информации о производном диапазоне

Щелкните ссылку на отчет по предложениям типа для dti функция, dti_report.html.

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

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

codegen генерирует версию с фиксированной точкой 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и нажмите кнопку Сравнить прогоны.

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

Просмотр сгенерированного кода с фиксированной точкой C

Чтобы просмотреть отчет о создании кода для создания кода C, щелкните ссылку Просмотр отчета, которая следует за отчетом о предложении типа.

Открывается отчет о создании кода, в котором отображается созданный код для dti_fixpt.c.

См. также

|

Связанные темы