Шумоподавление звука в реальном времени с использованием БПФ на Android

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

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


person Nothing More    schedule 13.05.2013    source источник
comment
БПФ означает «быстрое преобразование Фурье», поэтому по определению это должен быть один из ваших более быстрых вариантов. Один из способов сделать это быстрее — уменьшить размер БПФ, хотя это также снижает качество.   -  person David K    schedule 13.05.2013


Ответы (1)


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

Я не думаю, что кто-то может ответить на этот вопрос простым да или нет. Вам придется попробовать и посмотреть, что можно сделать.

Во-первых, существует множество реализаций БПФ, в том числе FFTW, с разной скоростью, которую вы можете попробовать. Некоторые из них быстрее, чем другие, но в конце концов все они будут давать сопоставимые результаты.

Это то место, где родной C/C++ превзойдет код Java/Dalvik, потому что он действительно может использовать преимущества векторного кода. Чтобы это работало, вам, вероятно, потребуется написать какой-нибудь ассемблер или найти код, который уже оптимизирован для Android. Я не знаю об оптимизированном для Android БПФ, но я уверен, что он существует.

Реальный выигрыш в производительности будет зависеть от того, как вы структурируете свой общий алгоритм шумоподавления. Все шумоподавление, с которым я знаком, чрезвычайно интенсивно использует процессор и, вероятно, не будет работать на телефоне в режиме реального времени, хотя может на планшете. Однако это всего лишь (образованное) предположение.

person Bjorn Roche    schedule 13.05.2013