我试图沿其轮廓提取脉冲的曲率(见下图)。脉冲在长度和高度的网格上计算:使用有限差分,在C ++中实现150 x 100个单元格。
我提取了所有具有相同值(轮廓/水平集)的点,并将它们标记为下图中的红色实线。其他颜色可以忽略不计。
然后我试图通过以下方法从这已经很嘈杂(由于网格离散化)轮廓线找到曲率:
(移动平均线已经应用)
1)通过切线的曲率
P点处的线的曲率由下式定义:
因此,曲率是P和N之间的角度增量的角度δ的石灰。由于我的点之间有一定的距离,我无法对石灰进行足够的近似,因此曲率计算不正确。我用圆圈测试它,它自然地具有恒定的曲率。但我无法重现这一点(只有1位有效数字是正确的)。
2)由arclength参数化的线的二阶导数
我计算了关于arclength的线的一阶导数,用移动平均线平滑,然后再次得到导数(二阶导数)。但在这里我也只有1个有效数字正确。 不幸的是,采用衍生工具将已经固有的噪声倍增到更高的水平。
3)用圆圈局部逼近线
由于圆半径的倒数是曲率,我使用了以下方法:
到目前为止效果最好(2位正确的有效数字),但我需要进一步改进。所以我的新想法如下:
我不想使用离散点处的值来确定曲率,而是想用三维样条曲面逼近脉冲轮廓。然后我从中提取某个值的水平集,以获得平滑的点线,我可以从中找到一个很好的曲率。
到目前为止,我找不到可以生成这样的Bezier样条曲面的C ++库。你能指点我吗?
你是否认为这种方法值得一试,或者我的曲率会失去太多精确度?
你知道其他任何方法吗?
非常友好的问候, 扬
编辑:我似乎无法以新用户的身份发布图片,所以我从我的问题中删除了所有图片,即使我发现它们很重要,可以解释我的问题。有什么办法我还可以给他们看吗?
edit2:好的,完成了:)
答案 0 :(得分:1)
ALGLIB支持各种插值:
- 多项式插值
- 有理插值
- 样条插值
- 最小二乘拟合(线性/非线性)
- 双线性和双三次样条插值
- 快速RBF插值/拟合
我不知道它是否符合您的所有要求。我个人还没有使用过这个库,但我相信三维样条插值可能是你想要的(两次可微分)。
为了防止过度拟合您的嘈杂输入点,您应该应用某种平滑机制,例如:你可以尝试移动窗口平均/高斯/ FIR滤波器之类的东西。还可以看一下(Cubic)Smoothing Splines。