2011-04-20 41 views
1

好的,这是一些数学和DSP问题。使用不同的值增加音频音高

让我们说我有20,000个样本,我想以不同的音高重新采样。例如,正常速率是正常速率的两倍。使用Interpolate cubic method found here我会通过迭代中的i变量乘以新音高来设置我的新数组索引值(在本例中为2.0)。这也会使我的新样本数量达到10,000。由于插值速度加倍,所以只需要一半的时间来完成。

但是如果我想让我的音高在整个录音过程中发生变化呢?基本上我希望它从正常速度慢慢地增加到8倍(10,000个样本标记),然后回到1.0。这将是一个弧。我的问题是这样的:

如何计算最终音轨有多少个采样?

如何创建间距值,将代表这增加,从1.0到8.0回到1.0

你要知道这是不是实况音频输出数组,但转化录制的声音。我主要在C工作,但我不知道这是否相关。

我知道这可能是复杂的,所以请随时要求澄清。

回答

3

为了表示的增加为1.0〜8.0和背面,则可以使用这种形式的函数:

f(x) = 1 + 7/2*(1 - cos(2*pi*x/y)) 

哪里y是样品在所得轨迹的数目。

它将从x=0的1开始,x=y/2增加到8,然后在x=y减小到1。

这里是什么样子的y=10plot 1 + 7/2*(1 - cos(2*pi*x/10)) from 0 to 10

现在我们需要找到y价值取决于z,原来样本数(20,000这种情况,而是让我们的是一般)。为此,我们解决integral 1+7/2 (1-cos(2 pi x/y)) dx from 0 to y = z。解决方案是y = 2*z/9 = z/4.5,很好,很简单:)

因此,对于20,000个样本的输入,您将在输出中获得4,444个样本。

最后,而不是由音调值的输出索引相乘,就可以访问原始样本是这样的:output[i] = input[g(i)],其中g是积分上述功能f的:

g(x) = (9*x)/2-(7*y*sin((2*pi*x)/y))/(4*pi) 

对于y=4444,它看起来是这样的:

plot (9*x)/2-(7*4444*sin((2*pi*x)/4444))/(4*pi) from 0 to 4444

+0

不管你选择什么功能,我认为尼古拉斯是正确的计算新的长度。取从0到原始样本数的音高积分,然后除以样本数。 – AShelly 2011-04-20 20:08:13

+0

这个解决方案的问题在于,当你遍历数组(乘以音高)时,你会超过原始音频缓冲区中的样本总数。我确信基于这个想法可以找出一些东西,但是我不明白。 – 2011-04-21 10:03:08

+0

@Eric - 你说得对,我编辑过。 – NicolasP 2011-04-21 19:47:40

1

为了不与结果走样结束了,你还需要低通滤波器在插值之前或插值过程中,使用可变转换频率低于局部采样率一半的滤波器或固定截止频率比当前采样率低16倍(对于8倍峰值音高增加)。这将需要比三次样条更复杂的插补器。为了获得最佳结果,您可能需要尝试使用可变宽度窗口化的sinc内核插值器。