为什么嵌入式使用 q15 而不是标准 int16

why use q15 over standard int16 for embedded

我正在查看 ARM CMSIS DSP 库,想知道在 q15 1to-1 范围内运行与保持在标准 int16 范围 32kto-32k 相比是否有速度优势。

你问,

I'm looking at the ARM CMSIS DSP Library and wondering if there is an advantage speed wise to operating in the q15 1to-1 range vs staying in the standard int16 range 32kto-32k.

由于 CMSIS DSP 似乎不提供仅在 Q15 数据或 int16_t 数据上运行不同的函数变体,我带你询问为什么 API 按原样设计,特别是关于处理速度是否是一个因素。

当然,除了对浮点数据进行操作的变体之外,处理速度是提供对定点数据进行操作的变体的一个因素,但是没有理由认为使用 Q15 数据的计算会比 int16_t 数据的计算速度更快。我倾向于认为 Q15 的优点是 -1 ... 1 感知范围简化了缩放逻辑。此外,-1 ... 1 或它的正半部分是许多重要函数的自然范围,例如正弦函数、余弦函数和高斯函数。

1 * 1 = 1.

32k * 32k > 32k.

Q15 乘法的结果保证适合 Q15。这使得它在 DSP 中非常方便,在 DSP 中必须快速对数字数组进行乘法和求和。

抱歉,介绍很蹩脚,但您的回答取决于数据。如果您使用的是标准化数据(跨越 [-1.0,1.0]),请务必坚持使用 q15 库。在引擎盖下,q15xq15 和 int16xint16 都将执行 16 位 x 16 乘法,得到 32 位值。 如果您使用的是缩放整数(q15),则结果将位于 32 位结果的高 16 位中。如果您使用整数并且生成的容器只有 16 位,则您必须担心检测到溢出。 如果您进行并排测试,我希望库性能会相似,主要关注的是溢出检测。
如果这是用于向量或信号处理操作,而您无法使用 32 位值,请使用定点 (q15)。我参与的项目中人们尝试使用 16 位整数实现 Q15,但他们不断引入意外的数学错误。