Как настроить Android AudioRecord, чтобы у меня была низкая задержка, но большой размер выборки для моего БПФ?

Итак, у меня есть AudioRecord, настроенный на работу с FFT для определения частот для определения нот.

Во время настройки прошу

AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat)

Затем у меня есть несколько операторов if, которые устанавливают следующую большую степень двойки. Для моего телефона это обычно 2048 (2 ^ 11). Цель состоит в том, чтобы следующее, что я выполняю, было БПФ, для которого алгоритму требуется длина буфера, равная степени двойки.

Поправьте меня, если я ошибаюсь, но у меня сложилось впечатление, что причина, по которой вы находите минимальный размер буфера, заключается в том, что это уменьшит задержку.

Все было хорошо, пока я не прочитал, что для точного определения конкретных нот, особенно тех, которые имеют более низкую частоту, у вас должен быть больший размер выборки для подачи на БПФ; Желательно, чтобы размер выборки превышал 16 384 (2^14).

Я предполагаю, что вопрос, который у меня есть. Когда я создаю AudioRecord:

AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
                  rate, channelConfig, audioFormat, bufferSize1);

могу ли я использовать один размер буфера, меньший для меньшей задержки, чем при чтении буфера:

AudioRecord().read(thisbuffer, 0, bufferSize2);

использовать другой размер буфера большей длины перед отправкой в ​​БПФ? Или есть лучший способ сделать это?


person mkrinblk    schedule 26.03.2015    source источник


Ответы (1)


Во-первых, БПФ — плохой выбор для определения «ноты», так как для музыкальных нот обычно требуется оценить высоту тона, а не спектральную частоту, что является двумя совершенно разными вещами из-за психоакустики.

Для оконного БПФ спектральная частота наиболее точно определяется в середине окна БПФ. Таким образом, использование более длинного БПФ, даже если они повторяются с перекрытием после очень короткого размера входного буфера, приведет к задержке порядка половины длины БПФ.

Но более частое повторение БПФ (путем их перекрытия после короткой задержки входного буфера) даст вам лучшее временное разрешение, если не более быструю задержку. Для реальной более низкой задержки вам нужно использовать более короткое БПФ и потерять разрешение по частоте или использовать другую оценку частоты или основного тона, которая также будет иметь другие компромиссы между временем, частотой и устойчивостью.

person hotpaw2    schedule 26.03.2015
comment
Спасибо за ответ. Я знаю, что в какой-то момент у меня была причина придерживаться FFT, а не других. По ходу проекта я начал забывать, что это было за причина. После всех проблем, которые он вызвал, возможно, пришло время бросить его и найти библиотеку. - person mkrinblk; 26.03.2015