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