Я использую 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 вопроса:
- Является ли начальный bufferSize равным буферамчто я могу прочитать из метода .read?
- Является ли ограничение 40-60 мс для захвата аудиоданных с частотой дискретизации 44100?
- Не могли бы вы предложить какую-нибудь библиотеку FFT, чтобы я мог лучшепроизводительность в обработке БПФ?(Я думаю, что лучше использовать библиотеку кода C?)
Извините за мой плохой английский, также спасибо, что потратили время на мой вопрос.
PS Я попробовал этона iOS, и это может просто взять 512 выборок с частотой дискретизации 44100.Таким образом, каждый обратный вызов занимает всего около 10 мс.