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

标签 c optimization floating-point short mbed

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

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

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

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

干杯。

最佳答案

我应该能够很准确地对此发表评论。我曾经做过 DSP 处理工作,我们会在其中“整合”代码,这实际上意味着我们会采用信号/音频/视频算法,并将所有浮点逻辑替换为定点算法(即:Q_mn notation, etc)。

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

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

在您的情况下,您可以通过 read_u16() 读取 16 位值,然后将值右移 4 次,这样就完成了。如果您正在处理音频数据,您可能会考虑 looking into companding algorithms (a-law, u-law) ,这将比简单地砍掉 4 LSBs 提供更好的主观表现从一个 16 位数字中得到一个 12 位数字。

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

关于将 32 位数字转换为 16 位或更少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36664577/

相关文章:

vb.net - 为什么不同的计算机在VB.NET中计算出不同的算术结果?

c - 从 C 中的 stdin 读取某些内容后,如何再次从 stdin 读取一行?

c - 如何在 main 中调用带有 argc 和 argv 的链接列表?

optimization - CAD 中的自动化设计、FEA 中的分析和优化

optimization - 专门针对误报的二元分类目标

java - 我应该使用 javac -O 选项进行优化吗?

C# 比较 float 和 int

c - 多级反馈队列初始化的结构

c - 在 64 位系统上,如何将 int 作为 void * 传递

c - 如何将浮点值准确写入bin文件