我從網絡接收採樣率爲8 kHz,長度爲320的PCM字節數組。調整PCM陣列的大小而不重新採樣
現在我想調整陣列的長度爲2 n,即256或512,同時保持採樣率爲8 kHz。
有誰知道算法可以做到這一點?
我從網絡接收採樣率爲8 kHz,長度爲320的PCM字節數組。調整PCM陣列的大小而不重新採樣
現在我想調整陣列的長度爲2 n,即256或512,同時保持採樣率爲8 kHz。
有誰知道算法可以做到這一點?
我們假設數據是一系列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上多次處理。
對不起,我的愚蠢。在這種情況下incr = 0.8,如何從n = 2得到值2.75,並且n = i?謝謝。 – monkid
抱歉沒有保持示例一致。我編輯了我的答案,以便incr將成爲從您的示例中導出的實際值。我希望讓事情更清楚! –
只是砍數組。 – jaket
當你調整大小,你只是想增加沉默,或者你想擴展聲音以適應? –
@Phil Freihofner:我想適應新的尺寸,而不是添加沉默。 – monkid