В этом примере показано, как предлагать типы данных с фиксированной точкой на основе данных диапазона моделирования с помощью codegen функция.
Сбор диапазонов моделирования и создание кода фиксированной точки
Просмотр сгенерированного кода MATLAB с фиксированной точкой
Для завершения этого примера необходимо установить следующие продукты:
MATLAB ®
MATLAB Coder™
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, к коду C с фиксированной точкой. Задайте длину слова по умолчанию для типов данных с фиксированной точкой 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, щелкните ссылку Просмотр отчета, которая следует за отчетом о предложении типа.

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