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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Свойства fimath задают правила для выполнения арифметических операций на объектах fi, включая математику, округление и свойства переполнения. Можно использовать свойства fimath ProductMode и SumMode сохранить оптимальные типы данных для C или HDL. HDL может иметь произвольные типы размера слова в сгенерированном HDL-коде, тогда как C требует контейнерных типов (uint8, uint16, uint32). Используйте Расширенные настройки, смотрите, Задают Опции Предложения по Типу.

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

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

Код скомпилирован

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

Примечание

В приложении, размере слова Значения по умолчанию набора к 16.

Проблема

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

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

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

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

  return y;
}

Фиксация

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

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

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

Была ли эта тема полезной?