我有一份8k16bit pcm音频,想将其上采样为16k16bit。我需要手动完成此操作。
有人能告诉我线性插值的算法吗?我应该在每两个字节之间进行插值吗?
另外,当我进行上采样时,我必须对wav头文件进行更改 - 我应该改变什么?
我有一份8k16bit pcm音频,想将其上采样为16k16bit。我需要手动完成此操作。
有人能告诉我线性插值的算法吗?我应该在每两个字节之间进行插值吗?
另外,当我进行上采样时,我必须对wav头文件进行更改 - 我应该改变什么?
正如其他人所提到的,线性插值并不能提供最佳的音频质量,但它简单而且成本较低。
对于每个新创建的样本,只需与下一个样本取平均值,例如:
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或类似的工具来完成这个任务。
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怎么做。
关于标题我不确定,但是我会建议你研究一下三次样条插值。你可以看看this website。它有一种非常简洁的方法来执行三次插值。我不确定如何修改标题,但我相信在 Stack Overflow 上已经有了相关的答案,你可以搜索一下。