exponenta event banner

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

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

Использование приложения кодера HDL

В этом примере показано, как заменить пользовательскую функцию таблицей подстановки с помощью приложения Кодер HDL.

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

В локальной папке с возможностью записи:

  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

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

  2. Чтобы открыть приложение Кодер HDL, в командной строке MATLAB введите hdlcoder. Задать для имени значение custom_project.prj и нажмите ОК. Проект откроется в рабочей области MATLAB.

  3. В окне проекта на вкладке Функция MATLAB щелкните ссылку Добавить функцию MATLAB. Перейдите к файлу call_custom_fcn.mи нажмите кнопку «ОК», чтобы добавить файл в проект.

Определение типов ввода

  1. Определение типов ввода для call_custom_fcn.m, на вкладке Функция MATLAB (MATLAB Function) щелкните Автоопределение типов (Autodefine types).

  2. Добавить custom_test в виде тестового файла и нажмите кнопку Выполнить.

    Из тестового файла кодер HDL определяет, что x является скалярным двойником.

  3. Щелкните Использовать эти типы (Use These Types).

Заменить custom_fcn на таблицу подстановки

  1. Чтобы открыть помощник по рабочим процессам HDL, щелкните Помощник по рабочим процессам (Workflow Advisor) и в окне Помощник по рабочим процессам (Workflow Advisor) щелкните Преобразование фиксированных точек (Fixed-Point Conversion).

  2. Заменять custom_fcn с таблицей подстановки на вкладке «Замены функций» введите custom_fcn, выберите Lookup Tableи нажмите +.

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

  3. В разделе «Моделирование выполнения» выберите Log data for histogramи нажмите кнопку «Запустить моделирование». Убедитесь, что custom_test выбран в качестве тестового файла.

    Выполняется моделирование, и инструмент отображает минимальный и максимальный диапазоны моделирования на вкладке Переменные (Variables). Кодер HDL строит график результатов моделирования в редакторе MATLAB.

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

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

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

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

См. также

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

Подробнее