将 24 位二进制补码转换为 float_32t

Convert 24bit Two's Complement to float_32t

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

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

谁能告诉我 float32_t 到底是什么?此外,关于将 24 位二进制补码转换为 float32_t ?

的任何想法 我会继续调查遗嘱编辑这个 post 如果我有任何新的:-)


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

谢谢和问候!

Float32_t是标准的IEEE 32位浮点标准,是几个ARM所支持的硬件浮点单元的基础(如float64_t)CPU s.

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

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

通常最明显的解决方案也是最好的。如果我必须对一个 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)——单词 "performance" 和 "software floating-point 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 个单周期指令。任务完成!


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

  • 可靠正确。
  • 优化得很好。
  • 与计算本身的开销相比,完全迷失在噪音中。