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

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

Лучшая практика для структурирования вашего кода должна разделить ваш основной алгоритм от другого кода, который вы используете, чтобы протестировать и проверить результаты. Создайте тестовый файл, чтобы вызвать ваш исходный 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 отмечает функции и построения, которые не доступны в подмножестве языка MATLAB, поддержанного для генерации кода. Этот совет появляется в режиме реального времени, когда вы редактируете свой код в редакторе MATLAB. Для получения дополнительной информации смотрите Проверку кода с Анализатором кода. Программное обеспечение обеспечивает ссылку на отчет, который идентифицирует вызовы функций и использования типов данных, которые не поддерживаются для генерации кода. Для получения дополнительной информации смотрите Проверку кода при помощи Инструмента Готовности Генерации кода.

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

Приложение отмечает неподдерживаемые вызовы функции, найденные в вашем алгоритме на вкладке 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 требует контейнерных типов (uint8uint16uint32). Используйте настройки Advanced, смотрите, Задают Опции Предложения по Типу.

C.  KeepLSB установка для ProductMode и SumMode моделирует поведение целочисленных операций на языке C, в то время как KeepMSB моделирует поведение многих устройств DSP. Различные методы округления требуют различных сумм служебного кода. Установка RoundingMethod свойство к Floor, то, которое эквивалентно дополнительному усечению two, обеспечивает самую эффективную реализацию округления. Точно так же стандартный метод для обработки переполнения состоит в том, чтобы перенести использование арифметика по модулю. Другие методы обработки переполнения создают дорогостоящую логику. Каждый раз, когда возможно, устанавливает 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
Режим SumKeepLSB
Размер слова продукта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, чтобы изолировать функции, которые не поддерживают типы данных с фиксированной точкой. Автоматизированный инструмент преобразования не поддерживает эти броски.

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