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

时间:2016-05-26 18:23:44

标签: arm data-conversion cmsis

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

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

谁能告诉我究竟是什么float32_t?另外,有关将24位二进制补码转换为float32_t的想法吗? 如果我有新的话,我会继续调查遗嘱编辑这篇文章:-)

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

谢谢&问候!

2 个答案:

答案 0 :(得分:2)

通常最明显的解决方案也是最好的。如果我必须对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和关键时序,我会安全地假设你的micro有一个带有硬件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库的转换实现将是:

  • 可靠地纠正。
  • 非常优化。
  • 与计算本身的开销相比,完全失去了噪音。

答案 1 :(得分:1)

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

有1位符号(位31),8位指数和23位尾数: https://www.nativescript.org/blog/details/first-steps-in-game-dev-with-nativescript

如果您的CPU包含硬件浮点,则可以直接使用这些指令将32位整数转换为32位浮点(VCVT指令)。