2011-04-20 44 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內核插值器。