Arm 转换24位2';浮点数的s补码

Arm 转换24位2';浮点数的s补码,arm,data-conversion,cmsis,Arm,Data Conversion,Cmsis,我有一个非常具体的问题。 ADC在两个补码中为我提供24位数据点。通常我将它们存储到32位int(twos补码)(从int的MSB开始复制它们,然后将它们向LSB移动8位以保持前导的1或0) 现在我想使用ARM处理器上的CMSIS-DSP库进行FFT变换。FFT需要32_t输入。我从来没有听说过数据格式,也找不到任何关于它是否有固定浮点或任何东西的具体来源 谁能告诉我它到底是什么?另外,关于将24位2的补码转换为float32\u t有什么想法吗? 我会继续调查,如果我有什么新消息,我会编辑这篇

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

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

谁能告诉我它到底是什么?另外,关于将24位2的补码转换为float32\u t有什么想法吗?

我会继续调查,如果我有什么新消息,我会编辑这篇文章:-)


如果有人感兴趣:
ADC是最重要的 可以找到CMISI-DSP库
该链接直接指向我要使用的方法(arm\u rfft\u f32())。由于我只是想使用旧版本的库,所以该方法已被标记为不推荐使用


谢谢和问候

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

有1位符号(第31位)、8位指数和23位尾数:


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

通常,最明显的解决方案也会带来最好的结果。如果我必须对一个24位数字进行符号扩展,并将其转换为浮点类型,我会从以下内容开始:

//见Dric512的答案;我碰巧知道我的编译器的ABI实现
//具有适当IEEE 754单精度格式的“浮点”
typedef float float 32_t;
float32_t conv_func(无符号整数int24){
返回(int)(int24>8;
}
既然你提到了CMSIS和临界时间,我就可以放心地假设你的micro有一个Cortex-M4(或者可能是Cortex-M7)和一个硬件FPU,上面写着“性能”和“软件浮点FFT”非常可笑的是,既然现在是21世纪,你使用的是一个相当不错的优化编译器,所以我就这样编译了上面的内容:

$arm-none-eabi-gcc -c -Os -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb float.c
并从中得出结论(为了清晰起见,添加了评论):

好吧,这看起来已经是最佳的代码了——任何手动的位旋转都不可能打败仅仅2条单周期指令。完成了


如果您碰巧没有FPU而陷入困境,那么答案的基本点保持不变-让编译器/库来做脏活,因为软fp库的转换实现将是:

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

转到该文档,**单击
float32\u t
**然后您知道它是什么。在同一个文件中,有一个
void arm\u q31\u to\u float(q31\u t*pSrc、float32\u t*pDst、uint32\u t blockSize)
。从定点到浮点,您只需将其提升为浮点值,然后用一个常数比率进行除法/乘法,该常数比率的值取决于您希望转换的浮点值在什么范围内。@Chuchaki我不完全理解这个问题,但看起来范围可能更适合不同的值。或者,您可以ant希望找到更好的方法来提高问题的可视性。嘿,谢谢你的快速回答。文档中只写了“typedef float 32_t”。没有进一步的信息。我不知道Q31格式的详细信息。但是“反向工程”我的下一个想法是使用函数和学习Q31。由于时间非常关键,我想使用位运算,而不是类型转换或除法。我想知道“数据”从哪里结束,尾数从哪里开始。这样我就可以“放”他们身上的碎片place@MrD:基本上,我正在寻找一种方法,使用位操作在24位二进制补码到浮点运算之间进行类型转换。嘿!我只使用M3,我认为它没有浮点“支持”(至少在硬件级别没有).但我同意你的解决方案是最佳的!回答得很好!@Chuchaki幸运的是,这并没有改变我的论点;)
   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)