Сколько БПФ в секунду я могу сделать на своем смартфоне?(для распознавания голоса) - PullRequest
8 голосов
/ 31 октября 2011

Я изучаю распознавание голоса и DSP, и поэтому я хотел бы внедрить в свой смартфон простой анализатор частоты звука (у меня есть iPhone и Samsung Nexus S под управлением Android).Ранее я делал базовый DSP в Matlab.

Насколько я понимаю, мне нужно выполнить БПФ, чтобы получить основные частоты сигнала.

Итак, я хотел бы попробовать микрофон с частотой 44100 Гц.Если я использую скользящее окно с размером выборки 512 с перекрытием 50%, это означает, что мне нужно делать БПФ каждые 256 выборок или 0,00580 секунд.

Эта скорость кажется действительно высокой , особенноесли я программирую на Java для Android.Сможет ли мой смартфон справиться с этой скоростью?Я знаю, что вы можете программировать на C / C ++ на Android, но я бы хотел пока оставить его на Java.

Ответы [ 4 ]

9 голосов
/ 31 октября 2011

Выполнение БПФ от реального к сложному требует ~ 5/2 n lg n операций с плавающей точкой (сложения и умножения).В вашем случае n = 512, поэтому:

flops per fft ~= (5/2) * 512 * 9 = 11520

Таким образом, для 172 операций в секунду требуется около 2 миллионов операций с плавающей запятой в секунду.Это звучит как много, но на самом деле это не так много.Аппаратное обеспечение типичного смартфона класса armv7 способно выполнять сотни миллионов или миллиарды операций с плавающей запятой в секунду.

Обратите внимание, однако, что вам понадобится тщательно написанное высокопроизводительное БПФ;плохо написанные БПФ, как известно, неэффективны.На iPhone вы можете использовать платформу Accelerate (встроенную прямо в ОС и доступную в SDK), которая предоставляет хороший набор функций FFT;Я не уверен, что доступно на Android.

5 голосов
/ 31 октября 2011

Для iPhone платформа Accelerate для iOS может выполнять все указанные вами FFT с использованием порядка 1% времени ЦП (точный процент зависит от модели устройства и типов данных FFT).

Для AndroidВы, возможно, захотите рассмотреть возможность использования собственной библиотеки NDK для численных вычислений, интенсивно использующих процессор.

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

ДОБАВЛЕНО: Эта веб-страница теста Java предполагает, что телефоны Android могут работать в диапазоне от 5 до 50 МФлопс, используя Java для хорошо написанной математической математики.Хорошо написанный FFT должен находиться примерно в одном диапазоне производительности в MFlops.@Stephan Cannon написал, что для вашей спецификации может потребоваться порядка 2 MFlops.

3 голосов
/ 31 октября 2011

Ваше устройство Android сможет справиться с этим нормально. Я написал анализаторы частоты на основе FFT в реальном времени, которые работали на устройствах Windows Mobile несколько лет назад (с использованием чистого C #), и эти устройства имели гораздо худшие процессоры, чем современные устройства Android. Самым дорогим в вычислительном отношении аспектом FFT являются функции триггера, и, поскольку вы используете окно фиксированного размера, вы можете легко заменить вызовы функции триггера предварительно рассчитанной таблицей поиска.

1 голос
/ 15 ноября 2011

Кроме того, вы можете сократить время вычислений, уменьшив частоту дискретизации.Речь не обладает большой энергией выше 8 кГц, поэтому вы можете уменьшить частоту дискретизации до 16 кГц, прежде чем делать какие-либо БПФ, без потери точности.На 16 кГц ваши БПФ будут меньше и тем быстрее.

Википедия утверждает , что 16 кГц - это стандартная частота дискретизации для распознавания речи в настольных приложениях.

(я понимаю, что это не отвечает на вопрос ОП, но ядумаю, что это может быть полезно для него, учитывая его заявление.)

...