В этом примере показано, как предложить типы данных с фиксированной точкой на основе статических областей значений, используя codegen
функция. Преимущество предложения типов данных, основанных на производных областях значений, заключается в том, что вы не должны предоставлять тестовые файлы, которые упражняют ваш алгоритм в полной рабочей области значений. Выполнение таких тестовых файлов часто занимает очень много времени, поэтому вы можете сэкономить время, выведя области значений вместо этого.
Примечание
Производный анализ области значений не поддерживается для некалярных переменных.
Включите построение графиков с помощью Данных моделирования Inspector
Вывод областей значений и генерация кода с фиксированной точкой
Просмотрите сгенерированный код MATLAB с фиксированной точкой
Чтобы завершить этот пример, необходимо установить следующие продукты:
MATLAB®
Файлы MATLAB Coder™
Fixed-Point Designer™
Компилятор C
См. «Поддерживаемые компиляторы».
Можно использовать mex -setup
для изменения компилятора по умолчанию. См. Раздел «Изменение компилятора по умолчанию».
Создайте локальную рабочую папку, например 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 с фиксированной точкой. Журнал входов и выходов для сравнения графического изображения и выберите, чтобы использовать Данные моделирования Inspector для построения графика результатов.
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
Поскольку вы выбрали для регистрации входов и выходов для графиков сравнения и использования Данных моделирования Inspector для этих графиков, откроются Данные моделирования Inspector.
Можно использовать Данные моделирования Inspector, чтобы просмотреть информацию о запуске с плавающей и фиксированной точками и сравнить результаты. Для примера сравните значения с плавающей и фиксированной точками для выхода y
на вкладке Compare выберите y
, а затем нажмите Compare Runs.
В Данные моделирования Inspector отображается график запуска базовой линии с плавающей точкой относительно запуска с фиксированной точкой и различием между ними.
Чтобы просмотреть отчет генерации кода для генерации кода C, щелкните ссылку View Report, которая следует за отчетом предложения типа.
Откроется отчет генерации кода, в котором отображается сгенерированный код для dti_fixpt.c
.