Лучшие практики автоматического преобразования с фиксированной точкой

Создайте тестовый файл

Лучшая практика для структурирования вашего кода состоит в том, чтобы отделить ваш основной алгоритм от другого кода, который вы используете для тестирования и проверки результатов. Создайте тестовый файл, чтобы вызвать ваш исходный MATLAB® алгоритм и версии алгоритма с фиксированной точкой. Например, как показано в следующей таблице, вы можете настроить некоторые входные данные для подачи в алгоритм, а затем, после обработки этих данных, создать некоторые графики для проверки результатов. Поскольку вам нужно преобразовать только алгоритмический фрагмент в фиксированную точку, более эффективно структурировать ваш код так, чтобы у вас был тестовый файл, в котором вы создаете ваши входы, вызываете ваш алгоритм и строите график результатов, и один (или несколько) алгоритмические файлы, в которых вы делаете основную обработку.

Оригинальный кодЛучшие практикиМодифицированный код
% TEST INPUT
x = randn(100,1);

% ALGORITHM
y = zeros(size(x));
y(1) = x(1);
for n=2:length(x)
  y(n)=y(n-1) + x(n);
end

% VERIFY RESULTS
yExpected=cumsum(x);
plot(y-yExpected)
title('Error')

Проблема

Генерация тестового воздействия и верификация результатов смешиваются с кодом алгоритма.

Зафиксировать

Создайте тестовый файл, который отделен от вашего алгоритма. Поместите алгоритм в свою собственную функцию.

Тестовый файл

% TEST INPUT
x = randn(100,1);

% ALGORITHM
y = cumulative_sum(x);

% VERIFY RESULTS
yExpected = cumsum(x);
plot(y-yExpected)
title('Error')

Алгоритм в собственной функции

function y = cumulative_sum(x)
  y = zeros(size(x));
  y(1) = x(1);
  for n=2:length(x)
    y(n) = y(n-1) + x(n);
  end
end

Можно использовать тестовый файл для:

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

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

  • Сравните поведение версий алгоритма с фиксированной точкой с базовой линией с плавающей точкой.

  • Помогают вам определить начальные значения для статических областей значений.

По умолчанию MATLAB Coder™ приложение показывает результаты покрытия кода. Ваши тестовые файлы должны использовать алгоритм в полной рабочей области значений, чтобы области значений симуляции были точными. Для примера, для фильтра, реалистичными входами являются импульсы, суммы синусоидов и щебетание сигналов. С помощью этих входов, используя линейную теорию, можно проверить, что выходы верны. Сигналы, которые дают максимальный выход, полезны для проверки того, что ваша система не переполнена. Качество предлагаемых типов данных с фиксированной точкой зависит от того, насколько хорошо тестовые файлы покрывают рабочую область значений алгоритма с точностью, которую вы хотите. Просмотр результатов покрытия кода помогает вам проверить, что ваш тестовый файл надлежащим образом реализует алгоритм. Проверьте код, помеченный красной строкой покрытия кода, поскольку этот код не выполняется. Если покрытие кода недостаточно, измените тестовый файл или добавьте дополнительные тестовые файлы, чтобы увеличить охват. См. «Покрытие кода».

Подготовьте алгоритм для ускорения кода или генерации кода

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

Алгоритмы MATLAB, которые вы хотите автоматически преобразовать в фиксированную точку, должны соответствовать требованиям и правилам генерации кода. Для просмотра подмножества языка MATLAB, поддерживаемого для генерации кода, смотрите Функции и Объекты, Поддерживаемые для генерации кода C/C + +.

Чтобы помочь вам идентифицировать неподдерживаемые функции или конструкции в коде MATLAB, добавьте %#codegen прагма в верхнюю часть файла MATLAB. КОД MATLAB Analyzer помечает функции и конструкции, которые недоступны в подмножестве языка MATLAB, поддерживаемого для генерации кода. Этот совет появляется в режиме реального времени при редактировании кода в редакторе MATLAB. Для получения дополнительной информации смотрите Проверка Кода with the Анализатор Кода. Программное обеспечение предоставляет ссылку на отчет, идентифицирующий вызовы функций и использование типов данных, которые не поддерживаются для генерации кода. Для получения дополнительной информации см. раздел «Проверка кода при помощи Инструмента Генерации кода готовности».

Проверяйте на поддержку функций с фиксированной точкой, используемых в вашем алгоритме

Приложение помечает неподдерживаемые вызовы функций, найденные в вашем алгоритме на вкладке Function Replacements. Для примера, если вы используете fft функция, которая не поддерживается для фиксированной точки, инструмент добавляет запись в таблицу на этой вкладке и указывает, что вам нужно задать функцию замены, которая будет использоваться для операций с фиксированной точкой.

Можно задать дополнительные функции замены. Для примера такие функции, как sin, cos, иsqrt может поддерживать фиксированную точку, но для большей эффективности, можно хотеть рассмотреть альтернативную реализацию, такую как интерполяционная таблица или основанный на CORDIC алгоритм. Приложение предоставляет опцию для генерации аппроксимаций интерполяционной таблицы для непрерывного и безгосударственного одинарного входа, единственных выходных функций в вашем оригинальном коде MATLAB. Смотрите Замену Функции с использованием Интерполяционной таблицы Приближений.

Управление типами данных и управление ростом разрядности

Автоматический процесс преобразования с фиксированной точкой автоматически управляет типами данных и управляет ростом разрядности. Он управляет ростом разрядности с помощью подписанных назначений, то есть назначений, которые используют оператор двоеточия (:), в сгенерированном коде. При использовании подписанных назначений MATLAB перезаписывает значение левого аргумента, но сохраняет существующий тип данных и размер массива. В дополнение к предотвращению роста разрядности, назначение под индексом уменьшает количество отливок в сгенерированном коде с фиксированной точкой и делает код более читаемым.

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

Каковы ваши цели для преобразования в фиксированную точку?

Прежде чем вы начнете преобразование, рассмотрите свои цели для преобразования в фиксированную точку. Реализуете ли вы свой алгоритм на C или HDL? Каковы ваши целевые ограничения? Ответы на эти вопросы определяют многие свойства с фиксированной точкой, такие как доступный размер слова, длина дроби и математические режимы, а также доступные математические библиотеки.

Чтобы настроить эти свойства, используйте настройки Advanced.

Для получения дополнительной информации смотрите Задать опции предложения типа.

Запуск с фиксированными точками и сравнение результатов

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

Используйте гистограмму для точной настройки параметров типа данных

Чтобы настроить настройки типа с фиксированной точкой, используйте гистограмму. Чтобы логгировать данные для гистограмм, в приложении щелкните стрелу Analyze и выберите Log data for histogram.

После симуляции и статического анализа:

  • Чтобы просмотреть гистограмму переменной, на вкладке Variables, щелкните поле Proposed Type для этой переменной.

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

  • Если переполнение значений и область значений не могут соответствовать предлагаемому типу, в таблице предлагаемые типы показаны красным цветом.

Когда инструмент применяет типы данных, он генерирует html-отчет, который предоставляет информацию о переполнении и подсвечивает переполнения красным цветом. Проверьте предложенные типы данных.

Оптимизируйте свой алгоритм

Используйте fimath, чтобы получить оптимальные типы для C или HDL

fimath свойства определяют правила для выполнения арифметических операций над fi объекты, включая математические, округляющие и переполненные свойства. Можно использовать fimath ProductMode и SumMode свойства для сохранения оптимальных типов данных для C или HDL. HDL может иметь произвольные типы размера слова в сгенерированном HDL-коде, в то время как C требует контейнерных типов (uint8, uint16, uint32). Используйте настройки Advanced, см. раздел «Настройка опций предложения по типу».

С.  KeepLSB настройка для ProductMode и SumMode моделирует поведение целочисленных операций в языке C, в то время как KeepMSB моделирует поведение многих устройств DSP. Различные методы округления требуют различных объемов служебного кода. Установка RoundingMethod свойство к Floor, что эквивалентно усечению двух комплементов, обеспечивает наиболее эффективную реализацию округления. Точно так же стандартным методом для обработки переполнений является обертывание с использованием арифметики по модулю. Другие методы обработки переполнения создают дорогостоящую логику. По возможности установите OverflowAction на Wrap.

Код MATLABЛучшие практикиСгенерированный код C

Компилируемый код

function y = adder(a,b)
  y = a + b;
end

Примечание

В приложении установите Default word length равным 16.

Проблема

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

int adder(short a, short b)
{
  int y;
  int i;
  int i1;
  int i2;
  int i3;
  i = a;
  i1 = b;
  if ((i & 65536) != 0) {
    i2 = i | -65536;
  } else {
    i2 = i & 65535;
  }

  if ((i1 & 65536) != 0) {
    i3 = i1 | -65536;
  } else {
    i3 = i1 & 65535;
  }

  i = i2 + i3;
  if ((i & 65536) != 0) {
    y = i | -65536;
  } else {
    y = i & 65535;
  }

  return y;
}

Зафиксировать

Чтобы сделать сгенерированный код C более эффективным, выберите математические настройки с фиксированной точкой, которые соответствуют вашим типам процессора.

Чтобы настроить предложения по типам с фиксированной точкой, используйте Settings приложения. Выберите fimath, а затем установите:

int adder(short a, short b)
{
  return a + b;
}
Метод округленияПол
Действие переполненияПеренос
Режим продукта KeepLSB
Суммарный режимKeepLSB
Продукт размера слова32
Суммарный размер слова32

HDL.  Для генерации HDL-кода установите:

  • ProductMode и SumMode на FullPrecision

  • Overflow action на Wrap

  • Rounding method на Floor

Замените встроенные функции на более эффективные реализации с фиксированной точкой

Некоторые встроенные функции MATLAB могут быть сделаны более эффективными для реализации с фиксированной точкой. Например, можно заменить встроенную функцию реализацией интерполяционной таблицы или реализацией CORDIC, которая требует только итерационных операций shift-add. Для получения дополнительной информации см. «Замена функций».

Повторные

Операции деления, где это возможно

Часто деление не полностью поддерживается оборудованием и может привести к медленной обработке. Когда ваш алгоритм требует деления, рассмотрите замену его одним из следующих опций:

  • Используйте перемену бит, когда знаменатель является степенью двойки. Для примера, bitsra(x,3) вместо x/8.

  • Умножьте на обратную единицу, когда знаменатель является постоянным. Для примера, x*0.2 вместо x/5.

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

Устранение переменных с плавающей точкой

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

Избегайте явных двойных и одиночных отливок

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

Вместо использования отливок задайте функцию замены. Для получения дополнительной информации см. «Замена функций».