Этот пример показывает, как предложить типы данных с фиксированной точкой на основе статических областей значений с помощью функции codegen
. Преимущество предложения типов данных на основе выведенных областей значений состоит в том, что вы не должны обеспечивать тестовые файлы, которые осуществляют ваш алгоритм в его полном рабочем диапазоне. Выполнение таких тестовых файлов часто занимает очень долгое время, таким образом, можно сэкономить время путем получения областей значений вместо этого.
Выведенный анализ области значений не поддержан для нескалярных переменных.
Выведите области значений и сгенерируйте фиксированную точку
Сравните выполнения и фиксированной точки с плавающей точкой
Чтобы завершить этот пример, необходимо установить следующие продукты:
MATLAB®
MATLAB Coder™
Fixed-Point Designer™
Компилятор C
См. поддерживаемые компиляторы.
Можно использовать mex -setup
, чтобы изменить компилятор по умолчанию. См. Компилятор Значения по умолчанию Изменения (MATLAB).
Создайте локальную рабочую папку, например, c:\dti
.
Изменитесь на папку docroot\toolbox\fixpoint\examples
. В командной строке MATLAB, введите:
cd(fullfile(docroot, 'toolbox', 'fixpoint', 'examples'))
Скопируйте dti.m
и файлы dti_test.m
к вашей локальной рабочей папке.
Ввод | Имя | Описание |
---|---|---|
Функциональный код | dti.m | Функция MATLAB точки входа |
Тестовый файл | dti_test.m | Скрипт MATLAB, который тестирует dti.m |
Создайте настройку фиксированной точки, возражают и конфигурируют имя тестового файла.
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. Включите отчет генерации кода.
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
.
Отчет открывается в веб-браузере.
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
, и затем нажимают Compare Runs.
Инспектор Данных моделирования отображает график базового выполнения с плавающей точкой против запущенной фиксированной точки и различие между ними.
Чтобы просмотреть отчет генерации кода для генерации кода C, щелкните по ссылке View Report, которая следует отчету предложения по типу.
Отчет генерации кода открывает и отображает сгенерированный код для dti_fixpt.c
.