我从网络接收采样率为8 kHz且长度为320的PCM字节数组。
现在我想将数组的长度调整为2 n ,即256或512,同时将采样率保持在8 kHz。
有谁知道算法可以做到这一点吗?
答案 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上处理过。