Лучшая практика для структурирования вашего кода состоит в том, чтобы разделить ваш основной алгоритм от другого кода, который вы используете, чтобы протестировать и проверить результаты. Создайте тестовый файл, чтобы вызвать ваш исходный алгоритм 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
задают правила для выполнения арифметических операций на объектах fi
, включая математику, округление и свойства переполнения. Можно использовать свойства fimath
ProductMode
и SumMode
сохранить оптимальные типы данных для C или HDL. HDL может иметь произвольные типы размера слова в сгенерированном HDL-коде, тогда как C требует контейнерных типов (uint8
, uint16
, uint32
). Используйте настройки 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 и настройки | 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 более эффективным, выберите математические настройки фиксированной точки, которые совпадают с вашими типами процессора. Чтобы настроить предложения по фиксированной точке, используйте приложение Settings. Выберите fimath и затем установите: | int adder(short a, short b) { return a + b; } | ||
Округление метода | Пол | ||
Действие переполнения | Перенестись | ||
Режим продукта | KeepLSB | ||
Режим Sum | 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, чтобы изолировать функции, которые не поддерживают типы данных с фиксированной точкой. Автоматизированный инструмент преобразования не поддерживает эти броски.
Вместо того, чтобы использовать броски, предоставьте заменяющую функцию. Для получения дополнительной информации смотрите Функциональные Замены.