Производительность анализа частоты Java - PullRequest
3 голосов
/ 27 марта 2012

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

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

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

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

EDIT

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

Ответы [ 2 ]

1 голос
/ 27 марта 2012

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

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

1 голос
/ 27 марта 2012

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

...