我目前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;
}
这看起来很简单,我可以把头包起来,但我想知道我是如何输入我希望增加音量的数量。这引出了以下问题:
第一种方法的t参数取0到1之间的数字。这是我增加音高的因素吗?这会使1增加100%的音高(基本上是速度的两倍)吗?
如果上述理论是正确的,我能输入超过1的因子吗?如果没有,我怎么能这样做?
如果通过陈述以上内容我已经清楚地表明我完全偏离了轨道会有人请求帮助克制我如何使用这种方法控制音高的增加量?
非常感谢你。
答案 0 :(得分:3)
这些函数执行以下操作:给定离散的样本序列,在它们之间平滑插值。即:假设您的原始数据是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。看看它听起来如何: - )。
答案 1 :(得分:1)
Interpolation是一种在离散值之间查找新数据点的方法。
上图显示了五个值。 X0,X1,X2,X3,X4。这五个点的值是已知的。中间值是未知的,并且只能通过从已知数据点插值来近似。 不同的插值算法会产生不同的结果。
例如,要找到红点的值(显示在X1和X2值之间),我们可以使用插值。 t 指定您要查找的点。 t 始终是介于0和1之间的值。在这种情况下, t 大约为0.25。
最简单的插值方法是线性插值。它与在两点之间画一条直线基本相同。
Linear Interpolation
y = x1 + (x2 - x1) * t
立方插值和Hermite插值的功能与线性插值相似,只是它们使用更多的数据点来计算曲线而不是直线。
要了解这些函数的作用,在图形应用程序中绘制函数可能会有所帮助。
回答你的问题:
t 与投球无关。它指定插值算法将计算值的中间点的位置。
NA。
这些函数计算谨慎点之间的值。他们自己不会调整音频移位音频,但它们可以用在算法中。