我有一个实现音频流的类,它可以以不同的速度读取(包括反向和快速变化/“抓取”).我用线性插值来表示读的部分,所有的东西都工作得很好。
但是现在我也想实现对流的不同速度的写入,这就要求我实现一种“反向插值”,即推导输入样本向量Z,用向量Y插值得到输出X(我正在写)。
我设法做到了恒定的速度,但概括不同的速度(例如加速或减速)是更复杂的。
我想这个问题已经多次解决了,但我似乎在网上找不到多少线索,所以我的具体问题是,是否有人听说过这个问题,并能指出正确的方向(或者,更好的是,给我一个解决方案:)
谢谢!
发布于 2013-12-16 09:33:26
我不称它为“反向插值”,因为它不存在(我的第一个想法是你在说外推法!)你所做的仍然是简单的插值,只是在一个不平衡的速度。
内插:在已知值之间求值--外推:找到超过已知值的值
与“在已知值之间找到一个值”的一般要求相比,对固定速率的插值确实要简单得多。我提出了两个解决方案。
1)插值速度要高得多,然后将子样本插入到最近的样本(尝试添加抖动)。
2)解决泛型问题:对于每个点,需要使用相邻的N个点,并对其拟合一个阶N-1多项式。
让我解释一下最后一个。
对于每个输出样本,使用前面的两个输入样本和下面的两个输入样本。在单位时间尺度上将它们称为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最后两个是一个很容易解的方程组。从第二个中减去第一个。
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‘来在你的已知样本之间找到一个样本值。
对每个输出样本重复使用A、B、C&D,如果下一个输出样本仍然在相同的两个输入样本之间。每次计算t与Bresenham的线算法相似,每次都是不同的推进量。
https://stackoverflow.com/questions/19349093
复制相似问题