2015-07-03 70 views
0

我從網絡接收採樣率爲8 kHz,長度爲320的PCM字節數組。調整PCM陣列的大小而不重新採樣

現在我想調整陣列的長度爲2 n,即256或512,同時保持採樣率爲8 kHz。

有誰知道算法可以做到這一點?

+1

只是砍數組。 – jaket

+0

當你調整大小,你只是想增加沉默,或者你想擴展聲音以適應? –

+0

@Phil Freihofner:我想適應新的尺寸,而不是添加沉默。 – monkid

回答

0

我們假設數據是一系列PCM值,範圍從-1到1.(對於16位編碼,聲音值實際上可能是-32768到32767,或者是短的範圍。)

數組A具有數據,數組B是目的地。 如果則爲a.length = 320,和b.length個= 256,則以下應該工作:

float incr = B.length/(float) A.length; 
for (int i = 0; i < 256; i++) { 
    B[i] = linearInterpolation(A, incr * i); 
} 

要執行線性內插,讓我們說增量* I [0.8 * 3]計算的一些值以n之間和n + 1,例如2.4(在2和3之間)。首先,獲得小數部分(0.4):

fract = i * incr - (int)(i * incr); 

然後計算如下:

return ((A[n] * (1 - fract)) + (A[n+1] * (fract)))/2; 

您可能需要解碼從字節編碼/爲PCM。這是一個單獨的問題,但它已在StackOverflow上多次處理。

+0

對不起,我的愚蠢。在這種情況下incr = 0.8,如何從n = 2得到值2.75,並且n = i?謝謝。 – monkid

+0

抱歉沒有保持示例一致。我編輯了我的答案,以便incr將成爲從您的示例中導出的實際值。我希望讓事情更清楚! –