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

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

Позвольте строить график Используя моделирование Data Inspector

Выберите, чтобы запустить тестовый файл, чтобы проверить сгенерированную фиксированную точку код MATLAB. Регистрируйте вводы и выводы для графического изображения сравнения и выбора, чтобы использовать Моделирование Data Inspector, чтобы построить график результатов.

fixptcfg.TestNumerics = true;
fixptcfg.LogIOForComparisonPlotting = true;
fixptcfg.PlotWithSimulationDataInspector = true;

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

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

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

Выведите области значений и сгенерируйте фиксированную точку

Используйте функцию codegen, чтобы преобразовать функцию MATLAB с плавающей точкой, dti, к коду С фиксированной точки. Установите размер слова по умолчанию для типов данных фиксированной точки к 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

Сравните выполнения и фиксированной точки с плавающей точкой

Поскольку вы выбрали, чтобы регистрировать вводы и выводы для графиков сравнения и использовать Моделирование Data Inspector для этих графиков, Моделирование, Data Inspector открывается.

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

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

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

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

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

Смотрите также

|

Похожие темы

Была ли эта тема полезной?