exponenta event banner

Предложение типов данных с фиксированной точкой на основе диапазонов моделирования

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

Предпосылки

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

Создание новой папки и копирование соответствующих файлов

  1. Создайте локальную рабочую папку, например: c:\ex_2ndOrder_filter.

  2. Изменение на docroot\toolbox\fixpoint\examples папка. В командной строке MATLAB введите:

    cd(fullfile(docroot, 'toolbox', 'fixpoint', 'examples')) 

  3. Копировать ex_2ndOrder_filter.m и ex_2ndOrder_filter_test.m в локальную рабочую папку.

    НапечататьИмяОписание
    Код функцииex_2ndOrder_filter.mНачальная функция MATLAB
    Тестовый файлex_2ndOrder_filter_test.mСценарий MATLAB, который тестирует ex_2ndOrder_filter.m

 Функция ex_2ndOrder_filter

 Сценарий ex_2ndOrder_filter_test

Настройка объекта конфигурации с фиксированной точкой

Создайте объект конфигурации с фиксированной точкой и настройте имя тестового файла.

fixptcfg = coder.config('fixpt');
fixptcfg.TestBenchName = 'ex_2ndOrder_filter_test';

Настройка объекта конфигурации генерации кода C

Создайте объект конфигурации кода для создания статической библиотеки C. Включите отчет о создании кода.

cfg = coder.config('lib');
cfg.GenerateReport = true;

Сбор диапазонов моделирования и создание кода фиксированной точки

Используйте codegen функция для преобразования функции MATLAB с плавающей запятой, ex_2ndOrder_filter, к коду C с фиксированной точкой. Задайте длину слова по умолчанию для типов данных с фиксированной точкой 16.

fixptcfg.ComputeSimulationRanges = true;
fixptcfg.DefaultWordLength = 16;

% Derive ranges  and generate fixed-point code
codegen -float2fixed fixptcfg -config cfg ex_2ndOrder_filter

codegen анализирует код с плавающей запятой. Поскольку вы не указали типы ввода для ex_2ndOrder_filter функция, процесс преобразования определяет типы путем моделирования тестового файла. Затем процесс преобразования выводит диапазоны для переменных в алгоритме. Эти производные диапазоны используются для предложения типов с фиксированной точкой для этих переменных. После завершения преобразования создается отчет по предложениям типа.

Просмотр информации о диапазоне

Щелкните ссылку на отчет по предложениям типа для ex_2ndOrder_filter функция, ex_2ndOrder_filter_report.html.

Отчет открывается в веб-браузере.

Просмотр сгенерированного кода MATLAB с фиксированной точкой

codegen генерирует версию с фиксированной точкой ex_2ndOrder_filter.m функция, ex_2ndOrder_filter_fixpt.mи функция-оболочка, вызывающая ex_2ndOrder_filter_fixpt. Эти файлы генерируются в codegen\ex_2ndOrder_filter\fixpt в локальной рабочей папке.

function y = ex_2ndOrder_filter_fixpt(x) %#codegen
  fm = get_fimath();

  persistent z
  if isempty(z)
      z = fi(zeros(2,1), 1, 16, 15, fm);
  end
  % [b,a] = butter(2, 0.25)
  b = fi([0.0976310729378175,  0.195262145875635,  0.0976310729378175], 0, 16, 18, fm);
  a = fi([                 1, -0.942809041582063,  0.3333333333333333], 1, 16, 14, fm);

 
  y = fi(zeros(size(x)), 1, 16, 14, fm);
  for i=1:length(x)
      y(i) = b(1)*x(i) + z(1);
      z(1) = fi_signed(b(2)*x(i) + z(2)) - a(2) * y(i);
      z(2) = fi_signed(b(3)*x(i))        - a(3) * y(i);
  end
end



function y = fi_signed(a)
    coder.inline( 'always' );
    if isfi( a ) && ~(issigned( a ))
        nt = numerictype( a );
        new_nt = numerictype( 1, nt.WordLength + 1, nt.FractionLength );
        y = fi( a, new_nt, fimath( a ) );
    else
        y = a;
    end
end

function fm = get_fimath()
	fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode', 'FullPrecision', 'MaxSumWordLength', 128);
end

Просмотр сгенерированного кода с фиксированной точкой C

Чтобы просмотреть отчет о создании кода для создания кода C, щелкните ссылку Просмотр отчета, которая следует за отчетом о предложении типа.

Открывается отчет о создании кода, в котором отображается созданный код для ex_2ndOrder_filter_fixpt.c.

См. также

|

Связанные темы