当前位置: 首页 > news >正文

log2对数三阶多项式近似计算

目录

0. 目标?

1. 核心数学公式

2. 为什么要算 log₂(f),f ∈ [1,2)?

3. 变量替换:d = f - 1

4. 三阶多项式拟合公式(工程标准)

5. 系数转 Q8 定点(对应你代码的 369、185、85)

6. 归一化 f(代码最关键一步)

7. d 的计算(Q8)

8. 三阶多项式计算

9. 最终结果合并

10. 原理总结

11. 原理 → 代码 逐行对应表

12. 为什么三阶精度最高?


0. 目标?

目标:y = log₂(x) × 256(Q8 定点数)x 范围:1 ~ 32768

为什么 ×256?

因为嵌入式不能用浮点数,所以把小数放大 256 倍变成整数运算,这叫Q8 定点格式


1. 核心数学公式

任何 x 都可以写成:其中:

  • k = 整数(0~15)
  • f ∈ [1, 2)

两边取 log₂:

化简:

结论

  • k 很容易算(找最高位)
  • f 永远落在 [1,2)
  • 我们只需要算log₂(f),再 +k 就是最终结果

2. 为什么要算 log₂(f),f ∈ [1,2)?

因为:

  • log₂(f) 是一条平滑曲线
  • 单片机不能直接算
  • 多项式拟合曲线,就能用整数乘法算出高精度近似值

3. 变量替换:d = f - 1

因为 f ∈ [1,2)令:d=f−1则:d∈[0,1)

我们要拟合:log2​(1+d)


4. 三阶多项式拟合公式(工程标准)

log₂(1+d) 的三阶泰勒展开(最佳近似):


5. 系数转 Q8 定点(对应你代码的 369、185、85)

因为我们用 Q8 格式(×256):

  • 1.4427 × 256 ≈369
  • 0.7213 × 256 ≈185
  • 0.3333 × 256 ≈85

所以代码里的多项式变成:


6. 归一化 f(代码最关键一步)

我们需要把 x 映射到 f ∈ [1,2),并转 Q8:

移位实现(永不溢出、永不负数):

uint32_t f_q8 = ((uint32_t)x << 8) >> k;

这行代码完美支持 x=1~32768,包括 <256 的值。


7. d 的计算(Q8)

d=fq8​−256因为 f ∈ [1,2)所以:d ∈ [0, 255](无符号,完美!)


8. 三阶多项式计算

uint32_t d = f_q8 - 256; uint32_t d2 = (d * d) >> 8; uint32_t d3 = (d2 * d) >> 8; uint32_t term1 = (d * 369) >> 8; uint32_t term2 = (d2 * 185) >> 8; uint32_t term3 = (d3 * 85) >> 8; uint32_t logf_q8 = term1 - term2 + term3;

这就是在算:


9. 最终结果合并

uint32_t res = ((uint32_t)k << 8) + logf_q8;

10. 原理总结

  1. x = 2ᵏ · f,f ∈ [1,2)
  2. log₂(x) = k + log₂(f)
  3. log₂(f) 用三阶多项式拟合(最精准)
  4. 全部转为 Q8 定点整数运算(无浮点)
  5. 全无符号类型(无溢出、无负数)
  6. 支持 1~32768 全范围正确

11. 原理 → 代码 逐行对应表

原理公式代码
x = 2ᵏ·fk = 最高位
f_q8 = x·256 / 2ᵏ((uint32_t)x <<8) >>k
d = f-1d = f_q8 -256
log₂(1+d) ≈1.4427d -0.7213d² +0.3333d³term1 - term2 + term3
log₂(x) = k + log₂(f)(k<<8) + logf_q8

12. 为什么三阶精度最高?

  • 一阶(线性):误差大
  • 二阶:误差较小
  • 三阶:误差 < 0.15 LSB(几乎完美)
http://www.jsqmd.com/news/661175/

相关文章:

  • 金仓老旧项目改造-11(大龄程序员vibe编程学习之路,实况记录)
  • G-Helper深度解析:华硕笔记本性能控制的轻量级革命
  • 2025届毕业生推荐的十大AI学术助手解析与推荐
  • AutoDesktop:桌面隐身衣仅40K的图标消失神器
  • 数学分析基础:从实数公理到确界原理的习题精解
  • 1270万毕业生何去何从:AI时代就业困局与破局之道
  • 不只是看波形:手把手教你用Verdi的fsdbreport命令提取信号数据到文本文件
  • TMSpeech:三步快速掌握Windows本地实时语音识别工具终极指南
  • 【智能代码生成与成本分析双引擎】:20年架构师亲授如何用AI降本37%并规避技术债黑洞
  • 7步科学配置Stretchly:打造个性化数字健康工作流
  • 从“包租婆“到世界贸易巨头:一场豪赌背后的机会与隐忧
  • 小爱音箱智能音乐播放系统:开源音乐管理终极解决方案
  • Triplet Loss训练慢、不收敛?可能是你的‘三元组’没挖好!附TensorFlow 2.x采样策略优化实战
  • 深圳携程卡回收平台参考榜单 - 京顺回收
  • 解决 VS Code C++ 代码红波浪线问题
  • 用Waymo数据集复现3D检测Baseline:手把手教你跑通PointPillars(附Colab代码)
  • HFSS新手避坑指南:手把手教你从零搭建Vivaldi天线(附完整参数与函数曲线设置)
  • 《LTX-2.3-22B 蒸馏版一键部署整合包深度实测:低成本实现高质量“图片变视频”与批量工作流》
  • GHelper终极指南:华硕笔记本性能控制工具从零到精通
  • 麻将AI助手Akagi:从菜鸟到高手的智能成长伙伴
  • U-Boot安全启动避坑指南:当booti遇上FIT验签,如何绕过原生限制?
  • 2026护网HVV面试题|覆盖9套真题+实战考点,看这一篇直接上岸
  • 最笨的抉择:雨中狂奔3小时与放弃高薪的学徒 - RF_RACER
  • Hermes Agent vs OpenClaw:新一代开源AI智能体谁是最终赢家?
  • 范德蒙德卷积
  • Claude Code 不只是会写代码:这 10 个 Skills,才是效率分水岭
  • 2026年可靠的汽车贴膜品牌推荐,选哪家让你不再纠结 - 工业品牌热点
  • Topit效率神器:3分钟掌握macOS窗口管理,让多任务处理效率飙升300%
  • 从分段求和到周期补偿:解析|cosx|积分的通用表达式
  • 光猫改桥接后IPTV还能用吗?天津联通创维DT541-csf实战解析