有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

上采样的java-PCM算法

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

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

此外,当我向上采样时,我必须更改wav标题-我应该更改什么


共 (4) 个答案

  1. # 1 楼答案

    Can someone tell me the algorithm for linear interpolation? Should I interpolate between each two bytes?

    当然可以:

    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时间,最好将填充和窗口设置为零

    Also when I upsample i have to make changes for the wav header - what should I change?

    不确定是java

  2. # 2 楼答案

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

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

    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或类似的工具来实现这一点

  3. # 3 楼答案

    不确定标题,但我会研究三次样条插值。你可以看看this website。它有一个非常简洁的方法来执行三次插值。我不确定如何修改标题,但我非常确定在堆栈溢出上有答案,您可以搜索