Обработка звука в реальном времени в Android - PullRequest
3 голосов
/ 12 января 2012

Я использую AudioRecord.read для записи данных PCM в байты.Однако я обнаружил, что он ограничен инициализацией объекта AudioRecord, по крайней мере, с 3904 буферами.Где частота выборки составляет 44100. Поскольку мне нужно выполнить БПФ данных, я увеличил выборки до 4096. В результате обратный вызов выполняется каждые 40-60 мс с setPositionNotificationPeriod до 500. Поскольку дальнейшее уменьшение длительности не делаетлюбые изменения.Я удивляюсь, если это самое быстрое время обратного вызова с настройкой ниже?

Частота дискретизации: 44100

Канал: Mono

Кодировка: PCM 16 BIT

BufferSize: 4096

(я не уверен, что это 4096 или 2048, поскольку я читаю 4096 байт каждый раз, и он может заполнять только 2048 2-байтовый буфер)

даже 40-60 мс приемлемо, язатем выполнить БПФ, которое в конечном итоге блокирует каждый обратный вызов около 200-300 мс.И все еще есть много шума, влияющего на точность.Я использую следующий исходный код: БПФ в Java и Сложный класс

Есть ли другой выбор, который выполняет быструю, надежную и потребляющую меньше памяти обработку БПФ?Я обнаружил, что вышеперечисленные классы создают слишком много объектов и всплывают сообщения о сборке мусора.

В заключение у меня есть 3 вопроса:

  1. Является ли начальный bufferSize равным буферамчто я могу прочитать из метода .read?
  2. Является ли ограничение 40-60 мс для захвата аудиоданных с частотой дискретизации 44100?
  3. Не могли бы вы предложить какую-нибудь библиотеку FFT, чтобы я мог лучшепроизводительность в обработке БПФ?(Я думаю, что лучше использовать библиотеку кода C?)

Извините за мой плохой английский, также спасибо, что потратили время на мой вопрос.

PS Я попробовал этона iOS, и это может просто взять 512 выборок с частотой дискретизации 44100.Таким образом, каждый обратный вызов занимает всего около 10 мс.

1 Ответ

0 голосов
/ 02 июня 2012

Относительно вопроса № 3: Может быть, не так быстро, как нативная библиотека, но я начал использовать эти классы, и они, кажется, подходят для работы в реальном времени (хотя я читаю из файлов, а не из микрофона): FFTPack .

Наиболее распространенная встроенная библиотека - KissFFT, которую вы можете найти скомпилированной для Android как часть libGDX .

...