2

我有一个非常具体的问题。
ADC 在二进制补码中为我提供 24 位数据点。通常我将它们存储到 32 位 int (二进制补码)中(通过从 int 的 MSB 开始复制它们,然后将它们向 LSB 移动 8 位以保持前导 1 或零)

现在我想使用 CMSIS-DSP 库在 ARM 处理器上进行 FFT 转换。FFT 需要 float32_t 输入。我从未听说过数据格式,也找不到任何关于它是否有固定浮点或任何东西的具体来源......

谁能告诉我 float32_t 到底是什么?另外关于将 24 位二进制补码转换为 float32_t 的任何想法?

如果我有任何新内容,我将继续调查将编辑这篇文章 :-)


如果有人感兴趣:
ADC 是TI-ADS1299
CMISI-DSP 库可以在这里找到。
该链接直接指向我要使用的方法 (arm_rfft_f32 ()) 。由于我只是使用旧版本的库的电缆,因此该方法已被标记为已弃用。

谢谢和问候!

4

2 回答 2

3

通常,最明显的解决方案也是最好的。如果我必须对一个 24 位数字进行符号扩展并将其转换为浮点类型,我将首先编写如下内容:

// See Dric512's answer; I happen to know my compiler's ABI implements 
// 'float' with the appropriate IEEE 754 single-precision format
typedef float float32_t; 

float32_t conv_func(unsigned int int24) {
        return (int)(int24 << 8) >> 8;
}

既然你提到了 CMSIS 和关键时序,我会安全地假设你的微机有一个带有硬件 FPU 的 Cortex-M4(或可能是 Cortex-M7)——“性能”和“软件浮点 FFT”这两个词一起出现非常可笑 - 因为现在是 21 世纪,你正在使用一个半体面的优化编译器,所以我编译了上面的内容:

$arm-none-eabi-gcc -c -Os -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb float.c

并从中得到它(为清楚起见添加了评论):

   0:   f340 0017       sbfx    r0, r0, #0, #24   @ sign-extend 24-bit value from argument
   4:   ee07 0a90       vmov    s15, r0           @ move 32-bit result to FPU register
   8:   eeb8 0ae7       vcvt.f32.s32    s0, s15   @ convert signed int to 32-bit float
   c:   4770            bx      lr                @ return (with final result in FPU)

好吧,这看起来已经是最佳代码了 - 任何手动位旋转都无法击败仅仅 2 个单周期指令。任务完成!


如果你碰巧在没有 FPU 的情况下被卡住,那么答案的基本点保持不变 - 让编译器/库来做脏活,因为 soft-fp 库的转换实现将是:

  • 可靠正确。
  • 优化得很好。
  • 与计算本身的开销相比,完全沉浸在噪音中。
于 2016-05-26T20:25:18.190 回答
2

Float32_t 是标准的 IEEE 32 位浮点标准,它是多个 ARM CPU 支持的硬件浮点单元的基础(如 float64_t)。

有 1 位符号(第 31 位)、8 位指数和 23 位尾数: https ://en.wikipedia.org/wiki/Single-precision_floating-point_format

如果你有一个包含硬件浮点的 CPU,你可以直接使用指令将 32 位整数转换为 32 位浮点(VCVT指令)。

于 2016-05-26T19:53:09.500 回答