gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:09:29 26 4
gpt4 key购买 nike

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

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

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

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


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

谢谢并问候!

最佳答案

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

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

关于arm - 将 24 位二进制补码转换为 float_32t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37468430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com