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