2011-03-22 54 views
2

我目前有got this bounty running on how to resample audio data with the intention of increasing the pitch插值Hermite方法的說明

已經有很多解決方案,我不得不承認我對選擇和信息感到有點不知所措。

我是針對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; 
} 

這看起來似乎很簡單,我可以繞到我的頭,但我想知道我怎麼輸入量我想通過增加我的音調。這使我對以下幾個問題:

  1. 第一種方法的T-參數取0和1之間的數字。這是我提高了音調的因素是什麼?這會使1增加100%的間距(基本上是速度的兩倍)?

  2. 如果上述理論是正確的,我可以輸入一個多於1的因子嗎?如果沒有,我將如何能夠做到這一點?

  3. 如果說明上述內容,我已經清楚地表明我完全偏離軌道,有人請幫助clairfy如何使用此方法控制音高增加量?

非常感謝。

回答

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 = 0,其中n = (n + 1),x(n + 2)和tn。看看它聽起來如何:-)。

+0

比我自己能說的更好。 – I82Much 2011-03-22 12:25:23

1

Diagram to illustrate interpolation

Interpolation是尋找離散值之間的新的數據點的方法。

上圖顯示了五個值。 X0,X1,X2,X3,X4。這五點的數值是已知的。中間值不知道,只能通過從已知數據點進行插值來近似。 不同的插值算法會給出不同的結果。

例如,要找到紅點的值(顯示在X1和X2值之間),我們可以使用插值。 t指定您希望查找的點。 t將始終爲0和1之間的值。在這種情況下,t將近似爲0.25。

最簡單的插值方法是線性插值。這與在兩點之間繪製直線基本相同。

Linear Interpolation 
y = x1 + (x2 - x1) * t 

三次插值和Hermite插值除了它們使用更多的數據點來計算曲線的,而不是直線二者功能與之相似於線性內插。

要了解這些功能在做什麼,可以在圖形應用程序中繪製函數。

回答您的問題:

  1. 牛逼沒有關係球場。它指定插值算法將計算其值的中間點的位置。

  2. 不適用。

  3. 這些函數計算離散點之間的值。他們本身並沒有音高轉換音頻,但他們可以用在算法中。