【问题标题】:Downsample PCM audio 44100 to 8000下采样 PCM 音频 44100 到 8000
【发布时间】:2013-10-26 12:09:55
【问题描述】:

我已经接管了一个 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[]。对出了什么问题有任何想法吗?

【问题讨论】:

  • 那是一段特别糟糕且不可维护的代码。它看起来肯定不是resampling by decimation,这是实现这种转换的正统方式。如果那里有LPF,那是相当糟糕的。我非常怀疑结果听起来不错。几乎可以肯定,Android 中必须为此提供库支持,而不是自行开发。
  • Android 从 Honeycomb 开始就支持库,但不幸的是我需要 Gingerbread 来支持这个应用程序。我将通过抽取算法进行重采样,以替换现有的算法。

标签: java android audio downsampling


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢 - 这有助于解决我的问题。
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2015-03-29
相关资源
最近更新 更多