【问题标题】:Explanation of Interpolate Hermite methodInterpolate Hermite 方法的解释
【发布时间】:2011-07-20 10:38:09
【问题描述】:

我目前是got this bounty running on how to resample audio data with the intention of increasing the pitch

已经制定了许多解决方案,我不得不承认我对选择和信息感到有些不知所措。

我被定向到this solution 并找到了这段代码:

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;
}

这看起来很简单,我可以绕圈子,但我想知道如何输入我想要增加音高的数量。这导致我提出以下问题:

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

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

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

非常感谢。

【问题讨论】:

    标签: audio signal-processing interpolation


    【解决方案1】:

    Interpolation 是一种在离散值之间查找新数据点的方法。

    上图显示了五个值。 X0、X1、X2、X3、X4。这五个点的值是已知的。中间值是未知的,只能通过从已知数据点进行插值来近似。 不同的插值算法会给出不同的结果。

    例如,要找到红点的值(显示在 X1 和 X2 值之间),我们可以使用插值。 t 指定您要查找的点。 t 将始终是介于 0 和 1 之间的值。在这种情况下,t 将约为 0.25。

    最简单的插值方法是线性插值。它本质上与在两点之间画一条直线相同。

    Linear Interpolation
    y = x1 + (x2 - x1) * t
    

    三次插值和埃尔米特插值的功能类似于线性插值,只是它们使用更多数据点来计算曲线而不是直线。

    要了解这些函数的作用,在图形应用程序中绘制函数可能会有所帮助。

    回答您的问题:

    1. t 与音高无关。它指定插值算法将为其计算值的中间点的位置。

    2. 不适用。

    3. 这些函数计算离散点之间的值。它们本身不会音调移位音频,但它们可以在算法中使用。

    【讨论】:

      【解决方案2】:

      这些函数执行以下操作:给定一个离散的样本序列,在它们之间进行平滑插值。也就是说:假设您的原始数据是 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

      【讨论】:

      • 比我自己说的要好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多