2012-01-12 4 views
3

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

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

Канал: Mono

Кодирование: PCM 16 BIT

BufferSize: 4096

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

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

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

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

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

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

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

+0

Вблизи моего вопроса: http://stackoverflow.com/questions/3069617/android-signal-analysis-some-filters –

+0

@ Dan, Хороший вопрос. Я также пытаюсь обработать сигнал в режиме реального времени. Частота выборки и другие входные конфигурации одинаковы. Моя проблема в том, что я слишком долго занимаюсь обработкой входящих образцов, а время между двумя последующими чтениями очень мало. Мне было интересно, есть ли у вас похожие проблемы и как вы решаете это. TIA –

+0

Вы имеете в виду, что ваш расчет занимает слишком много времени, в результате вы не можете завершить процесс в течение двух обратных вызовов? Я считаю, что метод обработки звука не должен занимать слишком много времени, иначе вы не сможете обработать каждый буфер в каждом обратном вызове. Кроме того, NEW так же, как объект, который вы можете. Таким образом, вы можете исключить, что процессор продолжает обрабатывать процессы управления памятью. – Dan

ответ

0

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

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

Смежные вопросы