如何解决给定最大误差的分段多项式阶数和结数+位置优化
我正在尝试使用一组分段多项式来近似数字滤波器脉冲响应:
- segment(knot) 的数量是整个区间 [0,1) 上的一个自由参数。从问题规模的角度来看,我期望大约有 256 到 1024 个分段,以便进行很好的近似。
- 节点位置必须落在区间 [0,1] 上的 2 的整数网格上,以便于多项式选择的硬件实现。
- 每个段的多项式阶数可以不同,越低越好。已知最大阶数(可以设置为 2 或 3)。
- 只要遵守 (2),每个段的长度不需要相等。
例如,[0,1/256) 上的线性段,然后是 [1/256,22/256) 上的三阶段,然后是 [22/256,1) 上的二阶段就可以了。
目标是最小化段数及其顺序的某种组合,以降低整体计算/内存成本(权衡待定义),而拟合曲线和理想值之间的均方或最大误差低于给定价值。
我知道我可以蛮力搜索整个空间,并为每个允许的段计算每个允许的多项式阶数的最大误差。然后我可以通过遍历这个大表来“构建”最终的分段曲线 - 尽管我不完全确定如何准确地完成最终的构建。
我想知道这是否不是算法已经存在的“已知”类型的问题。欢迎任何评论!
解决方法
您可以尝试 Ramer–Douglas–Peucker algorithm 的变体。这是一种易于实现的简化折线的算法。在您的上下文中,折线是网格点处的过滤器曲线样本,该算法证明最大误差小于某个阈值。
如果您需要平滑的曲线,您可以修改算法以实现二次样条插值而不是折线近似(对应于线性样条插值)以及类似的三次样条用于二阶连续性。在每次迭代中,将最远的样本点添加到插值点集并重新计算插值样条。
一个稍微不同的替代方法是使用 least-square approximating spline 而不是插值样条。每次迭代都会在距离最远的网格点添加一个新的结,但曲线不需要通过它。
这种方法虽然简单,但可以满足您的大部分要求,并在实践中取得不错的效果。 但是,它可能无法给出理论上的最优解(虽然我目前没有反例)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。