С HDL Coder™ можно сгенерировать приближения интерполяционной таблицы для функций, которые не поддерживают фиксированные точки и заменяют собственные функции. Чтобы заменить пользовательскую функцию на Интерполяционную таблицу, используйте приложение HDL Coder или функцию codegen
fiaccel
.
Этот пример показывает, как заменить пользовательскую функцию на Интерполяционную таблицу с помощью приложения HDL Coder.
Создайте алгоритм и тестовые файлы
В локальной, перезаписываемой папке:
Создайте функцию MATLAB®, custom_fcn
, который является функцией, которую вы хотите заменить.
function y = custom_fcn(x) y = 1./(1+exp(-x)); end
Создайте функцию обертки, которая вызывает custom_fcn
.
function y = call_custom_fcn(x) y = custom_fcn(x); end
Создайте тестовый файл, custom_test
, который использует call_custom_fcn
.
close all x = linspace(-10,10,1e3); for itr = 1e3:-1:1 y(itr) = call_custom_fcn( x(itr) ); end plot( x, y );
Создайте и Настроенный Проект HDL Coder
Перейдите к папке работы, которая содержит файл для этого примера.
Чтобы открыть приложение HDL Coder, в подсказке команды MATLAB, вводят hdlcoder
. Установите Name на custom_project.prj
и нажмите OK. Проект открывается в рабочем пространстве MATLAB.
В окне проекта, на вкладке MATLAB Function, щелкают по ссылке Add MATLAB function. Просмотрите к файлу call_custom_fcn.m
, и затем нажмите OK, чтобы добавить файл в проект.
Входные Define типы
К входным define типам для call_custom_fcn.m
, на вкладке MATLAB Function, нажимают типы Autodefine.
Добавьте custom_test
как тестовый файл, и затем нажмите Run.
От тестового файла HDL Coder решает, что x
является скаляром дважды.
Нажмите Use These Types.
Замените custom_fcn на Интерполяционную таблицу
Чтобы открыть HDL Workflow Advisor, нажмите Workflow Advisor, и в окне Workflow Advisor, нажмите Fixed-Point Conversion.
Чтобы заменить custom_fcn
на Интерполяционную таблицу, на вкладке Function Replacements, вводят custom_fcn
, выбирают Lookup Table
, и затем щелкают +.
По умолчанию интерполяционная таблица использует линейную интерполяцию, 1 000 точек и проекта минимальные и максимальные значения, которые приложение обнаруживает путем выполнения симуляции или вычисления выведенных областей значений.
Под Run Simulation выберите Log data for histogram
, и затем нажмите Run Simulation. Проверьте, что файл custom_test
выбран как тестовый файл.
Симуляция запускается и минимум симуляции отображений инструмента и максимальные области значений на вкладке Variables. HDL Coder строит результаты симуляции в редакторе MATLAB.
Подтвердите фиксированные точки
В столбце Proposed Type проверьте, что фиксированные точки, предложенные программным обеспечением, покрывают полную область значений симуляции. Чтобы просмотреть регистрируемые данные о гистограмме для переменной, кликните по ее полю Proposed Type.
Гистограмма предоставляет информацию об области значений и процент области значений симуляции, которую покрывает предложенный тип данных.
Чтобы подтвердить сборку при помощи предложенных типов, нажмите Validate Types.
Программное обеспечение подтверждает предложенные типы и генерирует фиксированную точку, call_custom_fcn_fixpt
.
Чтобы просмотреть сгенерированную фиксированную точку, щелкните по ссылке call_custom_fcn_fixpt
.
Сгенерированная функция фиксированной точки, call_custom_fcn_fixpt.m
, вызывает это приближение вместо того, чтобы вызвать custom_fcn
.
function y = call_custom_fcn_fixpt(x) fm = get_fimath(); y = fi(replacement_custom_fcn(x), 0, 14, 14, fm); end function fm = get_fimath() fm = fimath('RoundingMethod', 'Floor',... 'OverflowAction', 'Wrap',... 'ProductMode','FullPrecision',... 'MaxProductWordLength', 128,... 'SumMode','FullPrecision',... 'MaxSumWordLength', 128); end
Предпосылки
Чтобы завершить этот пример, необходимо установить следующие продукты:
MATLAB
Fixed-Point Designer™
Компилятор C
См. поддерживаемые компиляторы.
Можно использовать mex -setup
, чтобы изменить компилятор по умолчанию. См. Компилятор Значения по умолчанию Изменения (MATLAB).
Создайте функцию MATLAB, custom_fcn.m
. Это - функция, которую вы хотите заменить.
function y = custom_fcn(x) y = 1./(1+exp(-x)); end
Создайте функцию обертки, которая вызывает custom_fcn.m
.
function y = call_custom_fcn(x) y = custom_fcn(x); end
Создайте тестовый файл, custom_test.m
, который использует call_custom_fcn.m
.
close all x = linspace(-10,10,1e3); for itr = 1e3:-1:1 y(itr) = call_custom_fcn( x(itr) ); end plot( x, y );
Создайте функциональный заменяющий объект настройки аппроксимировать custom_fcn
. Задайте указатель на функцию пользовательской функции и установите число точек использовать в интерполяционной таблице для 50.
q = coder.approximation('Function','custom_fcn','CandidateFunction',@custom_fcn, 'NumberOfPoints',50);
Создайте объект coder.FixptConfig
, fixptcfg
. Укажите, что тестовый файл называет и включает тестирование численных данных. Сопоставьте функциональный заменяющий объект настройки с объектом настройки фиксированной точки.
fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'custom_test'; fixptcfg.TestNumerics = true; fixptcfg.addApproximation(q);
Сгенерируйте фиксированную точку код MATLAB.
codegen -float2fixed fixptcfg call_custom_fcn
codegen
генерирует фиксированную точку код MATLAB в call_custom_fcn_fixpt.m
.
Чтобы просмотреть сгенерированную фиксированную точку, щелкните по ссылке к call_custom_fcn_fixpt
.
Сгенерированный код содержит приближение интерполяционной таблицы, replacement_custom_fcn
, для функции custom_fcn
. Процесс преобразования фиксированной точки выводит области значений для функции и затем использует интерполированную интерполяционную таблицу, чтобы заменить функцию. Интерполяционная таблица использует 50 точек, как задано. По умолчанию это использует линейную интерполяцию и минимальные и максимальные значения, обнаруженные путем выполнения тестового файла.
Сгенерированная функция фиксированной точки, call_custom_fcn_fixpt
, вызывает это приближение вместо того, чтобы вызвать custom_fcn
.
function y = call_custom_fcn_fixpt(x) fm = get_fimath(); y = fi(replacement_custom_fcn(x), 0, 14, 14, fm); end
Можно теперь протестировать сгенерированную фиксированную точку и сравнить результаты с исходной функцией MATLAB. Если поведение сгенерированной фиксированной точки не совпадает с поведением оригинального кода достаточно тесно, изменяет метод интерполяции или число точек, используемое в интерполяционной таблице, и затем регенерирует код.