插值Hermite方法解释

Eri*_*tto 3 audio interpolation signal-processing

我目前已经获得了关于如何重新采样音频数据以增加音调的赏金

人们已经提出了许多解决方案,但我不得不承认,我对这些选择和信息感到有点不知所措。

我被引导到这个解决方案并找到了这段代码:

public static float InterpolateCubic(float x0, float x1, float x2, float x3, float t)
{
    float a0, a1, a2, a3;
    a0 = x3 - x2 - x0 + x1;
    a1 = x0 - x1 - a0;
    a2 = x2 - x0;
    a3 = x1;
    return (a0 * (t * t * t)) + (a1 * (t * t)) + (a2 * t) + (a3);
}

public static float InterpolateHermite4pt3oX(float x0, float x1, float x2, float x3, float t)
{
    float c0 = x1;
    float c1 = .5F * (x2 - x0);
    float c2 = x0 - (2.5F * x1) + (2 * x2) - (.5F * x3);
    float c3 = (.5F * (x3 - x0)) + (1.5F * (x1 - x2));
    return (((((c3 * t) + c2) * t) + c1) * t) + c0;
}
Run Code Online (Sandbox Code Playgroud)

这看起来很简单,我可以理解,但我想知道如何输入我想要增加音调的数量。这让我产生以下问题:

  1. 第一个方法的 t 参数采用 0 到 1 之间的数字。这是我增加音调的因素吗?这会让 1 的音高增加 %100(基本上是速度的两倍)吗?

  2. 如果上述理论正确,我可以输入大于 1 的因子吗?如果没有,我怎样才能做到这一点?

  3. 如果通过上述说明我已经清楚地表明我完全偏离了轨道,有人可以帮助澄清我如何使用这种方法控制音高的增加量吗?

太感谢了。

Gar*_*han 5

这些函数执行以下操作:给定一个离散的样本序列,在它们之间进行平滑插值。也就是说:假设您的原始数据是 x(0)、x(1)、x(2) 等。您希望(比方说)使其速度提高 1.234 倍。然后您需要样本 x(0)、x(1/1.234)、x(2/1.234)、x(3/1.234) 等。并且您希望这些样本看起来像来自穿过样本的平滑信号的样本你有积分。

这两个函数应按如下方式使用。您想要在 x(n) 和 x(n+1) 之间进行插值。要获取值,您可以调用 x(n+t),并使用参数 x(n-1)、x(n)、x(n+1)、x(n+2) 和 t 来调用它们。当t=0时,你会得到x(n);当 t=1 时,你会得到 x(n+1);你不应该(除了在数据末尾)使用不在 0 和 1 之间的参数。

因此,要加速或减慢信号速度,请按 [整数]/[速度因子] 采样;对于每个时间 t,取 n-1,n,n+1,n+2 使得 n <= t <= n+1,并使用值 x(n-1),x(n),x 调用插值器(n+1),x(n+2) 和 tn。看看听起来如何:-)。