exponenta event banner

Рекомендации по автоматизированному преобразованию фиксированных точек

Создание тестового файла

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

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

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

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

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

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

По умолчанию приложение Fixed-Point Converter показывает результаты покрытия кода. Тестовые файлы должны использовать алгоритм в полном рабочем диапазоне, чтобы диапазоны моделирования были точными. Например, для фильтра реалистичными входами являются импульсы, суммы синусоид и чирп-сигналы. С помощью этих входных данных, используя линейную теорию, можно проверить правильность выходных данных. Сигналы, которые обеспечивают максимальный выход, полезны для проверки того, что система не переполняется. Качество предлагаемых типов данных с фиксированной точкой зависит от того, насколько хорошо тестовые файлы охватывают рабочий диапазон алгоритма с требуемой точностью. Проверка результатов покрытия кода позволяет убедиться в том, что тестовый файл выполняет алгоритм надлежащим образом. Проверьте код, помеченный красной строкой покрытия кода, поскольку этот код не выполняется. Если покрытие кода является недостаточным, измените тестовый файл или добавьте дополнительные тестовые файлы для увеличения покрытия. См. раздел Покрытие кода.

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

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

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

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

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

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

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

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

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

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

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

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

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

Дополнительные сведения см. в разделе Определение опций предложения по типу.

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

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

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

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

После моделирования и статического анализа:

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

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

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

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

Оптимизация алгоритма

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

fimath свойства определяют правила выполнения арифметических операций на fi объекты, включая математику, округление и свойства переполнения. Вы можете использовать fimath ProductMode и SumMode для сохранения оптимальных типов данных для C или HDL. HDL может иметь произвольные типы длины слов в сгенерированном коде HDL, тогда как C требует типов контейнеров (uint8, uint16, uint32). Дополнительные параметры см. в разделе Определение параметров предложения по типам.

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

Код MATLABПередовой опытСгенерированный код C

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

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

Примечание

В приложении задайте значение Длина слова по умолчанию 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, выберите математические настройки с фиксированной точкой, соответствующие типам процессоров.

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

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

ЛПВП.  Для формирования кода HDL установите:

  • ProductMode и SumMode кому FullPrecision

  • Overflow action кому Wrap

  • Rounding method кому Floor

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

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

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

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

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

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

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

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

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

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

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

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