反向插值

时间:2013-10-13 19:05:52

标签: audio core-audio interpolation linear-interpolation

我有一个实现音频流的类,可以以不同的速度读取(包括反向和快速变化/“刮擦”)...我对读取部分使用线性插值,一切都很正常..

但是现在我想以不同的速度实现对流的写入,这需要我实现一种“反向插值”,即减少输入样本矢量Z,用矢量Y插值将产生输出X(我正在写这个... ..

我已经设法以恒定的速度进行操作,但是对于不同的速度(例如加速或减速)的推广被证明更复杂。

我想这个问题已经反复解决了,但我似乎无法在网上找到很多线索,所以我的具体问题是,如果有人听说过这个问题,可以指出我正确的方向(或者更好,给我一个解决方案:)

谢谢!

1 个答案:

答案 0 :(得分:0)

我不会称之为“反向插值”,因为它不存在(我首先想到的是你在谈论外推!)。你正在做的只是插值,只是速度不均匀。

插值:在已知值之间找到一个值 外推:找到超出已知值的值

插入/来自恒定速率确实比“在已知值之间找到值”的通用任务简单得多。我提出了2个解决方案。

1)插值到一个明显更高的速率,然后只是子样本到最近的一个(尝试添加抖动)

2)解决一般问题:对于每个点,您需要使用相邻的N个点,并为它们拟合N-1个多项式。

  • N = 2将是线性的并且会添加泛音(C0连续性)
  • N = 3可能会让您在源样本之间的中间位置发生阶段性变化(可能比N = 2更糟糕!)
  • N = 4将获得C1连续性(当您更改为下一个样本时,斜率将匹配),对您的应用来说足够了。

让我解释一下。

对于每个输出样本,使用前2个和后2个输入样本。在单位时间刻度上将它们称为S0到S3(稍后乘以采样周期),然后从0到1进行插值.Y是输出,Y'是斜率。

Y将根据此多项式及其差分(斜率)计算

    Y(t) = At^3 + Bt^2 + Ct + D
    Y'(t) = 3At^2 + 2Bt + C

约束(两侧端点的值和斜率)

    Y(0) = S1
    Y'(0) = (S2-S0)/2
    Y(1) = S2
    Y'(1) = (S3-S1)/2

扩展多项式

    Y(0) = D
    Y'(0) = C
    Y(1) = A+B+C+D
    Y'(1) = 3A+2B+C

插入样本

    D = S1
    C = (S2-S0)/2
    A + B = S2 - C - D
    3A+2B = (S3-S1)/2 - C

最后2个是易于解决的方程组。从第二个减去第一个的第二个。

    3A+2B - 2(A+B)= (S3-S1)/2 - C - 2(S2 - C - D)
    A             = (S3-S1)/2 + C - 2(S2 - D)

然后B是

    B = S2 - A - C - D

一旦你有了A,B,C和D,你就可以在多项式中输入一个时间't'来找到已知样本之间的样本值。

对每个输出样本重复一次,如果下一个输出样本仍在相同的2个输入样本之间,则重复使用A,B,C和D.每次计算t与Bresenham的线算法类似,每次你只是推进不同的数量。