Я взял на себя поддержку приложения Android, которое записывает источник звука с использованием AudioRecord в 44100, 16-битном моно. Мне нужно уменьшить его до 8000. В текущем приложении есть алгоритм downsample, в котором я не уверен, что работает правильно. Когда другое приложение (которое является черным ящиком) получает его, звук воспроизводится, но с громким гудящим звуком в фоновом режиме и медленнее, чем ожидалось. Другое аудио в соответствующем формате, переданном в принимающее приложение, получено без проблем.Downsample PCM audio 44100 to 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 - это короткий [], который заполнен источником записи. downSampledBuffer также является короткой []. Любые мысли о том, что происходит не так?
Это особенно громоздкий и недостижимый бит кода. То, что это, безусловно, не кажется [передискретизацией путем прореживания] (http://www.dspguru.com/dsp/faqs/multirate/resampling), который является ортодоксальным способом достижения этого преобразования. Если там есть LPF, это довольно дрянной. Я очень сомневаюсь, что результаты звучат неплохо. Для этого почти наверняка должна быть поддержка библиотеки в Android, а не сворачивать самостоятельно. – marko
Android имеет библиотечную поддержку от Honeycomb и далее, но, к сожалению, мне нужно Gingerbread для этого приложения. Я буду работать над повторной выборкой по алгоритму прореживания, чтобы заменить тот, который есть сейчас. – mjsalinger