Итак, я пытаюсь создать приложение для Android, которое действует как аудиоанализ в реальном времени как предшественник проекта, который будет включать в себя обнаружение и фильтрацию определенных звуков.Как получить наиболее точные данные о частоте звука, которые можно получить в режиме реального времени в режиме реального времени на Android?
Итак, я думаю, что у меня есть основы дискретных преобразований Фурье, однако я не уверен, какие лучшие параметры должны быть для анализа частоты в реальном времени.
У меня создалось впечатление, что в идеальных ситуациях (неограниченная вычислительная мощность) я бы взял все образцы из потока/100 PCM-потока 44100, который я получаю из класса AudioRecord, и поместил их через окно с окном 44100 элементов fifo "(добавлено до 2 ** 16 с 0 и, возможно, суживающей функцией?), запуская БПФ в окне каждый раз, когда вводится новый образец. Это будет (я думаю), дайте мне спектр для 0 - ~ 22 кГц, обновленный 44100 раз в секунду.
Кажется, что это не произойдет на смартфоне. Дело в том, что я не уверен, какие параметры вычислений я должен уменьшить, чтобы сделать его доступным для моего Galaxy Nexus, сохраняя при этом как можно больше качества. В конце концов я хотел бы использовать внешний микрофон с лучшей чувствительностью.
Я полагаю, что это приведет к перемещению окна более одного образца между выполнением БПФ, но я понятия не имею, в какой момент это становится более пагубным для точности/алиасинга/независимо от того, как делать БПФ на меньшем окне, или если есть третий вариант, который я пропускаю.
С изначально реализованным KissFFT, который я использую из libgdx, я, похоже, могу делать где-то между 30-42 44100 элементами FFT на 44100 выборок и все еще иметь его отзывчивый (что означает, что буфер заполняется из потока выполнение AudioRecord.read() не заполняется быстрее, чем поток, выполняющий fft, может его слить).
Так что мои вопросы:
- Может производительность настоящее время я получаю просто лучшее, что я буду получать? Или похоже, что я должен быть чем-то глупым, потому что возможны гораздо более быстрые скорости?
- Является ли мой подход к этому, по крайней мере, принципиально правильным, или я лаем полностью на неправильное дерево?
Я был бы рад показать любой из моих кодов, если бы это помогло ответить на мои вопросы, но их много, поэтому я решил, что сделаю это выборочно, а не публикую все.
Вы также должны фильтровать свое прямоугольное окно каждый раз с помощью оконной функции, например, окна с укороченным или охапку для лучшей точности. Конечно, это также замедлит внедрение – SztupY
Каковы ваши требования к частотным разрешениям? Вы на самом деле сможете отображать 32k выходных выборок, которые вы получаете с вашего 64-битного FFT за один раз? Я спрашиваю, потому что существует тенденция к тому, что БПФ становятся менее эффективными из-за соображений кеширования, и обычно эта точка составляет около 32 к-64 к на современных процессорах x86, поэтому, вероятно, она намного ниже для телефона или планшета. Таким образом, понижая ваш размер FFT, уменьшая частотное разрешение, вы действительно можете увеличить свою пропускную способность. –
«Самый точный» - это нечто вроде бессмысленного. Вы должны определить свои фактические потребности в точности и сделать временную компромисс. Обработка звука обычно делается больше на блоках, которые намного короче 1000 мс в длину, и, возможно, только от 25% до 50% перекрываются. – hotpaw2