Алгоритм MATLAB DSP с фиксированной точкой

У меня есть вопрос о кодировании алгоритма для DSP Texas Instruments TMS320C64xx в MATLAB:

У меня есть работающая корявая реализация моего фильтра в MATLAB. Моя цель — использовать MATLAB Embedded Coder для преобразования этого алгоритма в C, который затем я могу импортировать в Code Composer Studio и загрузить в DSP.

Чтобы сделать это, я знаю, что мне нужно сделать определенные вещи с моим кодом MATLAB. Например, мне нужно заранее выделить место для матриц, чтобы он знал, какого размера их делать (если только я не хочу возиться с данными переменного размера). Все это преобразование кода MATLAB в код C'ish, чтобы кодер MATLAB мог его преобразовать, я более или менее понимаю. Однако я понятия не имею, как убедиться, что мои типы данных (например, коэффициенты моего фильтра) имеют фиксированную точку, а не с плавающей запятой, чтобы MATLAB Embedded Coder преобразовывал мой код в C, который включает только типы данных с фиксированной точкой.

Итак, я думаю, что мои общие вопросы таковы:

1) Если C64xx указан как 32-битный DSP с фиксированной точкой, это означает, что компилятор для него выдаст ошибку, если я попытаюсь использовать тип данных с плавающей запятой?

2) Есть ли способ гарантировать, что MATLAB Embedded Coder не создаст типы данных с плавающей запятой?

3) Нужно ли мне использовать MATLAB Fixed Point Toolbox?

Спасибо всем, дайте мне знать, если есть дополнительная информация, необходимая для ответа на мой вопрос.


person NickHalden    schedule 13.06.2011    source источник


Ответы (2)


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

  2. да. В диалоговом окне настройки конфигурации MATLAB Coder на панели «Интерфейс» есть флажок «Поддерживать только чисто целые числа». Проверка этого гарантирует, что вы не получите никаких типов данных с плавающей запятой в сгенерированном коде. Однако сначала вам нужно убедиться, что вы используете в своем коде только целочисленные типы данных или типы данных с фиксированной точкой. Эта опция просто гарантирует, что не будут сгенерированы числа с плавающей запятой — она не генерирует автоматически версию кода с фиксированной точкой или целочисленную версию кода из вашего кода MATLAB с плавающей запятой.

  3. Чтобы действительно создать C-код с фиксированной запятой, вам сначала нужно преобразовать код MATLAB с плавающей запятой в код с фиксированной запятой. Вам понадобится набор инструментов Fixed-Point Toolbox, который позволит вам указать ваши переменные как объект FI и определить правила операций с фиксированной точкой, используя настройку FIMATH. Как только вы определите 16/32-битные типы данных с фиксированной запятой для всех ваших переменных и операций, вы можете смоделировать их, проанализировать результаты и выполнить итерацию по ним, чтобы настроить параметры, чтобы свести к минимуму ваши переполнения и ошибки округления. Затем вы можете сгенерировать действительно целочисленный C-код, который будет вести себя так же (или очень близко) к вашему поведению MATLAB с фиксированной точкой. Любые различия, которые вы можете увидеть между вашим кодом MATLAB с фиксированной точкой и кодом C с фиксированной точкой, будут в первую очередь связаны с различиями, внесенными вашим целевым компилятором.

Следующая ссылка на записанный веб-семинар по этой теме должна стать хорошим введением в процесс использования Fixed-Point Toolbox: http://www.mathworks.com/wbnr38838

ХТН.

person Arvind-MW    schedule 17.06.2011
comment
Большое спасибо! Есть шанс, что у вас есть точка контакта, по которой я могу связаться с вами, так как кажется, что я работаю с теми же инструментами, с которыми работаете вы? - person NickHalden; 20.06.2011
comment
@JGord, вы можете посмотреть мой профиль, чтобы увидеть мое полное имя. имя. фамилия на mathworks.com — это мой адрес электронной почты. Я работаю в MathWorks и управляю набором инструментов для работы с фиксированной точкой. Я, конечно, могу помочь вам с вашей проблемой. - person Arvind-MW; 24.06.2011

Я могу ответить только на ваш первый вопрос:

C64xx представляет собой 32-битный DSP с фиксированной точкой, но компилятор не будет жаловаться, если вы используете плавающую точку. Результирующий код будет работать нормально, но будет (намного) медленнее, потому что будут эмулироваться операции с плавающей запятой.

C64xx DSP также может выполнять 16-битную фиксированную точку и смешанную 32x16-битную фиксированную точку. Чем меньше типы данных, которые вы используете, тем быстрее будет работать результирующий код.

person Nils Pipenbrinck    schedule 13.06.2011
comment
+1. Одна придирка, хотя это правда, что он становится намного быстрее, когда вы переходите от 32-битных к 16-битным операциям, но переход от 16-битного к 8-битному не ускоряет его. - person Jim Clay; 13.06.2011
comment
Спасибо, Нильс и Джим. Почему не Джим? Кроме того, я понимаю, что вы, вероятно, не сможете ответить на этот вопрос, но есть идеи, если намного медленнее лишить возможности выполнять обработку в реальном времени? Как вы можете сказать, я действительно новичок во всей этой DSP. Раньше делал только простые 8-битные микрочипы. - person NickHalden; 13.06.2011
comment
C64xx имеет множество инструкций с фиксированной точкой, но все они принимают либо 32-битные, либо 16-битные входные данные (хотя есть исключения для особых случаев). Снижение до 8 бит, скорее всего, не даст вам больше скорости. Вместо этого компилятор выберет 16-битную инструкцию с фиксированной точкой. Выигрыш невелик, но точность потеряна. - person Nils Pipenbrinck; 14.06.2011
comment
А, понял. Я собирался просмотреть набор инструкций, но документация TI настолько обширна, что я еще не добрался до нее. Это причина, по которой ты имел в виду Джима? - person NickHalden; 14.06.2011