Этот пример показывает, как предложить типы данных фиксированной точки на основе данных области значений моделирования с помощью функции codegen.
Чтобы завершить этот пример, необходимо установить следующие продукты:
MATLAB®
MATLAB Coder™
Фиксированная точка Designer™
Компилятор C
См. поддерживаемые компиляторы.
Можно использовать mex -setup, чтобы изменить компилятор по умолчанию. См. Компилятор Значения по умолчанию Изменения (MATLAB).
Создайте локальную рабочую папку, например, 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, щелкните по ссылке Отчета Представления, которая следует отчету предложения по типу.

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