Как преобразовать код C с плавающей запятой в фиксированную точку?

У меня есть код на языке C, в котором используются 9X_digital-signal-processing двойники. Я хочу иметь возможность запускать 9X_signal-processing код на DSP (TMS320). Но DSP не поддерживает удвоения, только 9X_fixed-point числа с фиксированной точкой. Как лучше 9X_digital-signal-processing всего преобразовать код в код с фиксированной 9X_c точкой? Есть ли хорошая библиотека C для 9X_dsp чисел с фиксированной запятой (реализованных 9X_digital-signal-processing как целые числа)?

13
2

  • Из любопытства, как компилятор DSP представляет фиксированные точки? Как два целых числа? Например, как сло ...
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Как преобразовать код C с плавающей запятой в фиксированную точку?

Следующий код определяет тип Fixed, используя 9X_fixed-point целые числа в качестве внутреннего представления. Сложение 9X_dsp и вычитание выполняются просто операторами 9X_fixed-point + и -. Умножение выполняется с использованием 9X_signal-processing определенного макроса MULT.

#include 
typedef int Fixed;

#define FRACT_BITS 16
#define FRACT_BITS_D2 8
#define FIXED_ONE (1 << FRACT_BITS)
#define INT2FIXED(x) ((x) << FRACT_BITS)
#define FLOAT2FIXED(x) ((int)((x) * (1 << FRACT_BITS))) 
#define FIXED2INT(x) ((x) >> FRACT_BITS)
#define FIXED2DOUBLE(x) (((double)(x)) / (1 << FRACT_BITS))
#define MULT(x, y) ( ((x) >> FRACT_BITS_D2) * ((y)>> FRACT_BITS_D2) )

Я использовал приведенный 9X_fixed-point выше код для представления дробей в моем 9X_beagleboard алгоритме обработки изображений. Это было 9X_fixed-point быстрее, чем версия, в которой использовались 9X_texas-instruments двойники, и результаты были почти такими 9X_digital-signal-processing же.

13
0

Ответ #2

Ответ на вопрос: Как преобразовать код C с плавающей запятой в фиксированную точку?

TI предоставляет библиотеку с фиксированной 9X_texas-instruments точкой под названием "IQmath":

http://focus.ti.com/lit/sw/sprc990/sprc990.pdf

Преобразование 9X_beagleboard включает в себя анализ текущего кода - для 9X_texas-instruments каждой переменной вам нужно знать, какой 9X_beagleboard диапазон она может содержать и какая точность 9X_dsp ей нужна. Затем вы можете решить, в каком 9X_dsp типе его хранить. IQMath предоставляет типы 9X_beagleboard от q30 с диапазоном +/- 2 и точностью от 9X_c 0,0000000001 до q1 с диапазоном ~ +/- 1 9X_texas-instruments миллион и точностью 0,5.

Для операций, которые 9X_signal-processing могут привести к выходу за пределы диапазона 9X_texas-instruments переменных, вам необходимо добавить проверки 9X_fixed-point на переполнение и решить, как с этим справиться 9X_c - закрепить на максимальном уровне, сохранить 9X_texas-instruments с другим масштабом, вызвать ошибку и т. д.

На 9X_digital-signal-processing самом деле нет способа выполнить преобразование 9X_dsp в фиксированную точку без глубокого понимания 9X_signal-processing потока данных вашего процесса.

8
0

Ответ #3

Ответ на вопрос: Как преобразовать код C с плавающей запятой в фиксированную точку?

Большинство наборов инструментов DSP включают 9X_fixed-point библиотеки для эмуляции операций с плавающей 9X_dsp запятой в программном обеспечении. Это будет 9X_fixed-point медленным, но вы должны сначала создать 9X_signal-processing свой код с поддержкой с плавающей запятой, а 9X_digital-signal-processing затем профилировать, чтобы увидеть, есть 9X_texas-instruments ли всего несколько мест, которые вам нужно 9X_texas-instruments преобразовать в фиксированную точку, чтобы 9X_c получить достаточную производительность. Вам 9X_signal-processing также потребуется запустить механизм с плавающей 9X_fixed-point запятой, чтобы обеспечить сравнение при 9X_texas-instruments переносе на фиксированную точку, чтобы убедиться, что 9X_signal-processing вы ничего не потеряли в процессе.

5
0

Ответ #4

Ответ на вопрос: Как преобразовать код C с плавающей запятой в фиксированную точку?

Если в коде C двойники используются очень 9X_fixed-point редко / редко, то вы можете использовать 9X_fixed-point библиотеку эмуляции с плавающей запятой, не 9X_dsp заставляя ваш код C работать в 10–100 раз 9X_beagleboard медленнее. Если вы не хотите, чтобы производительность 9X_dsp снижалась, и есть много операций с плавающей 9X_fixed-point запятой, и вы знаете масштаб и точность, необходимые 9X_texas-instruments для каждой арифметической операции и операции 9X_fixed-point сохранения для каждого реалистичного ввода, то 9X_digital-signal-processing вы можете вручную преобразовать каждую арифметическую 9X_digital-signal-processing операцию в использовались масштабированные 9X_texas-instruments целочисленные типы данных и операции. Но 9X_dsp анализ требований к точности, как правило, нетривиален 9X_signal-processing для кода типа DSP. В учебниках по DSP и 9X_beagleboard численным методам есть много глав по этой 9X_fixed-point теме.

2
0