调整PCM阵列的大小而不重新采样

时间:2015-07-03 10:25:40

标签: c audio pcm

我从网络接收采样率为8 kHz且长度为320的PCM字节数组。

现在我想将数组的长度调整为2 n ,即256或512,同时将采样率保持在8 kHz。

有谁知道算法可以做到这一点吗?

1 个答案:

答案 0 :(得分:0)

假设数据是一系列PCM值,范围从-1到1.(对于16位编码,声音值实际上可能是-32768到32767,或者是Short的范围。 )

数组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);
}

为了进行线性插值,假设incr * 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上处理过。