我有一个非常具体的问题
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())。由于我只是使用旧版本的库,因此该方法已被标记为已弃用。
谢谢&问候!
答案 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
指令)。