2012-03-27 7 views
3

Я работаю над приложением, которое воспроизводит аудио и требует обработки в реальном времени (БПФ и спектр гармонических продуктов) этих данных.Производительность анализа частоты Java

Мне нужно использовать частоту дискретизации 44100 Гц и требуется частотное разрешение 0,5 Гц, то есть мне нужно 88200 выборок pre-FFT. Это занимает около 2 секунд для захвата, так как в два раза больше частоты дискретизации; однако после первого образца я значительно улучшаю ситуацию, используя круговой буфер для выборки и читаю только половину от количества выборок.

К сожалению, производительность по-прежнему довольно низкая, и есть довольно много задержек. Это большая проблема, так как приложение должно своевременно реагировать на ввод, поскольку это происходит.

Есть ли у кого-нибудь предложения, как я могу улучшить производительность этого? Я думаю, что основная проблема заключается в требовании для больших образцов, и было бы хорошо, если бы я мог уменьшить количество звука, прочитанного при сохранении той же точности. Может быть, это поможет?

EDIT

Если это помогает знать, что я пытаюсь сделать оценку F0 в режиме реального времени от электрического гитарного входа, наряду с оценкой многократным F0 для согласования аккордов. У меня есть способы сделать это, чтобы работать и быть довольно точным, но это для проекта uni, и у меня нет достаточно времени, чтобы взглянуть слишком далеко на другие методы, кроме FFT. На самом деле, я просто надеюсь на какой-то способ ускорить процесс отбора проб.

+0

Возможно ли улучшить уровень параллелизма? Напр. разделите файл на более мелкие куски (для запуска 2 куска) и запустите образец под разными потоками? Если у вас нет зависимости от аппаратного обеспечения (управляемая процессором и не звуковой картой), я думаю, что этот подход с разделением и покорением может помочь. – questzen

ответ

1

Поскольку вам нужно сначала записать 2s аудио, это установит нижнюю границу латентности. Даже при 50% перекрытии вы все равно будете иметь минимальную задержку в 1 секунду. БПФ и другая обработка будут только дополнять это, но, надеюсь, не на значительную сумму (в противном случае используйте более быструю библиотеку FFT). Единственный способ уменьшить эту задержку - это жертвовать частотным разрешением.

+0

Это то, чего я боялся. Я думаю, что некоторые люди пытались использовать какую-то интерполяцию нулей с входом FFT для увеличения разрешения, но при этом использовали меньшее количество выборок. Я мог бы попробовать это и посмотреть, как это работает, но я думаю, что это не будет решением. – nihilo90

+1

Заполнение с нулями не дает вам больше * точности *, он просто интерполирует данные вашей частотной области, чтобы вы получили более явное разрешение, но это действительно просто косметическое - оно не будет разделять пики, которые слишком близко друг к другу, чтобы решить основанный на вашей частоте дискретизации, т. е. вы не можете получать информацию из ниоткуда. Вероятно, это поможет, если вы дадите идею высокого уровня о том, что вы пытаетесь сделать, поскольку могут быть и другие подходы. –

+0

Я редактировал вопрос с дополнительной информацией о моем проекте. И что касается нулевого заполнения, имеет ли это значение, если меня интересует только определенный диапазон частот? Кроме того, было бы уместно усреднить окружающие ячейки для этих интерполированных точек? – nihilo90

1

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

Zero-padding просто даст вам высококачественную интерполяцию. Но это может обеспечить лучшую оценку частоты пиков, чем просто использование центра пикового буфера более короткого БПФ.