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

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

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

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

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

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

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

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

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

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

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

См. также

|

Похожие темы