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

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

Использование приложения 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, чтобы добавить файл к проекту.

Определите входные типы

  1. Чтобы определить входные типы для 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, а затем нажмите +.

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

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

См. также

Похожие примеры

Подробнее о