定点数vs浮点数:量化导致陀螺仪数据恶化的原因及配置疑问
量化对陀螺仪数据的影响疑问
我正在开展一项分析量化对姿态估计算法影响的项目。
使用浮点型数据类型时,陀螺仪采集的原始数据如下:
gx=-0.001064650843716541 gy=-0.0042603487041181585 gz=0.0053267448770866945
当我使用sc_fixed < 16,8,SC_TRN,SC_SAT>(分配8位给整数部分,剩余位给小数部分)进行量化后,得到以下结果:
gx=-.00390625 gy=-.0078125 gz=.00390625
我无法理解量化为何会导致这些数值出现如此明显的恶化。我还尝试了以下几种位配置:
sc_fixed < 24,10,SC_TRN,SC_SAT> sc_fixed < 32,10,SC_TRN,SC_SAT> sc_fixed < 32,11,SC_TRN,SC_SAT>
这些配置下的结果虽受量化影响,但远不及使用<16,8>时的程度。
问题根源:小数位宽不足导致精度缺失
你遇到的数值恶化核心原因是位宽分配严重不合理:
- 对于
sc_fixed<16,8,SC_TRN,SC_SAT>,总位宽16位,其中8位分配给整数部分,剩余16-8=8位是小数部分。 - 8位小数能表示的最小精度为
1/(2^8) = 0.00390625,这正好是你量化结果的步长。 - 你的原始陀螺仪数据绝对值都在0.001~0.006之间,在8位小数的精度下,只能被近似到最近的可用刻度值:
gx=-0.00106距离-0.00390625(最小负刻度)更近,截断模式下被近似为该值;gy=-0.00426超过了-0.00390625,被近似到下一个负刻度-0.0078125;gz=0.00532介于0.00390625和0.0078125之间,截断后取较小的0.00390625。
其他配置误差更小的原因
你尝试的几种配置都分配了更多位给小数部分:
sc_fixed<24,10,...>:小数位宽为24-10=14,精度达1/(2^14)=0.000061,远高于原始数据的精度需求;sc_fixed<32,10,...>:小数位宽22,精度约0.000000238,几乎可以忽略量化误差;sc_fixed<32,11,...>:小数位宽21,精度约0.000000477,同样满足高精度需求。
优化建议
针对这类小范围的陀螺仪数据(绝对值远小于1),应减少整数部分的位宽,把更多位资源分配给小数部分:
- 先评估数据范围:陀螺仪角速度通常不会过大,比如±2000°/s转换为弧度约±34.9 rad/s,仅需6位整数位(覆盖±63的范围)即可;
- 调整位宽配置:例如使用
sc_fixed<16,2,SC_TRN,SC_SAT>,整数位2位(覆盖±1范围,足够匹配你的原始数据),小数位14位,精度可达0.000061,能精确表示你的原始陀螺仪数据; - 若需要覆盖更大范围,可适当增加整数位,但优先保证小数位宽满足精度需求。
内容的提问来源于stack exchange,提问作者user3662181
相关产品推荐
相关产品推荐

