3

我正在处理音频数据,所以我的数据集通常在 40000 到 120000 点(1 到 3 秒)左右。目前我正在为某些任务使用线性插值,我想使用三次插值来改善一些结果。

我一直在使用interp1dwithkind='linear'来生成插值函数。这很好用并且非常直观。

但是,当我切换到 时kind='cubic',我的电脑就疯了——内存开始抖动,Emacs 窗口变暗,鼠标指针开始移动非常缓慢,硬盘变得非常活跃。我认为这是因为它使用了大量内存。我被迫(非常缓慢地)打开一个新的终端窗口,运行htop并终止 Python 进程。(我应该提到我正在使用 Linux。)

我对三次插值的理解是一次只需要检查数据集的 5 个点,但也许这是错误的。

无论如何,我怎样才能最轻松地从线性插值切换到三次插值,而不会碰到这个明显的内存使用砖墙?所有示例都interp1d使用很少的数据点,并且文档中的任何地方都没有提到它对于更高阶的性能不佳,所以我不知道接下来要尝试什么。

编辑:我刚试过UnivariateSpline,这几乎就是我要找的。问题是插值不会触及所有数据点。我正在寻找能够生成通过所有数据点的平滑曲线的东西。

Edit2:看起来可能InterpolatedUnivariateSpline就是我要找的东西。

4

1 回答 1

1

我在 ND 插值中遇到了类似的问题。我的解决方案是将数据拆分为域并为每个域构造插值函数。

在您的情况下,您可以将数据拆分为 500 个点,并根据您所在的位置对它们进行插值。

f1 = [0,...495]
f2 = [490,...,990]
f3 = [985,...,1485]
..
.
.
.

等等。

还要确保每个函数的间隔有重叠。在示例中,重叠为 5 个点。我想你必须做一些实验来看看什么是最佳重叠。

我希望这有帮助。

于 2013-12-06T17:24:46.837 回答