我接管了一个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 []。什么出错了?
答案 0 :(得分:1)
此算法之外会产生“嗡嗡声”和“比预期音频慢”。
该算法准确处理882个输入样本并生成160个输出样本。因此,在每次调用downSample()之前,您必须使用882个新的短值填充this.readBuffer,并且在从downSample()返回后,您必须将生成的160个短值连接到已处理的样本。
集成的低通“滤波器”只是对5或6个输入样本进行简单平均,因此您无法摆脱所有混叠,但另一方面,它不是下采样问题的最慢解决方案。