我有8k16bit pcm音频,我想将其上采样到16k16bit。我必须手动完成。
有人可以告诉我线性插值的算法吗?我应该在每两个字节之间进行插值吗?
此外,当我进行上采样时,我必须对wav标题进行更改 - 我应该更改什么?
答案 0 :(得分:6)
正如其他人所说,线性插值不能提供最佳的音质,但它简单又便宜。
对于您创建的每个新样本,只需将其与下一个样本进行平均,例如
short[] source = ...;
short[] result = new short[source.length * 2];
for(int i = 0; i < source.length; ++i) {
result[i * 2] = source[i];
result[i * 2 + 1] = (source[i] + source[i + 1]) / 2;
}
你一定要搜索一个可以帮助你处理WAV文件的库。即使它是一种简单的格式,如果有可用的代码可以满足您的需要,您也不必自己动手。顺便问一下,你为什么要这样做呢?也许你可以使用sox或类似的工具来做到这一点。
答案 1 :(得分:2)
有人可以告诉我线性插值的算法吗?我应该在每两个字节之间进行插值吗?
确定:
double interpolate_linear(double a, double b, double x) {
assert(0.0 <= x);
assert(1.0 >= x);
if (0.0 >= x)
return a;
else if (1.0 <= x)
return b;
else
return (1.0 - x) * a + x * b;
}
线性插值虽然总比没有好,但误差很大。如果你有cpu时间,最好是零填充和窗口。
此外,当我进行上采样时,我必须对wav标题进行更改 - 我应该更改什么?
对java不确定。
答案 2 :(得分:1)
这是在java中使用WAV文件的一个很好的链接:
答案 3 :(得分:0)
不确定标题,但我会研究三次样条插值。你可以看看this website。它有一种非常简洁的方式来执行三次插值。我不确定如何修改标题,但我很确定在Stack Overflow上有可以搜索的答案。