2016-04-16 2 views
1

На моем mbed LPC1768 У меня есть АЦП на выводе, который при опросе возвращает 16-разрядное короткое число, нормированное на значение с плавающей запятой между 0-1. Document here.Преобразование 32-разрядного числа до 16 бит или менее

Поскольку он преобразует его в число с плавающей запятой, означает ли это его 32-бит? Потому что число у меня есть число до шести знаков после запятой. Data Types here

У меня работает автокорреляция, и я хочу сократить время, необходимое для завершения анализа. Правильно ли, что числа с плавающей запятой 32-битные, и если верно, что умножение двух 32-битных чисел с плавающей запятой займет много времени, чем умножение двух 16-разрядных коротких (недисковых) чисел вместе?

Я работаю с C, чтобы запрограммировать mbed.

Cheers.

+0

Вы уверены, что прочитали это правильно? То, что я вижу, - «Прочитано входное напряжение, представленное как unsigned short в диапазоне [0x0, 0xFFFF]», что кажется довольно ясным. –

+2

'read()' возвращает float, но 'read_u16()' возвращает 16-битное целое число, вы можете выбрать, какой из них вы хотите использовать. – Unimportant

+0

Итак, Read() возвращает 32-битное число с плавающей запятой, а read_u16() вернет 16-разрядное целое число, а 16-разрядное целое будет работать быстрее/выше? – JamesDonnelly

ответ

2

Я должен быть в состоянии прокомментировать это довольно точно. Раньше я занимался обработкой DSP, где мы бы «целочисленный» код, что фактически означало, что мы будем использовать алгоритм сигнала/аудио/видео, и заменим всю логику с плавающей запятой на арифметику с фиксированной точкой (то есть: Q_mn notation, etc).

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

Чип, который вы используете (Cortex M3), не имеет a dedicated hardware-based FPU: он только эмулирует операции с плавающей запятой, поэтому операции с плавающей запятой будут дорогими (потребуется много времени).

В вашем случае вы можете просто прочитать 16-битное значение через read_u16() и сдвинуть значение вправо 4 раза, и все готово. Если вы работаете со звуковыми данными, вы можете рассмотреть looking into companding algorithms (a-law, u-law), что даст лучшую субъективную производительность, чем просто отрубить 4 LSBs, чтобы получить 12-битное число из 16-разрядного номера.

Yes, a float on that system is 32bit, и, вероятно, представлен в IEEE754 format. Умножение пары 32-битных значений по сравнению с парой 16-разрядных значений может очень хорошо занять такое же количество времени, в зависимости от используемого чипа и наличия FPU и ALU. На вашем чипе умножение двух поплавков будет ужасно дорого с точки зрения времени. Кроме того, если вы умножаете два 32-битных целых числа, они могут потенциально переполняться, поэтому есть одна потенциальная причина для логики с плавающей запятой, если вы не хотите внедрять алгоритм с фиксированной точкой.

+1

Спасибо, что зашли так глубоко. Мое понимание заключается в том, что смещение бит вправо делает числа меньшими, но соотношение между числами остается одинаковым (если все смещены). Увеличивает ли битрейт повышение производительности, потому что числа меньше или это незначительно, особенно если вы считаете время, необходимое для корректировки чисел для начала?Cheers – JamesDonnelly

+2

@JamesDonnelly: время, затрачиваемое целыми умножениями, не зависит от значений операндов. Но вам нужно заботиться о переполнении. –

+0

@JamesDonnelly Рад, что это помогло. Не стесняйтесь открывать обсуждение в комментариях, если у вас есть дополнительные вопросы. – DevNull

1

Правильно предположить, что умножение двух 32-разрядных чисел с плавающей запятой займет больше времени, чем умножение двух 16-разрядных коротких значений, если в процессоре нет специального оборудования (блок с плавающей точкой).

+1

это блок с плавающей запятой cortex-m3. m4 имеет некоторую поддержку поплавка. –

Смежные вопросы