Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Fixed point c

Fixed point c

Наверное Вы не раз встречали в исходном коде языка C/C++ константы и имена функций с суффиксами наподобие hr, r, lr, hk, k или lk. Это специальное расширение языка, предназначенное для упрощения доступа к арифметике с фиксированной точкой (fixed-point), операции насыщения (saturation) и т. п.

В стандарте ANSI C есть два широких класса арифметических тиров: целочисленные типы (char, int, long и т. д.) и типы с плавающей точкой (float, double). Арифметика для целочисленных (integer) типов быстрая, но эти типы представляют только целые числа с диапазоном, ограниченным разрядностью числа. Числа с плавающей точкой (floating-point) предоставляют способ расширить диапазон представляемых значений чисел, от величин очень близких к 0, до очень больших величин. Процессоры SHARC предоставляют быструю аппаратную поддержку для арифметики с плавающей точкой. Однако на процессоре Blackfin вызовы функций из библиотек реального времени используют программную эмуляцию арифметики с плавающей точкой. Это происходит прозрачно для C-программиста, однако приводит к значительным затратам процессорного времени.

Таким образом, на платформе Blackfin целые числа предоставляют большее быстродействие, чем числа с плавающей точкой, но это может обойтись дороже в плане затрат времени на разработку. Определенная проблема касается целочисленного переполнения. Если значение типа со знаком (signed) переполнится и выйдет из допустимого для типа диапазона, то результат окажется неопределенным, и Вы не можете положиться на его значение в программе. Если переполнится значение беззнакового типа (unsigned) и превысит свой допустимый диапазон, то результат по циклически поменяет свое значение (перепрыгнет через 0), так что, к примеру, инкремент очень большого положительного числа даст очень маленькое положительное число. Для приложений DSP получение такой проблемы не всегда то, что Вы хотите. Часто Вы хотели бы минимизировать потенциальную ошибку подобного рода применением насыщения в переполняемом значении, когда значение достигает самого большого допустимого (или минимально допустимого для числа со знаком) значения, которое может представить тип.

Примечание: насыщение это специальная функция, которая применяется для смягчения последствий переполнения целых чисел. Что такое насыщение, как оно работает и какие действия выполняет, см. Википедию или см. раздел «Saturation (насыщение)» в статье [2].

Как можно решить эти проблемы? Аппаратура ядра процессора Blackfin предоставляет поддержку типов чисел с фиксированной точкой (fixed-point types), которые в числе содержат дробную и возможно целую часть, но при этом отсутствует переменная экспонента, которая используется в типах чисел с плавающей точкой. Арифметика с фиксированной точкой быстрая (почти так же, как целочисленная), и предоставляет семантику для насыщения при переполнении. Использование этих типо в с фиксированной точкой — обычная практика в DSP-программировании. Как использовать на ассемблере понятно [2], но как использовать арифметику с фиксированной точкой на языке C? До некоторых пор способом получить доступ к вычислениям с фиксированной точкой на C были вызовы с помощью компилятора встроенных функций и функций библиотек времени выполнения. Однако этот подход может быть неуклюжим, и приводит к трудно портируемому коду.

Начиная с VisualDSP++ 5.0 update 9, код арифметики с фиксированной точкой может быть написан с использованием новых традиционных типов с фиксированной точкой (native fixed-point types), выраженных четко и кратко. Язык, выбранный для специальных вычислений с плавающей точкой, определен в части 4 ISO/IEC Technical Report 18037 «Extensions to support embedded processors» (расширения для поддержки встраиваемых приложений, см. [3]). С использованием этих расширений код, который Вы пишете, может быть легко портирован для использования с другими компиляторами, поддерживающими TR 18037 с подобными размерами типов с фиксированной запятой. Хотя эта статья относится прежде всего к Blackfin, подмножество поддержки типов fixed-point также доступно для SHARC. Подробности см. в документации на компилятор SHARC и руководстве пользователя для библиотек.

Давайте посмотрим, как работают типы с фиксированной точкой. Сначала нужно подключить файл заголовка stdfix.h, в котором декларируются полезные функции и макросы. После этого Вы можете использовать имена типов fract и accum вместе с квалификаторами short, long и unsigned. Обратите внимание, что только некоторые из этих комбинаций приводят к различным типам; наподобие стандарта языка C, стандарт TR 18037 имеет архитектурно-независимые определения синтаксиса и семантики, и некоторые подробности реализации будут изменяться в соответствии с низлежащей аппаратурой. Так что, к примеру, на архитектуре Blackfin типы int и long int оба представляют 32-битный целый тип, а short fract и fract оба представляют 16-битный дробный тип.

Все дробные типы со знаком (signed fract) имеют диапазон [-1, 1), в то время как дробные типы без знака (unsigned fract) получают значения в диапазоне [0, 1). Однако чем больше разрядность дробного числа, тем выше у него точность.

Для типов accum диапазон представляемых чисел составит [-256, 256) для чисел со знаком (signed accum), и [0, 256) для чисел без знака (unsigned accum). Подробнее про использование типов с фиксированной точкой см. раздел «Using Native Fixed-Point Types» в руководстве компилятора C и библиотек.

Как это можно использовать на практике? Как первый шаг в математику с фиксированной точкой, давайте напишем скалярное произведение (dot-product):

Во-первых, обратите внимание на использование суффикса k при инициализации константой числа типа accum. Это показывает, что константа имеет тип accum. Имеются также эквивалентные суффиксы констант для всех других типов чисел с фиксированной точкой (fixed-point).

Во-вторых, взгляните на тело цикла for. Здесь умножение работает над двумя дробными типами, и делает точно то, что Вы ожидаете – перемножаются два дробных числа, и в результате получается другое дробное число. Например, 0.5 * 0.5 даст результат 0.25. Подобным образом сложение в переменной типа accum использует насыщение, если результат вышел за пределы диапазона значений accum.

Что произойдет, если мы будем использовать смешанные типы? В большинстве случаев получится то же самое, что Вы ожидаете. Например, если записать:

То вы получите результат 0.5. В сущности, Вы можете думать об арифметике с заданными точностью и диапазоном чисел, в которой будет происходить насыщение в результатах операций до значения, которое может представить тип числа. Опять-таки за получением подробностей см. руководство компилятора C и библиотек, или спецификацию TR 18037.

Все арифметические операции +, -, *, /, !, > могут применяться для fixed-point типов. Дополнительно Вы можете использовать операторы отношений ==, !=, и >=. Это дает Вам дополнительную гибкость, чтобы более кратко выразить алгоритм. Однако стоит попробовать обратить внимание на то, что поддерживает Ваша низлежащая аппаратура. Точно так же, как и при использовании целочисленной арифметики, лучше избегать деления во внутренних циклах, потому что это обычно требует вызова функции при поддержке компилятором, и приведет к повышенному расходу ресурса выполнения процессора. Однако также стоит избегать, например, умножения типов accum (во внутренних циклах), поскольку у процессора Blackfin также нет для этого аппаратной поддержки. Использование unsigned-типов обычно приводит к немного менее эффективному коду, поскольку у процессора Blackfin есть более продвинутая поддержка дробной арифметики со знаком.

Стоит изучить возможности библиотечной поддержки операций для типов с фиксированной запятой. Technical Report определяет некоторое количество полезных функций-утилит для округления значений (round), подсчета бит знака или нуля, или для выполнения альтернативных типов деления или умножения. Библиотека также определяет спецификаторы типа, которые можно использовать в строках спецификации формата printf или scanf, чтобы осуществить ввод/вывод чисел с фиксированной точкой. Чтобы получить преимущество от такой поддержки ввода/вывода, убедитесь, что Ваша сборка использует разрешение на fixed-point I/O (с использованием опций командной строки –fixed-point-io или –full-io, см. [4]), поскольку эта поддержка не подключена в библиотеке по умолчанию, потому что увеличивает размер библиотечного кода.

Когда будете использовать расширения для fixed-point типов, обратите внимание на несколько моментов, которые нельзя упустить. Главным образом заставьте компилятор выдавать предупреждения, чтобы избежать появления подобных ошибок.

• Для инициализации переменных, у которых тип с фиксированной точкой, всегда используйте для констант суффиксы, задающие тип fixed-point (r, k и т. п.). Не присваивайте битовые маски – например, число 0x4000, присвоенное типу fract, приведет сразу к насыщению, и даст результат 1.0, поскольку присваиваемое число выходит за диапазон [-1, 1).
• Если нужно присвоить -1 числу типа fract, используйте макрос FRACT_MIN (или LFRACT_MIN для типа long fract). Константа -1.0r, к сожалению, даст не то, что Вы ожидаете, так как в соответствии со стандартом C она означает –(1.0r), и поскольку 1.0 выходит за пределы диапазона числа fract, это будет вычислено в число несколько больше, чем -1.
• Присваивание дробного значения целому также вероятно приведет к ошибке. Например, если Вы присвоите число типа unsigned fract числу целого типа, то всегда получите 0, поскольку unsigned fract будет усечено до ближайшего целого числа.
• Смешивание в арифметических выражениях типов fixed-point и типов floating-point будет преобразовывать тип fixed-point в тип floating-point и выполнять арифметику floating-point.

Читать еще:  Как усилить антенну wifi

Раздел 4 Technical Report 18037, который поддерживается начиная с VisualDSP++ 5.0 update 9, представляет стандарт для типов с фиксированной точкой, который Вам поможет писать на языке C/C++ чистый, удобный в сопровождении код, использующий возможности процессора Blackfin.

Константы для дробных чисел с фиксированной точкой (fixed-point) могут быть указаны в том же формате, как и константы с плавающей точкой (floating-point), включая любую десятичную или двоичную экспоненту. Для дополнительной информации см. «strtofxfx» на странице 3-330 руководства «C/C++ Compiler and Library Manual for Blackfin® Processors» (или врезку «Функция strtofxfx»). Суффиксы используются для идентификации типа констант. Заголовочный файл stdfix.h также предоставляет макросы для минимальных и максимальных значений чисел с фиксированной точкой, см. таблицу 1-16.

Таблица 1-16. Суффиксы и макросы для констант Fixed-Point.

Класс с фиксированной точкой

Written on 11 Августа 2012 .

ОГЛАВЛЕНИЕ

Введение

Было решено начать работу над многократно используемым классом для математики с фиксированной точкой. Другой побуждающей причиной было желание узнать, действительно ли на C++ можно написать класс, объекты которого будут вести себя аналогично встроенным числовым типам. Были поставлены цели, что этот класс с фиксированной точкой:

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

После краткого введения в математику с фиксированной точкой в статье объясняется, как использовать класс fixed_point. Затем разъясняется реализация класса.

Краткое введение в математику с фиксированной точкой

Число с фиксированной точкой можно разделить на необязательный знаковый разряд, целое и дробную часть.

Целая часть состоит из i битов, дробная часть состоит из f битов.

Суммарное значение числа с фиксированной точкой V равняется:

Число с фиксированной точкой имеет формат i.f.

Диапазон беззнаковых чисел с фиксированной точкой — от 0 до 2^i-1. Диапазон чисел с фиксированной точкой со знаком — от -2^i до 2^i-1. Точность числа с фиксированной точкой равняется 2^(-f).

Пример: предположим, что есть число с фиксированной точкой в 16 битов, в формате 7.8, с дополнительным знаковым битом, при этом биты установлены в 0000 0110 1010 0000 (то есть, 0x06A0 в шестнадцатеричной системе). Значение этого числа с фиксированной точкой +6.625.

Если имеется такой набор битов, независимо от формата числа с фиксированной точкой, с ним можно обращаться как с целым и выполнять над ним действия целочисленной математики. Небольшие сложности возникают только при выполнении умножения или деления: необходимо убедиться, что десятичная точка находится в правильной позиции. Это приблизительно сопоставимо с тем, как вы учились умножать вручную в школе: в конце умножения вы должны были сосчитать разряды после десятичной точки и затем поставить десятичную точку в правильное место.

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

Установка проекта

Если вы просто хотите использовать класс fixed_point в своем коде, то вам всего лишь нужно скачать проект. Вы найдете fixed_point.h в папке include/fpml.

Но проект также содержит тестовый код, включая тестирование модулей и контрольные задачи. Для их выполнения вам также потребуется CMake (версия 2.6 или выше), который можно скачать с сайта http://www.cmake.org/. Запустите CMake и укажите в нем каталог, в котором вы сохранили загруженный проект, и используйте его для создания решений и проектов Visual Studio. Затем вы можете загрузить FPMATH.sln, который будет содержать тестовые проекты.

Использование класса fixed_point

Для начала нужно включить заголовочный файл fixed_point.h:

Класс fixed_point определен внутри пространства имен fmpl. Для его использования можно писать перед именем класса fpml:: везде, где он необходим, или использовать утверждение using:

Это два принципиально разных сценария использования класса fixed_point . Вы можете использовать его в только что написанном коде, в котором требуется математика с фиксированной точкой, или в котором вы контролируете поведение, т.е., устанавливаете число целых и дробных битов. Чрезвычайно простой пример кода первого сценария использования может выглядеть так:

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

Второй сценарий использования – это сценарий переноса, когда код уже существует, и был написан с использованием типов с плавающий точкой или с плавающей точкой двойной точности. Если вы тщательно проверили код на наличие проблем с диапазоном и точностью и приняли решение, что код по-прежнему будет работать, если вычисления с плавающей точкой заменить на вычисления с фиксированной точкой, то вы можете использовать #define для переноса кода с выполнением незначительных изменений в исходном коде:

Однако необходимо быть очень осторожным, так как диапазон и точность чисел с фиксированной точкой будут отличаться от тех, которые имеют исходные числа с плавающей точкой, и это приведет к появлению ошибок в исходном коде. Особенно когда используются такие функции, как sqrt, log иди sin, распространение ошибок чисел с фиксированной точкой больше не является линейным, и можно столкнуться с неожиданностями.

Реализация класса fixed_point

Одна из целей заключается в том, что код должен быть как можно более обобщенным. Для достижения этого можно применять шаблоны. Были использованы три параметра шаблона:

B – базовый тип. Это должен быть целый тип. Данный тип используется для большинства вычислений. Примеры – беззнаковый символьный тип, знаковое короткое целое, или целое. Этот тип может быть выбран в зависимости от размера, точности и требований к производительности. Если выбран беззнаковый тип, поведение класса fixed_point беззнаковое; в противном случае оно знаковое. Знаковое поведение более точно совпадает с поведением встроенных типов с плавающей точкой.

Оператор BOOST_CONCEPT_ASSERT((boost::Integer)) в теле класса обеспечивает, что только целые типы могут использоваться в качестве базового типа. Обратите внимание, что базовый тип не используется здесь в смысле базового класса. Более того, класс fixed_point не является производным ни от какого базового класса, будучи самостоятельным.

I – число битой целой части, не считая знаковый бит. Оно определяет диапазон чисел, который может быть представлен.

F – число битов дробной части. Оно определяет точность чисел, которая может быть представлена. Нет необходимости устанавливать F, когда создается экземпляр шаблона, так как оно всегда может быть автоматически вычислено из базового типа B и числа целых битов I. Но если оно задано, оно должно быть правильным. Оператор BOOST_STATIC_ASSERT(I + F == std::numeric_limits::digits) в теле класса обеспечивает выполнение этого условия.

Число битов базового типа должно удовлетворять следующей формуле: #(B)=S+I+F, где:

  • #(B) – число битов базового типа,
  • S равен 1 для знаковых типов и 0 для беззнаковых типов,
  • I – число целых битов,
  • F – число дробных битов.

В следующей таблице перечислены используемые типы и требования к I и F:

Get Started with Fixed-Point Designer

Fixed-Point Designer™ provides data types and tools for optimizing and implementing fixed-point and floating-point algorithms on embedded hardware. It includes fixed-point and floating-point data types and target-specific numeric settings. With Fixed-Point Designer you can perform target-aware simulation that is bit-true for fixed point. You can then test and debug quantization effects such as overflows and precision loss before implementing the design on hardware.

Читать еще:  Размер слайда презентации powerpoint

Fixed-Point Designer provides apps and tools for analyzing double-precision algorithms and converting them to reduced-precision floating point or fixed point. Optimization tools enable you to select data types that meet your numerical accuracy requirements and target hardware constraints. For efficient implementation you can replace computationally expensive design constructs with hardware-optimal patterns such as compressed lookup tables.

Production C and HDL code can be generated directly from your fixed- and floating-point optimized models.

Tutorials

MATLAB Workflow

Fixed point basics.

Perform fixed-point arithmetic.

fi object display settings used in code examples

This example shows how to accelerate fixed-point algorithms using fiaccel function.

This example shows how to set fixed-point data types by instrumenting MATLAB code for min/max logging and using the tools to propose data types.

Generate standalone fixed-point C code.

Manually convert floating-point MATLAB algorithm to fixed point.

Simulink Workflow

Overview of the development cycle for simulating dynamic systems.

Read fixed-point data from MATLAB ® into your Simulink ® models, and log fixed-point information from your models and simulations to the workspace.

Create a fixed-point model by configuring Simulink blocks to output fixed-point signals.

Provides an example based on the fxpdemo_dbl2fix model, which highlights many of the key features of the Fixed-Point Designer software.

Use the Fixed-Point Tool to convert a floating-point model to fixed point.

Use data type override settings to share and edit a model containing fixed-point blocks without the Fixed-Point Designer software.

About Fixed Point

  • Benefits of Using Fixed-Point Hardware

Fixed-point hardware can provide benefits in size and power consumption, memory usage, speed, and cost.

How fixed-point data types are represented.

Discusses the concepts behind arithmetic operations in Fixed-Point Designer

Discusses the types of scaling used in Fixed-Point Designer; binary point-only and [Slope Bias]

Introduces the concepts behind arithmetic operations in Fixed-Point Designer

Provides an overview of measurement scales and representing numbers.

MATLAB Command

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list:

How to Get Best Site Performance

Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.

Какой лучший способ сделать математику с фиксированной точкой?

Мне нужно ускорить программу для Nintendo DS, у которой нет FPU, поэтому мне нужно изменить математику с плавающей запятой (которая эмулируется и медленно) на фиксированную точку.

Как я начал, я изменил float на int и когда мне нужно было их преобразовать, я использовал x → 8 для преобразования переменной x с фиксированной точкой в ​​фактическое число и x 17 сент. ’08 в 3:32

Вы можете попробовать мой класс с фиксированной точкой (последний доступный @https://github.com/eteran/cpp-utilities)

Он предназначен для замены плавающих полов/двойников и имеет возможность выбора. Он использует boost для добавления всех необходимых перегрузок операторов математики, поэтому вам также понадобится это (я считаю, что для этого это просто зависимость заголовка, а не зависимость библиотеки).

Кстати, общее использование может быть примерно таким:

Единственное реальное правило состоит в том, что число должно содержать собственный размер вашей системы, такой как 8, 16, 32, 64.

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

Поэтому следует написать класс FixedPoint8. Протестируйте и тщательно отлаживайте. Если вам нужно убедить себя в его производительности по сравнению с использованием простых целых чисел, измерьте его.

Это избавит вас от многих проблем, переместив сложность расчета с фиксированной точкой в ​​одно место.

Если вам нравится, вы можете еще больше повысить полезность своего класса, сделав его шаблоном и заменив старый FixedPoint8 на, скажем, typedef FixedPoint FixedPoint8; Но в вашей целевой архитектуре это, вероятно, не обязательно, поэтому избегайте сложности шаблонов.

Вероятно, в Интернете есть хороший класс с фиксированной точкой — я бы начал искать библиотеки Boost.

Использует ли ваш код с плавающей запятой десятичную точку? Если да:

Сначала вы должны прочитать статью Рэнди Йейтса о вступлении к математике с фиксированной точкой: http://www.digitalsignallabs.com/fp.pdf

Затем вам нужно выполнить «профилирование» кода с плавающей точкой, чтобы выяснить соответствующий диапазон значений фиксированной точки, необходимых для «критических» точек вашего кода, например. U (5,3) = 5 бит влево, 3 бита вправо, без знака.

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

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

Изменение представлений с фиксированной точкой обычно называется «масштабированием».

Если вы можете сделать это с классом без штрафа за производительность, то это путь. Это сильно зависит от компилятора и того, как он встроен. Если есть штраф за исполнение с использованием классов, вам нужен более традиционный подход в стиле C. Подход ООП предоставит вам безопасность, основанную на компиляторах, которая традиционно реализуется только в рамках.

@cibyr имеет хорошую реализацию ООП. Теперь для более традиционного.

Чтобы отслеживать, какие переменные масштабируются, вам необходимо использовать согласованное соглашение. Создайте обозначение в конце каждого имени переменной, чтобы указать, масштабируется ли значение или нет, и пишите макросы SCALE() и UNSCALE(), которые расширяются до x → 8 и x 17 сент. ’08 в 3:37

Я бы не использовал плавающие точки вообще на процессоре без специального оборудования для его обработки. Мой совет — рассматривать ВСЕ числа как целые числа, масштабированные до определенного фактора. Например, все денежные значения находятся в центах как целые числа, а не доллары, как плавающие. Например, 0.72 представляется как целое число 72.

Сложение и вычитание тогда являются очень простой целочисленной операцией, такой как (0.72 + 1 становится 72 + 100, становится 172, становится 1.72).

Умножение немного сложнее, так как ему требуется целочисленное умножение, за которым следует масштаб, например (0.72 * 2 становится 72 * 200, а 14400 становится 144 (scaleback) становится 1.44).

Это может потребовать специальных функций для выполнения более сложной математики (синус, косинус и т.д.), но даже их можно ускорить с помощью поисковых таблиц. Пример: поскольку вы используете фиксированное-2-представление, в диапазоне (0,0,1) (0-99) и только sin-cos есть только 100 значений и sin/cos, поэтому вам нужно всего лишь 100-целую таблицу поиска.

Когда я впервые столкнулся с номерами с фиксированной точкой, я нашел статью Джо Лемье, Math с фиксированной точкой в ​​C, очень полезная, и она предлагает один из способов представления значений фиксированной точки.

Однако я не использовал свое объединение для чисел с фиксированной точкой. У меня в основном есть опыт работы с фиксированной точкой в ​​C, поэтому у меня не было возможности использовать класс. По большей части, однако, я считаю, что определение количества бит бит в макросе и использование описательных имен переменных делает это довольно легко работать. Кроме того, я обнаружил, что лучше всего иметь макросы или функции для умножения и особенно деления, или вы быстро получите нечитаемый код.

Например, с 24.8 значениями:

Обратите внимание, что с этими макросами есть все виды проблем с переполнением целых чисел, я просто хотел сохранить макросы простыми. Это просто быстрый и грязный пример того, как я это сделал в C. На С++ вы можете сделать что-то намного более чистое, используя перегрузку оператора. На самом деле, вы можете легко сделать этот код C намного красивее тоже.

Читать еще:  Подключение смартфона к принтеру через wifi

Я предполагаю, что это длинный способ сказать: я думаю, что хорошо использовать подход typedef и macro. Пока вы понимаете, какие переменные содержат значения фиксированной точки, это не так сложно поддерживать, но, вероятно, это будет не так красиво, как класс С++.

Если бы я был на вашем месте, я попытался бы получить некоторые профилирующие числа, чтобы показать, где узкие места. Если их относительно немного, перейдите к typedef и макросам. Если вы решите, что вам нужна глобальная замена всех поплавков математикой с фиксированной запятой, то вам, вероятно, будет лучше с классом.

Fixed-Point Designer

Проектирование, симуляция и анализ систем с фиксированной точкой.

Fixed-Point Designer предоставляет типы данных и инструменты для разработки алгоритмов с фиксированной точкой и с одинарной точностью для оптимизации производительности на встраиваемых системах. Fixed-Point Designer анализирует проект и предлагает типы данных и атрибуты, такие как длина слова и масштабирование. Можно указать подробные атрибуты данных, такие как режим округления и действие при переполнении, и смешивать данные одинарной точности и данные с фиксированной точкой. Вы можете выполнять бит-истинные симуляции, чтобы наблюдать влияние ограниченного диапазона и точности без реализации проекта в железе.

Fixed-Point Designer позволяет конвертировать алгоритмы двойной точности в одинарную точность или фиксированную точку. Можно создавать и оптимизировать типы данных, соответствующие требованиям числовой точности и целевым аппаратным ограничениям. Можно определить требования к диапазонам сигналов в проекте с помощью математического анализа или инструментальной симуляции. Fixed-Point Designer предоставляет приложения и инструменты, которые помогут вам в процессе преобразования данных и позволят сравнить результаты в фиксированной точке с оригиналом в плавающей точке.

Fixed-Point Designer поддерживает генерацию C, HDL и PLC кода.

Ключевые возможности

  • Спецификация типов данных с фиксированной точкой в MATLAB, Simulink и Stateflow
  • Бит-истинная симуляция алгоритмов с фиксированной и одинарной точностью
  • Гистограммы и связанные с ними инструменты для изучения и оптимизации типов данных
  • Приложения для преобразования из двойной точности в фиксированную точку или одинарную точность
  • Инструментирование для сбора значений min и max во время симуляции
  • Анализ диапазонов для полной оценки min и max значений в проекте
  • Инструменты обнаружения переполнения и потери точности для отладки и визуализации

Спецификация с фиксированной точкой

Fixed-Point Designer позволяет задать все свойства, связанные с фиксированной точкой, для кода MATLAB, моделей Simulink и диаграмм Stateflow. Он обеспечивает полный контроль знака, длины слова и масштабирования. Он поддерживает длины слов от 1 бита до 128 бит или более. Также поддерживается двоичное масштабирование и произвольное масштабирование при помощи наклона и смещения, необходимое датчикам и приводам. Вы можете управлять деталями математических операций, таких как обработка округления и переполнения.

Fixed-Point Designer предоставляет большое количество функций, таких как математические и побитовые операции, манипуляции с массивами и матрицами, CORDIC реализации и тригонометрические функции для поддержки вычислений с фиксированной точкой.

С помощью Fixed-Point Designer можно управлять арифметикой с фиксированной точкой. В MATLAB переменные с фиксированной точкой могут либо совместно использовать один набор арифметических атрибутов, либо иметь свои собственные заданные арифметические атрибуты.

Используя Fixed-Point Designer с MATLAB Coder или Embedded Coder, вы можете генерировать чисто целочисленный код C из вашего кода с фиксированной точкой в MATLAB. Используя Fixed-Point Designer с HDL Coder , вы можете генерировать бит-истинный, синтезируемый код Verilog и VHDL из кода с фиксированной точкой в MATLAB, моделей Simulink и диаграмм Stateflow.

Бит-истинный процесс проектирования

Fixed-Point Designer обеспечивает бит-истинное соответствие в рабочем процессе, использующем модельно-ориентированное проектирование. Поведение алгоритма с фиксированной точкой является бит-истинным для всех видов симуляции и генерации кода, включая режимы Accelerator и Software-in-the-Loop. Анализ и верификация алгоритма с фиксированной точкой основаны на бит-истинных представлениях. Бит-истинное соответствие максимизирует многие преимущества модельно-ориентированного проектирования, такие как возможность обнаружения проблем на ранних этапах рабочего процесса, когда их легче и дешевле исправить.

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

С помощью инструментов Fixed-Point Designer можно получить доступ к этим значениям и изменить типы данных сигналов, оптимизируя точность и обеспечивая охват их диапазона. Диапазоны типов данных можно задать с помощью минимумов и максимумов проектирования, результатов моделирования или полученных минимальных и максимальных результатов. Для моделей Simulink можно заблокировать типы выходных данных, чтобы предотвратить их изменение.

Исследование и оптимизация типов данных

Fixed-Point Designer предоставляет инструменты для системной визуализации диапазонов симуляции и исследует, как различные сигналы соответствуют определенному выбору типа данных. Fixed-Point Designer позволяет легко сравнить ваш идеальный дизайн с плавающей точкой и эффективную реализацию с использованием оптимальных типов данных для встраиваемой системы.

Используя переопределение типа данных, проект с фиксированной или одинарной точностью можно мгновенно переключить на двойную точность для анализа влияния квантования. Легко выполнять сравнение симуляций идеализированного поведения и поведения на встраиваемой системе. Интеграция рабочего процесса с Simulation Data Inspector позволяет легко определить, находится ли реакция системы в пределах желаемых допусков.

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

Преобразование двойной точности в одинарную или фиксированную точку

Fixed-Point Designer предоставляет инструменты анализа для эффективного преобразования проекта с двойной точностью в одинарную точность или фиксированную точку. Fixed-Point Toolобеспечивает управляемый рабочий процесс для итеративного изучения различных вариантов типов данных в соответствии с требованиями к числовой точности и оптимального использования ресурсов встраиваемой системы. Этот инструмент позволяет наблюдать динамический диапазон переменных в проекте и гарантировать, что алгоритм ведет себя сообразно в представлениях с плавающей и фиксированной точкой.

В MATLAB или Simulink можно использовать Fixed-Point Designer для сбора минимальных и максимальных значений с помощью симуляции или анализа диапазона и получения предлагаемых типов данных. Гистограмма генерируется для каждого сигнала и переменной в вашем проекте и вы можете использовать эту гистограмму для оптимизации длины слова и длины дробной части. Вы можете заменить любые неподдерживаемые функции MATLAB в своем проекте функцией аппроксимации на основе интерполяционной таблицы.

Инструментирование модели и анализ диапазонов

Fixed-Point Designer позволяет собирать данные о диапазонах во время симуляции с помощью инструментирования модели без необходимости записывать все сигналы в модели в явном виде. Эти данные о диапазонах являются основой для предложения типов данных и сбора статистики, такой как данные гистограммы, которые помогают в анализе вашего проекта.

Fixed-Point Designer также предоставляет вам информацию о диапазонах, основанную на математическом анализе вашего проекта. Это позволяет определить наихудшие диапазоны сигналов вашего проекта без создания полностью исчерпывающих симуляционных тестов. Используя полученные диапазоны, вы можете убедиться, что ваш проект корректно работает и обрабатывает все возможные граничные ситуации.

Обнаружение потери точности и переполнения

Fixed-Point Designer предоставляет инструменты, которые позволяют быстро идентифицировать источники переполнения, потери точности и лишний диапазон или точность. Используя переопределение данных с двойной точностью, можно визуализировать идеальное поведение модели с плавающей точкой и проанализировать это поведение по отношению к указанным встроенным фиксированным типам данных.

Визуальный дисплей с использованием гистограмм, которые накладываются на идеализированный диапазон и встроенный фиксированный тип данных, позволяет легко обнаружить источники переполнений, исчезновений порядка, лишних битов диапазона и лишних битов точности. Это позволяет легко определить места, в которых требуются улучшения типов данных.

Вы можете проследить переполнение/исчезновение порядка к определенному элементу проекта, например к определенному блоку, элементу диаграммы Stateflow или секции кода MATLAB. Интеграция Fixed-Point Designer с диагностикой Simulink позволяет обнаруживать и изолировать ошибки проектирования, такие как переполнения во время выполнения. Возможность подавления диагностики отдельных элементов модели, таких как правильно переполненный таймер, позволяет тратить время только на реальные проблемы.

Ссылка на основную публикацию
Adblock
detector