CMSIS-DSP 库中 Q15 这种类型的定点数

虽然 SensorTile 拥有 FPU 加速浮点运算,但由于传感器输出的数据不是浮点数,我还是作死地想用 DSP 的定点数试一试。
定点数有许多种标准。CMSIS-DSP 库使用的定点数类型为 Q 型(也叫 Qm.n),这是一个很方便能够直接用于传感器数据的定点数类型。网络上资料不好找,但是在 Wikipedia 也有一些信息: Q (number format)

Q7, Q15, Q31 ……都是什么玩意儿?

Qm.n 表示一个占用 (m+n) 比特的Q型定点数。

简单地理解就是 Qm.n 能够告诉 DSP 库这个整数和实际数值之间的比值:2 的 n 次方。如果 m=1 可以简写为 Qn,比如 Q1.15 可以简写为 Q15,但是它占用的还是 16bits,也就是2字节。因此,很多地方采用 (signed) short 来表示 Q15,因为只需要除以一个常数(见下文),就可以得到对应的浮点数了,超方便。

在 CMSIS-DSP 常用的是 Q15,Q31等等,分别表示除以 32768,除以 2147483648 就可以得到实际的浮点数。
反之,乘以这个倍数,然后取整,就可以得到 Q15、Q31格式的表示。

Q型定点数的取值范围

这就引入了一个问题:数值范围。大家都知道一个 signed short 范围是 –32,768 到 32,767,除以那个比例关系(32768),则可得知:一个 Q15 表示的实数范围是 [-1, 1.99997]
如果遇到 FFT 这种一言不合就10的N次方数量级的算法, Q15 表示范围太小显然不够使用!!那么怎么办?


不要忘记 Q15 只是 Q1.15 的简写。我们还有:

  • Q2.14,比例系数16384,表示范围大约是 [-2, 2)
  • Q3.13,比例系数8192,表示范围大约是 [-4, 4)
  • Q4.12,比例系数4096,表示范围大约是 [-8, 8)
  • Q5.11,比例系数2048,表示范围大约是 [-16, 16)
  • ……




因此,有一个很重要的坑就是:在 CMSIS-DSP 库的定点数 FFT 中,你输入一堆 Q15 的数据,出来的数据格式不是 Q15,而且还和数据长度有关系!

以下是定点数 FFT 的输入-输出数据格式对照表,要点是前三列。第四列表示比例系数被缩小了 2 的多少次方倍:



iFFT 运算也会变类型(虽然感觉这个表格有点问题)……这是在定点数的游戏规则下不得已的办法。




在CMSIS-DSP中与浮点数型互相转换


前面第二节已经说过如何与浮点数互相转换了:除以/乘以比例系数即可。简单地手写一个循环即可。如果想要偷懒, CMSIS-DSP 也有对应的函数,比如:
arm_float_to_q31(float *src, short *dst, int count) 可以转换浮点数组为 Q31 数组。

更多偷懒函数可以在 https://www.keil.com/pack/doc/CMSIS/DSP/html/group__groupSupport.html 查到。

在Qt中使用CMSIS-DSP库,可以通过以下步骤进行配置和集成: 1. 下载CMSIS-DSP库:从ARM官方网站上下载CMSIS-DSP库的压缩包,并解压到本地目录。 2. 创建Qt项目:在Qt Creator中创建一个新的Qt项目。 3. 将CMSIS-DSP库添加到项目中:将CMSIS-DSP库中的头文件(.h文件)和源文件(.c文件)添加到Qt项目中。可以在Qt Creator中的项目资源管理器中右键点击项目名称,选择"添加现有文件",并选择CMSIS-DSP库的头文件和源文件。 4. 在.pro文件中添加相关配置:在Qt项目的.pro文件中添加必要的配置,以链接CMSIS-DSP库。例如,可以使用类似以下的语句: ``` INCLUDEPATH += /path/to/cmsis_dsp_library LIBS += -L/path/to/cmsis_dsp_library -larm_cortexM4lf_math ``` 这里的 "/path/to/cmsis_dsp_library" 是CMSIS-DSP库的路径,根据实际情况进行替换。 5. 在Qt代码中使用CMSIS-DSP函数:在Qt项目的代码中,包括所需的头文件,并使用CMSIS-DSP库提供的函数进行信号处理、滤波、FFT等数字信号处理任务。 需要注意的是,CMSIS-DSP库是为ARM Cortex-M处理器优化的。在使用CMSIS-DSP库时,需要确保目标平台与库所针对的处理器兼容。 以上是使用CMSIS-DSP库的基本步骤,具体的集成过程可能会因项目和平台的不同而有所变化。建议参考CMSIS-DSP库的官方文档和Qt的相关文档,以便更详细地了解如何在Qt中使用CMSIS-DSP库。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值