2

我有 8k16bit pcm 音频,我想将它上采样到 16k16bit。我必须手动执行此操作。

有人能告诉我线性插值的算法吗?我应该在每两个字节之间进行插值吗?

另外,当我进行上采样时,我必须对 wav 标头进行更改 - 我应该更改什么?

4

4 回答 4

7

正如其他人所提到的,线性插值并不能提供最好的音质,但它既简单又便宜。

对于您创建的每个新样本,只需将其与下一个样本进行平均,例如

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 或类似的工具来执行此操作。

于 2011-03-24T00:12:50.803 回答
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。

于 2011-03-23T16:55:06.310 回答
1

这是在 java 中使用 WAV 文件的一个很好的链接:

http://www.labbookpages.co.uk/audio/javaWavFiles.html

于 2011-03-24T01:33:04.497 回答
0

不确定标题,但我会研究三次样条插值。你可以看看这个网站。它有一种非常巧妙的方法来执行三次插值。我不确定如何修改标题,但我很确定在 Stack Overflow 上已经找到了您可以搜索的答案。

于 2011-03-23T15:48:51.817 回答