Я должен быть в состоянии прокомментировать это довольно точно. Раньше я занимался обработкой 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-битных целых числа, они могут потенциально переполняться, поэтому есть одна потенциальная причина для логики с плавающей запятой, если вы не хотите внедрять алгоритм с фиксированной точкой.
Вы уверены, что прочитали это правильно? То, что я вижу, - «Прочитано входное напряжение, представленное как unsigned short в диапазоне [0x0, 0xFFFF]», что кажется довольно ясным. –
'read()' возвращает float, но 'read_u16()' возвращает 16-битное целое число, вы можете выбрать, какой из них вы хотите использовать. – Unimportant
Итак, Read() возвращает 32-битное число с плавающей запятой, а read_u16() вернет 16-разрядное целое число, а 16-разрядное целое будет работать быстрее/выше? – JamesDonnelly