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

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

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

最佳答案

我们假设数据是一系列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上已经处理了好几次了。

关于c - 调整PCM阵列的大小而无需重新采样,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31204494/

10-13 08:27