【发布时间】: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