В этом примере показано, как предложить типы данных с фиксированной точкой на основе данных области значений симуляции с помощью codegen
функция.
Сбор областей значений симуляции и генерация кода с фиксированной точкой
Просмотрите сгенерированный код MATLAB с фиксированной точкой
Чтобы завершить этот пример, необходимо установить следующие продукты:
MATLAB®
MATLAB Coder™
Fixed-Point Designer™
Компилятор C
См. «Поддерживаемые компиляторы».
Можно использовать mex -setup
для изменения компилятора по умолчанию. См. Раздел «Изменение компилятора по умолчанию».
Создайте локальную рабочую папку, например c:\ex_2ndOrder_filter
.
Измените на docroot\toolbox\fixpoint\examples
папка. В командной строке MATLAB введите:
cd(fullfile(docroot, 'toolbox', 'fixpoint', 'examples'))
Скопируйте ex_2ndOrder_filter.m
и ex_2ndOrder_filter_test.m
файлы в локальную рабочую папку.
Напечатать | Имя | Описание |
---|---|---|
Код функции | ex_2ndOrder_filter.m | Функция MATLAB точки входа |
Тестовый файл | ex_2ndOrder_filter_test.m | Скрипт MATLAB, который тестирует ex_2ndOrder_filter.m |
Скрипт ex_2ndOrder_filter_test
Создайте объект строения с фиксированной точкой и сконфигурируйте имя тестового файла.
fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'ex_2ndOrder_filter_test';
Создайте объект строения кода для генерации статической библиотеки на C. Включите отчет генерации кода.
cfg = coder.config('lib');
cfg.GenerateReport = true;
Используйте codegen
функция для преобразования функции MATLAB с плавающей точкой, ex_2ndOrder_filter
, в код С с фиксированной точкой. Установите размер слова по умолчанию для типов данных с фиксированной точкой равной 16.
fixptcfg.ComputeSimulationRanges = true; fixptcfg.DefaultWordLength = 16; % Derive ranges and generate fixed-point code codegen -float2fixed fixptcfg -config cfg ex_2ndOrder_filter
codegen
анализирует код с плавающей точкой. Поскольку вы не указали типы входа для ex_2ndOrder_filter
функция, процесс преобразования выводит типы путем симуляции тестового файла. Затем процесс преобразования выводит области значений для переменных в алгоритме. Он использует эти производные области значений, чтобы предложить фиксированные точки для этих переменных. После завершения преобразования создается отчет по предложению типа.
Щелкните ссылку на отчет о предложении типа для ex_2ndOrder_filter
функция, ex_2ndOrder_filter_report.html
.
Отчет откроется в веб-браузере.
codegen
генерирует версию ex_2ndOrder_filter.m
с фиксированной точкой функция,
ex_2ndOrder_filter_fixpt.m
и функцию обертки, которая вызывает ex_2ndOrder_filter_fixpt
. Эти файлы сгенерированы в codegen\ex_2ndOrder_filter\fixpt
папка в локальной рабочей папке.
function y = ex_2ndOrder_filter_fixpt(x) %#codegen fm = get_fimath(); persistent z if isempty(z) z = fi(zeros(2,1), 1, 16, 15, fm); end % [b,a] = butter(2, 0.25) b = fi([0.0976310729378175, 0.195262145875635, 0.0976310729378175], 0, 16, 18, fm); a = fi([ 1, -0.942809041582063, 0.3333333333333333], 1, 16, 14, fm); y = fi(zeros(size(x)), 1, 16, 14, fm); for i=1:length(x) y(i) = b(1)*x(i) + z(1); z(1) = fi_signed(b(2)*x(i) + z(2)) - a(2) * y(i); z(2) = fi_signed(b(3)*x(i)) - a(3) * y(i); end end function y = fi_signed(a) coder.inline( 'always' ); if isfi( a ) && ~(issigned( a )) nt = numerictype( a ); new_nt = numerictype( 1, nt.WordLength + 1, nt.FractionLength ); y = fi( a, new_nt, fimath( a ) ); else y = a; end end function fm = get_fimath() fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128); end
Чтобы просмотреть отчет генерации кода для генерации кода C, щелкните ссылку View Report, которая следует за отчетом предложения типа.
Откроется отчет генерации кода, в котором отображается сгенерированный код для ex_2ndOrder_filter_fixpt.c
.