С помощью HDL- Coder™ можно сгенерировать приближения интерполяционной таблицы для функций, которые не поддерживают фиксированные точки, и заменить собственные функции. Чтобы заменить пользовательскую функцию Интерполяционной таблицей, используйте приложение HDL Coder или fiaccel
codegen
функция.
В этом примере показано, как заменить пользовательскую функцию на Интерполяционную таблицу с помощью приложения 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, чтобы добавить файл к проекту.
Определите входные типы
Чтобы определить входные типы для 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
, а затем нажмите +.
По умолчанию интерполяционная таблица использует линейную интерполяцию, 1000 точек, и проектирует минимальные и максимальные значения, которые обнаруживает приложение, выполняя симуляцию или вычисляя производные области значений.
В группе 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, 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. Если поведение сгенерированного кода с фиксированной точкой недостаточно тесно совпадает с поведением оригинального кода, измените метод интерполяции или число точек, используемых в интерполяционной таблице, и затем перегенерируйте код.