首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向插补

反向插补
EN

Stack Overflow用户
提问于 2013-10-13 19:05:52
回答 1查看 2.1K关注 0票数 0

我有一个实现音频流的类,它可以以不同的速度读取(包括反向和快速变化/“抓取”).我用线性插值来表示读的部分,所有的东西都工作得很好。

但是现在我也想实现对流的不同速度的写入,这就要求我实现一种“反向插值”,即推导输入样本向量Z,用向量Y插值得到输出X(我正在写)。

我设法做到了恒定的速度,但概括不同的速度(例如加速或减速)是更复杂的。

我想这个问题已经多次解决了,但我似乎在网上找不到多少线索,所以我的具体问题是,是否有人听说过这个问题,并能指出正确的方向(或者,更好的是,给我一个解决方案:)

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-12-16 09:33:26

我不称它为“反向插值”,因为它不存在(我的第一个想法是你在说外推法!)你所做的仍然是简单的插值,只是在一个不平衡的速度。

内插:在已知值之间求值--外推:找到超过已知值的值

与“在已知值之间找到一个值”的一般要求相比,对固定速率的插值确实要简单得多。我提出了两个解决方案。

1)插值速度要高得多,然后将子样本插入到最近的样本(尝试添加抖动)。

2)解决泛型问题:对于每个点,需要使用相邻的N个点,并对其拟合一个阶N-1多项式。

  • N=2将是线性的,并将增加泛音(C0连续性)
  • N=3可能会在源示例之间的中间点给您留下步骤更改(可能比N=2更糟!)
  • N=4将为您提供C1连续性(当您更改到下一个示例时,斜率将匹配),这对于您的应用程序来说肯定足够了。

让我解释一下最后一个。

对于每个输出样本,使用前面的两个输入样本和下面的两个输入样本。在单位时间尺度上将它们称为S0到S3 (乘以之后的样本周期),然后将时间从0插入到1,y是输出,Y‘是斜率。

由这个多项式及其微分(斜率)计算y。

代码语言:javascript
复制
    Y(t) = At^3 + Bt^2 + Ct + D
    Y'(t) = 3At^2 + 2Bt + C

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

代码语言:javascript
复制
    Y(0) = S1
    Y'(0) = (S2-S0)/2
    Y(1) = S2
    Y'(1) = (S3-S1)/2

展开多项式

代码语言:javascript
复制
    Y(0) = D
    Y'(0) = C
    Y(1) = A+B+C+D
    Y'(1) = 3A+2B+C

插入样品

代码语言:javascript
复制
    D = S1
    C = (S2-S0)/2
    A + B = S2 - C - D
    3A+2B = (S3-S1)/2 - C

最后两个是一个很容易解的方程组。从第二个中减去第一个。

代码语言:javascript
复制
    3A+2B - 2(A+B)= (S3-S1)/2 - C - 2(S2 - C - D)
    A             = (S3-S1)/2 + C - 2(S2 - D)

那B是

代码语言:javascript
复制
    B = S2 - A - C - D

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

对每个输出样本重复使用A、B、C&D,如果下一个输出样本仍然在相同的两个输入样本之间。每次计算t与Bresenham的线算法相似,每次都是不同的推进量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19349093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档