0

我编写了一个代码来计算 C 中 FFT 的旋转因子。现在,我想将它从浮点转换为定点,以便我可以在 DSP 处理器上对其进行测试。我想分别计算旋转因子,例如:

1) Cos(2*pi*k/N)-jSin(2*pi*k/N) 其中 k 从 0..N/3-1 开始,N =1536。

我怎样才能得到定点的答案(比如说 Q15 格式)

4

1 回答 1

1

Q15 数字有 15 个小数位。最有可能的是,它具有额外的位,即整数位或符号位。(从上下文或问题中未提供的其他文档中可以看出这一点。)让我们假设附加位是一个整数位,并且该值是无符号的。

如果 16 位在解释为无符号整数时具有值 x,则在解释为 Q15 时它们具有值 x/2 15 。显然,要将 Q15 值 x/2 15转换为整数值 x,您只需乘以 2 15即可。

因此,给定某个值 y,它可能是您的旋转因子之一的余弦或正弦,您可以通过乘以 2 15将其转换为将存储在 16 位中的整数,就像代码一样y*32768,并从浮点数转整数。但是,从浮点到整数的转换会向零截断,因此 33.9 变为 33。如果改为四舍五入到最接近的整数,通常误差较小。您可以使用nearbyint(y*32768).

有一些问题:

  • 如果您的 Q15 是无符号的,则不能表示负值,但某些旋转因子是负的。
  • 如果你的 Q15 是有符号的,估计它没有整数位,所以它可以表示的最大值是 32767/32768。但是,有些旋转因子是 +1 或 –1,因此无法表示。可能有办法通过特别处理这些旋转因素来解决这个问题。
  • 可以想象,您的 Q15 使用 32767 作为比例而不是 32768,因为这将允许它被签名并处理 +1 和 –1。我认为这并不常见,但我提到它是因为以上都不是完全令人满意的。在这种情况下,您将在转换中使用 32767 代替 32768。(像素强度通常以这种方式存储;它们的缩放值范围从 0 到 255 以表示从 0 到 1 的强度。)
于 2013-05-17T12:19:00.590 回答