2013-10-26 3 views
2

Я взял на себя поддержку приложения 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 также является короткой []. Любые мысли о том, что происходит не так?

+1

Это особенно громоздкий и недостижимый бит кода. То, что это, безусловно, не кажется [передискретизацией путем прореживания] (http://www.dspguru.com/dsp/faqs/multirate/resampling), который является ортодоксальным способом достижения этого преобразования. Если там есть LPF, это довольно дрянной. Я очень сомневаюсь, что результаты звучат неплохо. Для этого почти наверняка должна быть поддержка библиотеки в Android, а не сворачивать самостоятельно. – marko

+0

Android имеет библиотечную поддержку от Honeycomb и далее, но, к сожалению, мне нужно Gingerbread для этого приложения. Я буду работать над повторной выборкой по алгоритму прореживания, чтобы заменить тот, который есть сейчас. – mjsalinger

ответ

1

«Внезапный звук» и «медленнее, чем ожидалось, звук» создается вне этого алгоритма.

Алгоритм обрабатывает точно 882 входных выборки и производит 160 выходных выборок. Таким образом, перед каждым вызовом downSample() вы должны заполнить this.readBuffer ровно 882 новыми короткими значениями, а после возврата из downSample() вы должны конкатенировать полученные 160 коротких значений с уже обработанными образцами.

Интегрированный фильтр нижних частот - это просто усреднение по 5 или 6 входным отсчетам, поэтому вы не можете избавиться от всех псевдонимов, но, с другой стороны, это не самое медленное решение проблемы понижающего дискретизации ,

+0

Спасибо, что помогло локализовать мою проблему. – mjsalinger