Замените пользовательскую функцию на интерполяционную таблицу

С HDL Coder™ можно сгенерировать приближения интерполяционной таблицы для функций, которые не поддерживают фиксированные точки и заменяют собственные функции. Чтобы заменить пользовательскую функцию на Интерполяционную таблицу, используйте приложение HDL Coder или функцию codegen fiaccel.

Используя приложение HDL Coder

Этот пример показывает, как заменить пользовательскую функцию на Интерполяционную таблицу с помощью приложения HDL Coder.

Создайте алгоритм и тестовые файлы

В локальной, перезаписываемой папке:

  1. Создайте функцию MATLAB®, custom_fcn, который является функцией, которую вы хотите заменить.

    function y = custom_fcn(x)
      y = 1./(1+exp(-x));
    end
  2. Создайте функцию обертки, которая вызывает custom_fcn.

    function y = call_custom_fcn(x)
      y = custom_fcn(x);
    end
  3. Создайте тестовый файл, 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

  1. Перейдите к папке работы, которая содержит файл для этого примера.

  2. Чтобы открыть приложение HDL Coder, в подсказке команды MATLAB, вводят hdlcoder. Установите Name на custom_project.prj и нажмите OK. Проект открывается в рабочем пространстве MATLAB.

  3. В окне проекта, на вкладке MATLAB Function, щелкают по ссылке Add MATLAB function. Просмотрите к файлу call_custom_fcn.m, и затем нажмите OK, чтобы добавить файл в проект.

Входные Define типы

  1. К входным define типам для call_custom_fcn.m, на вкладке MATLAB Function, нажимают типы Autodefine.

  2. Добавьте custom_test как тестовый файл, и затем нажмите Run.

    От тестового файла HDL Coder решает, что x является скаляром дважды.

  3. Нажмите Use These Types.

Замените custom_fcn на Интерполяционную таблицу

  1. Чтобы открыть HDL Workflow Advisor, нажмите Workflow Advisor, и в окне Workflow Advisor, нажмите Fixed-Point Conversion.

  2. Чтобы заменить custom_fcn на Интерполяционную таблицу, на вкладке Function Replacements, вводят custom_fcn, выбирают Lookup Table, и затем щелкают +.

    По умолчанию интерполяционная таблица использует линейную интерполяцию, 1 000 точек и проекта минимальные и максимальные значения, которые приложение обнаруживает путем выполнения симуляции или вычисления выведенных областей значений.

  3. Под Run Simulation выберите Log data for histogram, и затем нажмите Run Simulation. Проверьте, что файл custom_test выбран как тестовый файл.

    Симуляция запускается и минимум симуляции отображений инструмента и максимальные области значений на вкладке Variables. HDL Coder строит результаты симуляции в редакторе MATLAB.

Подтвердите фиксированные точки

  1. В столбце Proposed Type проверьте, что фиксированные точки, предложенные программным обеспечением, покрывают полную область значений симуляции. Чтобы просмотреть регистрируемые данные о гистограмме для переменной, кликните по ее полю Proposed Type.

    Гистограмма предоставляет информацию об области значений и процент области значений симуляции, которую покрывает предложенный тип данных.

  2. Чтобы подтвердить сборку при помощи предложенных типов, нажмите Validate Types.

    Программное обеспечение подтверждает предложенные типы и генерирует фиксированную точку, call_custom_fcn_fixpt.

  3. Чтобы просмотреть сгенерированную фиксированную точку, щелкните по ссылке 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, 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. Если поведение сгенерированной фиксированной точки не совпадает с поведением оригинального кода достаточно тесно, изменяет метод интерполяции или число точек, используемое в интерполяционной таблице, и затем регенерирует код.

Смотрите также

Связанные примеры

Больше о