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

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

От пользовательского интерфейса

Этот пример показывает, как заменить пользовательскую функцию на Интерполяционную таблицу с помощью приложения 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

Из командной строки

Этот пример показывает, как заменить функцию exp на приближение интерполяционной таблицы в сгенерированной фиксированной точке с помощью функции.

Предпосылки

Чтобы завершить этот пример, необходимо установить следующие продукты:

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

  1. Создайте функцию MATLAB, my_fcn.m, который вызывает функцию exp.

    function y = my_fcn(x)
      y = exp(x);
    end
    
  2. Создайте тестовый файл, my_fcn_test.m, который использует my_fcn.m.

    close all
    
    x = linspace(-10,10,1e3);
    for itr = 1e3:-1:1
       y(itr) = my_fcn( x(itr) );
    end
    plot( x, y );
    

Сконфигурируйте приближение

Создайте функциональный заменяющий объект настройки аппроксимировать функцию exp, с помощью настроек по умолчанию линейной интерполяции и 1 000 точек в интерполяционной таблице.

q = coder.approximation('exp');

Настройте объект настройки

Создайте объект coder.FixptConfig, fixptcfg. Укажите, что тестовый файл называет и включает тестирование численных данных. Сопоставьте функциональный заменяющий объект настройки с объектом настройки фиксированной точки.

fixptcfg = coder.config('fixpt');
fixptcfg.TestBenchName = 'my_fcn_test';
fixptcfg.TestNumerics = true;
fixptcfg.DefaultWordLength = 16;
fixptcfg.addApproximation(q);

Преобразуйте в фиксированную точку

Сгенерируйте фиксированную точку код MATLAB.

codegen -float2fixed fixptcfg my_fcn

Просмотрите сгенерированную фиксированную точку

Чтобы просмотреть сгенерированную фиксированную точку, щелкните по ссылке к my_fcn_fixpt.

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

Сгенерированная функция фиксированной точки, my_fcn_fixpt, вызывает это приближение вместо того, чтобы вызвать exp.

function y = my_fcn_fixpt(x)
  fm = get_fimath();

  y = fi(replacement_exp(x), 0, 16, 1, fm);
end

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

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

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

Больше о