下采样PCM音频44100至8000

时间:2013-10-26 12:09:56

标签: java android audio downsampling

我接管了一个Android应用程序,该应用程序使用44100,16位单声道的AudioRecord录制音频源。我需要将其下采样到8000.当前的应用程序中有一个缩减采样算法,我不确定它是否正常工作。当另一个应用程序(黑盒子)接收到它时,音频播放但背景中有一个响亮的嗡嗡声,并且比预期的音频慢。传送到接收应用程序的正确格式的其他音频收到罚款,没有任何问题。

此处列出了我所拥有的算法(我怀疑它最初是根据变量名从某处反编译的代码)。

private void downSample() {
    int v5 = 0;
    int v4 = 0;
    int v2;
    for (v2 = 0; v2 < 0xA0; ++v2) {
        v5 += 0xD755;
        int v6 = v5 / 0x2710;
        v5 -= v6 * 0x2710;
        double v0 = 0;
        int v3 = v4;
        v4 += v6;
        while (v3 < v4) {
            v0 += ((double) ((((float) this.readBuffer[v3])) * this.volume));
            ++v3;
        }

        v0 /= ((double) v6);
        if (32767 < v0) {
            v0 = 32767;
        }
        else if (-32768 > v0) {
            v0 = -32768;
        }

        this.downSampledBuffer[v2] = ((short) (((int) v0)));
    }
}

readBuffer是一个由记录源填充的short []。 downSampledBuffer也是一个short []。什么出错了?

1 个答案:

答案 0 :(得分:1)

此算法之外会产生“嗡嗡声”和“比预期音频慢”。

该算法准确处理882个输入样本并生成160个输出样本。因此,在每次调用downSample()之前,您必须使用882个新的短值填充this.readBuffer,并且在从downSample()返回后,您必须将生成的160个短值连接到已处理的样本。

集成的低通“滤波器”只是对5或6个输入样本进行简单平均,因此您无法摆脱所有混叠,但另一方面,它不是下采样问题的最慢解决方案。