将 32 位数字转换为 16 位或更少

Converting 32-bit number to 16 bits or less

在我的 mbed LPC1768 上,我在一个引脚上有一个 ADC,当轮询时 returns 一个 16 位短数字标准化为 0-1 之间的浮点值。 Document here.

因为它将它转换为浮点数,这是否意味着它是 32 位的?因为我手上的数字是小数点后六位的数字。 Data Types here

我是 运行 自相关,我想减少完成分析所需的时间。 浮点数是 32 位长是否正确,如果是这样,将两个 32 位浮点数相乘将比将两个 16 位短值(非十进制)数相乘花费更长的时间是否正确?

我正在使用 C 语言对 mbed 进行编程。

干杯。

如果处理器中不存在特殊硬件(浮点单元),假设两个 32 位浮点数相乘比两个 16 位短值相乘花费的时间更长是正确的。

我应该可以很准确地评论这个。我曾经在 DSP 处理工作中使用 "integerize" 代码,这实际上意味着我们将采用 signal/audio/video 算法,并将所有浮点逻辑替换为定点运算(即:Q_mn notation, etc).

在大多数现代系统中,与浮点运算相比,使用整数运算通常会获得更好的性能,但代价是您必须编写更复杂的代码。

您使用的芯片(Cortex M3)没有a dedicated hardware-based FPU:它只模拟浮点运算,所以浮点运算会很昂贵(需要很多时间)。

在你的例子中,你可以通过 read_u16() 读取 16 位值,然后将值右移 4 次,就完成了。如果您正在处理音频数据,您可能会考虑 looking into companding algorithms (a-law, u-law), which will give a better subjective performance than simply chopping off the 4 LSBs 从 16 位数字中获取 12 位数字。

Yes, a float on that system is 32bit, and is likely represented in IEEE754 format。将一对 32 位值与一对 16 位值相乘可能会花费相同的时间,具体取决于所使用的芯片以及是否存在 FPU 和 ALU。在你的芯片上,乘以两个浮点数在时间上会非常昂贵。此外,如果将两个 32 位整数相乘,它们可能会溢出,因此如果您不想实现定点算法,则有一个可能的原因是使用浮点逻辑。